识别antlr4中的左递归

时间:2017-07-06 06:15:24

标签: antlr4

语法(从其手册中复制)报告以下左递归时 我没有评论以下产品:casting_type-> constant_primary

error(119): The following sets of rules are mutually left-recursive [primary, method_call_root, method_call, cast]
  and [casting_type, constant_cast, cast, constant_primary, constant_function_call, function_subroutine_call, primary]
  and [subroutine_call, function_subroutine_call, constant_function_call, constant_primary, method_call, method_call_root, casting_type, primary, constant_cast, cast]

上述错误报告有3套规则。第三组中有两个左递归:

  1. casting_type,constant_primary,constant_cast,casting_type
  2. casting_type,constant_primary,constant_function_call,function_subroutine_call,subroutine_call,method_call,method_call_root,伯,铸造,casting_type
  3. 由于在我对一个作品进行了评论后报告了这个错误,我 我认为在每个集合中至少看到它的名字是合理的(casting_type,constant_primary)。显然是第一集 缺少这两个名称,因此它不能包含递归。第二集(我不能全力以赴 语法在这里因为它太长了)有递归-1和一些额外的名字 这似乎不相关。

    我的问题是:为什么Antlr会打印第一套和第二套规则? 这是antlr中的一个错误(我尝试过4.6和4.7,结果相同),还是暗示了一个问题,我在这些集中缺少一些东西?

    我看到了一个类似的帖子elsewhere,其中报告的名称并未表示递归,但是在更深层次的分析中,在其他地方发现了递归。

1 个答案:

答案 0 :(得分:0)

可能没有人能真正回答你的问题,甚至连ANTLR的作者都没有。对我来说,看起来你得到的后续错误没有多大意义,因为真正的错误使分析变得不可能(或者至少可能导致错误的结论)。当然在ANTLR中也可能存在一个错误,但我建议关注其中一个并修复它(如果你能看到是什么让它们相互保持递归)。也许其他错误会消失,或者你必须再次分析。