解释ANTLR中的IF语句

时间:2010-07-07 16:57:53

标签: antlr

我正在实现类似BASIC的语言,if语句的语法与BASIC几乎相同:

IF a == b THEN
    PRINT "EQUAL"
ELSE
    PRINT "UNEQUAL"
ENDIF

我已经编写了一个语法文件来解析,还有一个树步行器来解释语言:

[Expr.g]
options {
    language=Python;
    output=AST;
    ASTLabelType=CommonTree;
}

tokens {
    BLOCK;
}

block
    : stmt* -> ^(BLOCK stmt*)
    ;

if_stmt
    : 'IF' c=expr 'THEN' t=block ('ELSE' f=block)? 'ENDIF'
        -> ^('IF' $c $t+ ^('ELSE' $f+))
    ;

在AST walker中:

[Walker.g]
options {
    language=Python;
    tokenVocab=Expr;
    ASTLabelType=CommonTree;
}

block
    : ^(BLOCK stmt*)
    ;

stmt
    : ...
    | 'IF' expr t=stmt* 'ELSE' f=stmt*
         {}

现在我可以为我的语言正确生成AST,但我不知道如何处理分支语句。更确切地说,如果if语句中的 expr 为true,我如何避免评估ELSE语句?感谢

1 个答案:

答案 0 :(得分:1)

如果您正在使用Python,那么您应该能够使用lambda表达式 - 而不是在解析器操作中返回一个值,您可以返回一个lambda表达式并仅在必要时对其进行评估。