我在为我的编程语言创建一部分ANTLR语法时遇到了一些困难。
当type声明的第二部分发生时,我得到了错误:
public type
: ID ('.' ID)* ('?')? -> ^(R__Type ID ID* ('?')?)
| '(' type (',' type)* ')' ('?')? -> ^(R__Type type* ('?')?)
;我试着去匹配:
(System.String, System.Int32) (
System.String (工作良好)的行此错误发生在树的上方,并声明:
[fatal] rule statement has non-LL(*) decision due to recursive rule invocations reachable from alts 1,2. Resolve by left-factoring or using syntactic predicates or using backtrack=true option.
我做错了什么?
发布于 2011-11-05 07:19:27
对,我通过编辑处理变量声明的规则,设法在树上稍早地修复了这个问题:
'my' ID (':' type '=' constant | ':' type | '=' constant) -> ^(R__VarDecl ID type? constant?)所以它的工作原理是:
'my' ID
(
':' type ('=' constant)?
| '=' constant
) -> ^(R__VarDecl ID type? constant?)在这里,我从句法谓词的例子中得到了这个想法:
https://wincent.com/wiki/ANTLR_predicates
幸运的是,我最终不需要谓词!
https://stackoverflow.com/questions/8016224
复制相似问题