将歧义语言转换为歧义

时间:2018-10-05 08:20:28

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

我已经完成了一项家庭作业,将以下语法转换为明确的语法。

A --> B
A --> ε
B --> B @ B
B --> STRING
B --> DOUBLE(STRING)

其中A和B是非终结点,STRING和DOUBLE是非终结点。

我可以得出结论,因为可以为字符串构建两个不同的解析树,例如:

STRING @ STRING @ DOUBLE(STRING)

到目前为止,我有:

A --> B | ε
B --> B @ DOUBLE(STRING)
B --> C
C --> C @ STRING | STRING | DOUBLE(STRING)

但是它不是完整的字符串,例如:

STRING @ DOUBLE(STRING)@ STRING

无法创建。我如何将这种语法转换为明确的?

2 个答案:

答案 0 :(得分:0)

STRING @ STRING @ STRING

可能是由于 A⇒B @(B @ B) A⇒(B @ B)@ B 因为

B --> B @ B

解决方案是引入一个新的类似B的非终结子,并用该非终结子替换出现的事件。这引入了不对称性,您会在许多语法中找到它。

很高兴找出剩下的我。

答案 1 :(得分:0)

继续Joop的回答,您可以引入一个新符号D,以消除B --> B @ B周围的歧义:

A --> D
A --> ε
D --> D @ B
D --> B
B --> STRING
B --> DOUBLE(STRING)

通过此更改,该语言中的任何字符串都只能有一棵树。