解释ANTLR中的IF语句
我正在实现一种类似BASIC的语言,if语句的语法与BASIC几乎相同:解释ANTLR中的IF语句,antlr,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
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语句求值?谢谢如果您使用的是Python,那么您应该能够使用lambda表达式--而不是在解析器操作中返回值,您可以返回lambda表达式并仅在必要时对其求值。如果您使用的是Python,那么您应该能够使用lambda表达式--而不是在解析器操作中返回值,您可以返回lambda表达式,并仅在必要时对其求值。@Bart很抱歉,我忘了在此处提交更改。实际上,我先在这里编辑我的问题,然后将其发布到ANTLR邮件列表上,但可能我忘记了应用更改。@Bart很抱歉,我忘了在这里提交更改。事实上,我先在这里编辑了我的问题,然后将其发布在ANTLR邮件列表上,但也许我忘记了应用更改。