Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解释ANTLR中的IF语句_Antlr - Fatal编程技术网

解释ANTLR中的IF语句

解释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

我正在实现一种类似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语句求值?谢谢

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

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

@Bart很抱歉,我忘了在此处提交更改。实际上,我先在这里编辑我的问题,然后将其发布到ANTLR邮件列表上,但可能我忘记了应用更改。@Bart很抱歉,我忘了在这里提交更改。事实上,我先在这里编辑了我的问题,然后将其发布在ANTLR邮件列表上,但也许我忘记了应用更改。