Antlr非LL(*)决定

时间:2011-11-04 22:03:22

标签: parsing antlr grammar

我在为我的编程语言创建部分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.

我做错了什么?

1 个答案:

答案 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

幸运的是,我最终不需要谓词!