Parsing 使用GLR解析器时,将EBNF转换为BNF的正确方法是什么?

Parsing 使用GLR解析器时,将EBNF转换为BNF的正确方法是什么?,parsing,glr,Parsing,Glr,像这样 Goal = Stmt Stmt = "if" "expr" "then" Stmt ("else" Stmt)? Stmt = "S" 我应该把这个换成现金吗 Goal = Stmt X = "else" Stmt Stmt = "if" "expr" "then" Stmt | "if" "expr" "then" Stmt X Stmt = "S" 或 这两个BNF对GLR解析器的意义相同吗 ------------------------附加内容--------------

像这样

Goal = Stmt
Stmt = "if" "expr" "then" Stmt ("else" Stmt)?
Stmt = "S"
我应该把这个换成现金吗

Goal = Stmt
X = "else" Stmt
Stmt = "if" "expr" "then" Stmt | "if" "expr" "then" Stmt X 
Stmt = "S"

这两个BNF对GLR解析器的意义相同吗

------------------------附加内容------------------------------

如果lexes是

"if" "expr" "then" "if" "expr" "then" "S" "else" "S"
GLR解析器应该有两棵树

Goal
    Stmt
        "if"
        "expr"
        "then"
        Stmt
            "if"
            "expr"
            "then"
            Stmt
                "S"
        "else"
        Stmt
            "S"

但是第一个转换的BNF只能得到第一棵树,因为当它遇到
“else”
时,reduce/shift中没有冲突,冲突发生在会议X上

第二个BNF在遇到
“else”
时会发生reduce/shift冲突,因此解析器将拆分为两个线程,以在不同的条件下进行解析


我说得对吗?是否有任何操作,转到表生成器,可以像处理第二个BNF一样处理第一个BNF?

它们是等价的语法,将解析相同的语言

使用X的语法只在一个地方使用X。净效应就好像X的主体在引用X的地方被替换了一样。实际上,拥有X产品将迫使解析器做更多的工作。除非您想将语义操作附加到X的缩减中,否则额外的工作并不能带来任何效率


在某种程度上,一次生成使用这种方法可以使语法更易于维护,这是很有用的。在这种小语法中,我看不出重点。在实际语法中(我们有一个用于IBM COBOL的GLR语法,有5000个产品[怪IBM,不是我们]),这种结构非常有用,额外的解析开销也无关紧要。

我附加了一个示例来解释我为什么感到困惑。我认为这两个BNF不是等价的语法。问题解决了,第一个转换的BNF可以生成第二棵树。仅当生成正确的操作表时。
Goal
    Stmt
        "if"
        "expr"
        "then"
        Stmt
            "if"
            "expr"
            "then"
            Stmt
                "S"
        "else"
        Stmt
            "S"
Goal
    Stmt
        "if"
        "expr"
        "then"
        Stmt
            "if"
            "expr"
            "then"
            Stmt
                "S"
            "else"
             Stmt
                "S"