模棱两可的语法

时间:2013-03-07 17:17:28

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

我正在查看以下语法,我相信第3行的歧义,但不确定。

<SL> → <S>
<SL> → <SL> <S>
<S> → i <B> <S> e <S>
<S> → i <B> <S> 
<S> → x
<S> → y
<B> → 5
<B> → 13

我发现这个字符串xi13yi5xeyx我相信会生成两个不同的解析树,但我不确定我是否做错了。

有人可以验证我的发现吗?

1 个答案:

答案 0 :(得分:5)

是的,你的语法是一个含糊不清的语法! 你没有提到但我认为<SL>是可行的

使用您的语法规则,我们可以绘制多个解析树(两个),以便跟随i5i5yey

       <SL>                              <SL>
        |                                 |  
       <S>                               <S>   
     / /|\ \                            / | \ 
    / / | \ \                          /  |  \
   / /  |  \ \                        /   |   \
  / /   |   \ \                      i   <B>   <S>      
 /  |   |   |  \                          |  / /|\ \     
 i <B> <S>  e  <S>                        5 / / | \ \
   /  / | \     |                          / /  |  \ \  
  /  /  |  \    y                         / /   |   \ \
 5  i  <B> <S>                           /  |   |   |  \  
        |   |                           i  <B> <S>  e  <S> 
        5   y                               |   |       |  
                                            5   y       y   

两个解析树的结构都不同两个语法一个含糊不清的语法!

您可以在图表上方展开以生成树字符串xi13yi5xeyx,(我将此作为练习留给您

重要的是这个语法生成的语言是not ambiguous language。并且可以为这个语法编写一个等效的明确语法,它总是为语法语言中的每个字符串生成唯一的树。

提示:写出明确的语法。

语法与C语言中if loop的语法非常相似(注意if loop具有不同语法的不同语言)。几乎所有的编译器设计书都解决了这个问题 Resolving the General Dangling Else/If-Else Ambiguity

参考: 预订 编译器Aho-Ullman的原理,技术和工具第4.5节在转换和减少分析期间的冲突。