我正在实现类似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语句?感谢
答案 0 :(得分:1)
如果您正在使用Python,那么您应该能够使用lambda表达式 - 而不是在解析器操作中返回一个值,您可以返回一个lambda表达式并仅在必要时对其进行评估。