我正在查看以下语法,我相信第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
我相信会生成两个不同的解析树,但我不确定我是否做错了。
有人可以验证我的发现吗?
答案 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节在转换和减少分析期间的冲突。