1

我有以下正确解析的 if 语句:

ifStatement
    : 'IF' expression 'THEN' statementBlock 
        (options {greedy=true;} 
            : 'ELSE' statementBlock)?

    ;

现在,我想将其解析为 AST。我是这样做的:

ifStatement
    : 'IF'^ expression 'THEN'! statementBlock 
        (options {greedy=true;} 
            : 'ELSE'! statementBlock)?

    ;

添加!and ^,因为->构建指令似乎不起作用。

我的结果是一个有 3 个孩子的 AST:1 是条件,2 和 3 是语句块。else 部分是可选的:如果没有 else,则缺少节点 3。

问题是语句块总是空的。如何解决?

4

1 回答 1

0

以下基本上是我如何实现它。请注意,'IF'、'THEN' 和 'ELSE' 在 'tokens' 部分中声明

ifStatement
:   IF expression THEN ifStat=statementBlock 
    (   ELSE elseStat=statementBlock  ->  ^(IF expression $ifStat $elseStat)
    |                                 ->  ^(IF expression $ifStat)
    )
;

[编辑] 或者你可以更明确这也应该工作

ifStatement
:   IF expression THEN ifStat=statementBlock ELSE elseStat=statementBlock  ->  ^(IF expression $ifStat $elseStat)
|   IF expression THEN ifStat=statementBlock                               ->  ^(IF expression $ifStat)
;
于 2011-03-28T01:44:46.723 回答