2010-12-09 56 views

回答

1

这有点棘手。您可能通过匹配的 “OR链” 之前使用syntactic predicate(LOOK-AHEAD-TOKENS-HERE)=>做到这一点:

expr 
    : (atom '|')=> atom ('|' atom)+ -> ^('|' atom+) 
    | atom 
    ; 

其妥善处理a|b|ca|ba

但是,您可能想要解释您实际尝试解析的语言:可能会有更好(更优雅?)的表达方式。

为什么你不想要在你的第一个图中有一个AST?当根(操作数)只有两个孩子时,评估表达式很容易,对吧?

0
parse : expr EOF -> ^(ROOT expr); 
expr : atom ('|'^ atom)* -> atom+; 
atom : LITERAL | ('('! expr ')'!); 

LITERAL : 'a'..'z'; 
WS  : (' '|'\t'|'\r'|'\n'){Skip();}; 

我认为这将通过添加重写规则来实现,但我现在没有antlrworks,所以我无法确定。但是它很接近,所以给它一些注意事项,并在必要时修改重写语法。

+1

这是行不通的:你不能在规则中将`^`和` - >`混合在一起。如果你从`expr`中删除`^`,它就不能正确解析单个`LITERAL`。尝试一下。 – 2010-12-09 22:07:59

+0

无赖......我刚刚想出了一些类似的东西,``atom('|'atom)* - > ^('|'atom +);`有一个`|`的时候效果很好,但是如果Bart说的话会失败。 – mpen 2010-12-09 22:28:47

相关问题