我在为我的编程语言创建部分ANTLR语法时遇到了一些麻烦。
当type
声明的第二部分发生时,我收到错误:
public type
: ID ('.' ID)* ('?')? -> ^(R__Type ID ID* ('?')?)
| '(' type (',' type)* ')' ('?')? -> ^(R__Type type* ('?')?)
;
我正在尝试匹配:
System.String
这样的行(工作正常)(System.String, System.Int32)
错误发生在树的稍高处,并说明:
[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.
我做错了什么?
答案 0 :(得分:1)
是的,通过编辑处理变量声明的规则,我设法在树上稍早修复了这个问题:
'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
幸运的是,我最终不需要谓词!