Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 如何处理无休止的递归_Parsing_Antlr_Grammar_Antlr3_Xtext - Fatal编程技术网

Parsing 如何处理无休止的递归

Parsing 如何处理无休止的递归,parsing,antlr,grammar,antlr3,xtext,Parsing,Antlr,Grammar,Antlr3,Xtext,让我们以以下示例语法为例: Model: m+=Main* ; Main: "bla" r=Rule1 | Rule3 | Rule2 ; Rule1: i=INT | "key" r=Rule2 ; Rule2: "b" r=Rule3 ; Rule3: "b" (r=Rule1 | r=Rule2) ; 编译此文件时,会收到错误消息: er

让我们以以下示例语法为例:

Model:
    m+=Main*
;

Main:
    "bla" r=Rule1
    | Rule3
    | Rule2
;

    Rule1:
        i=INT
        | "key" r=Rule2
    ;

    Rule2:
        "b" r=Rule3
    ;

    Rule3:
        "b" (r=Rule1 | r=Rule2)
    ;
编译此文件时,会收到错误消息:

error(211): ../org.xtext.example.test/src-gen/org/xtext/example/test/parser/antlr/internal/InternalTest.g:119:1: [fatal] rule ruleMain has non-LL(*) decision due to recursive rule invocations reachable from alts 2,3.  Resolve by left-factoring or using syntactic predicates or using backtrack=true option.
据我所知,这是因为Rule3的ruleCall可以无限长,因为Rule3可以调用Rule2,而Rule2可以再次调用Rule3,以此类推。。。以及规则2的规则调用。 因此,解析器无法为这些无限规则调用创建一个前瞻,在rule Main中,我们要求解析器在这些无限备选方案之间做出决定,但缺少前瞻会导致此错误消息。。。 如果我错了,请纠正我

我的问题是如何解决这个问题? 必须有一种方法来重新构造这种语法,以便解析器能够处理它


向Raven致意如果我看一下你的语法,我会发现你有一个规则2和规则3,可以在一个规则中重构。因为你的规则2和3以b开头。因此,如果您有一个“Rule2:br=Rule1 | Rule2;”,则情况相同。我认为第三条规则是没有必要的。我将重构您的语法,如下所示:

Model:
    m+=Main*
;

Main:
    "bla" r=Rule1
    | Rule2
;

Rule1:
    i=INT
    | "key" r=Rule2
;

Rule2:
    "b" r=(Rule1 | Rule2)
;

你需要像错误消息中建议的那样搜索“左因子分解”。我以为左因子分解只用于删除左递归?不,请参阅以获取灵感。