如果在ANTLR中声明为树表示

时间:2011-03-27 22:21:41

标签: antlr dangling-else

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

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

    ;

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

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

    ;

添加了!^,因为->构建说明似乎无效。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

[edit]或者你可以更明确哪些也应该起作用

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