Redy语法分析--比较运算符(> >= < <= != == )

    xiaoxiao2021-12-14  75

    原文地址: http://blog.chinaunix.net/uid-26750235-id-3147733.html

    比较运算符(< <= != == >= > )

    (compare operator)

    ()比较运算符

    比较运算符属于二元运算符,有6种:< <= != == >= >。他们之间的优先级为:

    比较运算符

    优先级

    < <= >= >

    != ==

    redy中每一个比校运算符在抽象语法树中,都会用一个结点来表示:

    其中:

    结点AstNodeLt表示运算符 < 结点AstNodeLe表示运算符 <= 结点AstNodeGe表示运算符 >= 结点AstNodeGt 表示运算符 > 结点AstNodeEq表示运算符 == 结点AstNodeNe表示运算符 !=

    6个结点都继承AstNodeBinaryExpr,用uml表示为:

    1

    ()实例

    下面来看2个比较表达式相应的语法树

    表达式:1<3!=3>=4==2>3

    2

    表达式:1<3!=3>=4==2>3

    3

    ()执行方法

    AstNodeLt的执行方法:

    代码3.1

    AstNodeLt.execute()     AstNodeLt.b_left.execute() /*执行左结点*/     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/     AstNodeLt.b_right.execute() /*执行右结点*/     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/     ret_value=left_value.lt(right_value) /*调用方法lt*/     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end

    AstNodeLe的执行方法

    代码3.2

    AstNodeLe.execute()     AstNodeLe.b_left.execute() /*执行左结点*/     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/     AstNodeLe.b_right.execute() /*执行右结点*/     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/     ret_value=left_value.le(right_value) /*调用方法le*/     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end

    AstNodeGe的执行方法

    代码3.3

    AstNodeGe.execute()     AstNodeGe.b_left.execute() /*执行左结点*/     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/     AstNodeGe.b_right.execute() /*执行右结点*/     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/     ret_value=left_value.ge(right_value) /*调用方法ge*/     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end

    AstNodeGt的执行方法

    代码3.4

    AstNodeGt.execute()     AstNodeGt.b_left.execute() /*执行左结点*/     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/     AstNodeGt.b_right.execute() /*执行右结点*/     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/     ret_value=left_value.gt(right_value) /*调用方法gt*/     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end

    AstNodeEq的执行方法

    代码3.5

    AstNodeEq.execute()     AstNodeEq.b_left.execute() /*执行左结点*/     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/     AstNodeEq.b_right.execute() /*执行右结点*/     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/     ret_value=left_value.eq(right_value) /*调用方法eq*/     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end

    AstNodeNe的执行方法

    代码3.6

    AstNodeNe.execute()     AstNodeNe.b_left.execute() /*执行左结点*/     left_value=reg0 /*左结点执行后的结果保存在寄存器reg0中*/     AstNodeNe.b_right.execute() /*执行右结点*/     right_value=reg0 /*右执点的执行结果同样也保存在寄存器reg0中*/     ret_value=left_value.ne(right_value) /*调用方法ne*/     reg0=ret_value /*把执行后的结果保存在寄存器reg0中*/ end

    返回文档首页 

    附:  代码下载: git clone git://git.code.sf.net/p/redy/code redy-code

    Ast NodeLe AstNodeLt   AstNodeGe  AstNodeGt  AstNodeEq  AstNodeNe 位于src/syntax/  文件ast_node_binary_expr.h中

    转载请注明原文地址: https://ju.6miu.com/read-969567.html

    最新回复(0)