我有以下正确解析的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。
问题是语句块总是空的。如何解决?
答案 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)
;