效果只有很少的令牌
当你有像这样的语法:效果只有很少的令牌
B: 'a' A 'a'
| 'b' A 'b'
A: 'a' 'a'
| 'a'
的右%“A”的声明引起aa.a不是因为被接受在'。', 和%left'a'之间发生移位而不是减少aa.aa和ba.ab,因为解析总是在点处减少。
这是不是很清楚,我如何找出根本的关联声明具有在令牌(“A”)没有被直接地用作运营商这样的情况下什么样的影响。
为什么你认为LR(1)会更直观?语法不是LR(1),因此任何LR(1)解析器生成器都应该像LALR(1)解析器生成器那样报告移位/减少冲突。
当然,YACC /野牛不是纯LALR(1)解析器生成。如果它通过优先/关联性声明来解决冲突/减少冲突,那么它会抑制警告。尽管如此,这并不能使语法毫不含糊。使用优先声明的(许多)问题之一是它不再清楚你正在解析什么语言。默默地忽略的偏移/减少和静态解决它有利于一个或另一个动作将产生一个分析器,其识别一些上下文无关语言,但它不是由文法描述语言。
都不具有与LALR算法做,虽然。
要回答你的问题:bison/yacc用来解决移位/减少冲突的算法非常简单。
在优先权声明中提到的每个终端都被赋予一个优先值。在同一声明中提到的所有终端具有相同的优先级,并且比先前声明中提到的任何终端具有更高的优先级。
每个生产其最后端具有优先级值被分配相同的优先级值。 (如果生产包括修改器
%prec TERMINAL
,则使用该终端而不是生产中的最后一个终端。如果对于带有某些先行符号的生产存在移位 - 缩减冲突,并且生产和前瞻符号具有优先值,则如果产品的优先级较高或者优先级相等并且优先级由
%left
声明分配,则应用减少。如果先行符号的优先级较高或者优先级相等并且优先级相等并且优先级由%right
声明分配。
Th在它的。请注意,在上述算法中,没有提及操作符,这实际上不是任何形式的LR解析中的概念。
的*语言*是平凡的LR(1),因为它是有限的 - 它仅仅是* *语法是不是LR(1)(它是LR(2)和LALR(3) - 如果你碰巧有这样一台发电机) –
@chris:啊,对。我正在想象一个递归。谢谢。编辑。 – rici
@rici关于2 .: 如果有这样的产品: “X:'y'Z” X的优先级是'y'吗?但如果生产是没有终端的产品是 ?“X:A B”,那么X没有优先权? – user2373145