消除语法歧义

时间:2016-04-24 03:51:47

标签: compiler-construction context-free-grammar ambiguous-grammar

模棱两可的语法:

E - >紫外线| EBE | V | [E]

V - > a | B'/ P>

U - > < | >

B - > ? | ! | @

一些信息:

优先顺序:? < ! < @,一元运算符(<,>)是最高的

二元运算符?,!,@是右关联的。

我的尝试:

E - >紫外线| EBT | V | [E]

T - > ë

V - > a | B'/ P>

U - > < | >

B - > ? | B1

B1 - > ! | B2

B2 - > @

我不确定在转换过程中是否遗漏了一些角落案件。感谢你们是否可以指出一些错误并提供一些提示。

1 个答案:

答案 0 :(得分:0)

E -> UV | EBE | V | [E] V -> a | b U -> < | > B -> ? | ! | @

  

优先顺序:? &LT; ! &LT; @,使用一元运算符(&lt;,&gt;)   最高。

     

二元运算符?,!,@是右关联的。

我对您的优先顺序感到困惑,因为它暗示!的优先级高于>

所以假设这个优先顺序:

a,b,<,>,?,!,@

我要注意,明确的语法都是关于使用中间字符,通常比模糊语法更多,以确保有一个标准的步骤来达到某个终端符号,即每个字符串将具有相同的分析树。最高优先级意味着它是最接近最终非终端到终端符号转换的转换。

我的回答是:

E -> V?E | V!E | V@E | [E] //Right associativity = right recursive V-> <V | >V | E | T | a | b T-> a | b | E

然而,在不知道目标字符串并且接受/不接受的情况下很难知道。