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"