如何使这个 CFG 无冲突?
How to make this CFG conflict free?
所以我有如下语法,符号(a, b, c, d, !):
S → N!
N → aNd | aMd | aNdN | aMdN
M → bM | cM | b | c
本质上'a'和'd'是括号,中间必须包含一个或多个'b'and/or'c'。可以有多个括号,只要它们仍然包含一个或多个 'b' and/or 'c'。必须以 !.
结尾
所以这个语法有效,但我正在努力使其无冲突。冲突与非终结符 N 和 M 都存在,您可以在其中移动和减少相同的字符。我试图通过引入 epsilons 和新的非终端来解决这个问题,但总是有一些阻碍。
Can reduce 'd' and shift 'd' in non terminal N, also shift/reduce 'b'
and 'c' in non terminal M.
从语法派生的字符串示例:
abccdaaccdd!
aaabddd!
aabddaccd!
aabbbddabccbcd!
aacbcdacbdd!
acbbccd!
我认为我的语法没有歧义,因为我没有发现任何错误?
我怎样才能消除这种冲突?
谢谢!
你试过把规则中的bM换成Mb吗?
所以我有如下语法,符号(a, b, c, d, !):
S → N!
N → aNd | aMd | aNdN | aMdN
M → bM | cM | b | c
本质上'a'和'd'是括号,中间必须包含一个或多个'b'and/or'c'。可以有多个括号,只要它们仍然包含一个或多个 'b' and/or 'c'。必须以 !.
结尾所以这个语法有效,但我正在努力使其无冲突。冲突与非终结符 N 和 M 都存在,您可以在其中移动和减少相同的字符。我试图通过引入 epsilons 和新的非终端来解决这个问题,但总是有一些阻碍。
Can reduce 'd' and shift 'd' in non terminal N, also shift/reduce 'b' and 'c' in non terminal M.
从语法派生的字符串示例:
abccdaaccdd!
aaabddd!
aabddaccd!
aabbbddabccbcd!
aacbcdacbdd!
acbbccd!
我认为我的语法没有歧义,因为我没有发现任何错误?
我怎样才能消除这种冲突?
谢谢!
你试过把规则中的bM换成Mb吗?