在Java.g中,我们可以找到以下规则(为清晰起见,删除了空格):
statement
: block
| ('assert') expression (':' expression)? ';'
| 'assert' expression (':' expression)? ';'
| 'if' parExpression statement ('else' statement)?
(...)
;
我有两个问题:
先谢谢。
答案 0 :(得分:1)
Pedro F.写道:
真的需要两个'断言'子规则吗?
不,他们是等同的。但是,通过查看语法Java.g的格式:
statement
: block
| ('assert'
)
expression (':' expression)? ';'
| 'assert' expression (':' expression)? ';'
| ...
我怀疑(通过查看空白区域)语法最初嵌入了代码:
statement
: block { /* embedded code */
}
| ('assert' { /* embedded code */ }
)
expression (':' expression)? ';'
| 'assert' expression (':' expression)? ';'
| ...
并且可能剥夺了更多的规则/令牌(当然,所有的猜测!)。
Pedro F.写道:
如果没有,为什么ANTLR不抱怨含糊不清,因为它们似乎定义了完全相同的输入?
因为全局回溯(选项中的backtrack=true;
)已启用。