我发现在为该语言构建语法时遇到困难,尤其是对于线性语法。
谁能给我一些基本的技巧/方法,我可以为任何语言构建语法?提前致谢
我怀疑这个问题的答案“为语言构建线性语法:是否正确
L ={a^nbc^n | n 属于自然数}
解决方案:
右线性语法:
S--> 作为 | bA
A--> cA | ^
左线性语法:
S--> Sc | 抗体
A--> Aa | ^
我发现在为该语言构建语法时遇到困难,尤其是对于线性语法。
谁能给我一些基本的技巧/方法,我可以为任何语言构建语法?提前致谢
我怀疑这个问题的答案“为语言构建线性语法:是否正确
L ={a^nbc^n | n 属于自然数}
解决方案:
右线性语法:
S--> 作为 | bA
A--> cA | ^
左线性语法:
S--> Sc | 抗体
A--> Aa | ^
正如评论中所指出的,这些语法是错误的,因为它们生成的字符串不是该语言。abcc
这是两种语法的推导:
S -> aS -> abA -> abcA -> abccA -> abcc
S -> Sc -> Scc -> Abcc -> Aabcc -> abcc
同样正如评论中所指出的,这种语言有一个简单的线性语法,其中线性语法被定义为在任何产生式的 RHS 中最多有一个非终结符:
S -> aSc | b
为语言构建语法有一些一般规则。这些要么是显而易见的简单规则,要么是源自闭包属性和语法工作方式的规则。例如:
L = {a}
是一个字母符号a
,那么S -> a
是一个伽玛L
。L = {e}
对于空字符串e
,thenS -> e
是L
.L = R U T
对于语言R
和T
,那么S -> S' | S''
与语法一起R
和T
是语法L
如果S'
是语法的开始符号R
并且S''
是语法的开始符号T
。L = RT
对于语言R
和T
, thenS = S'S''
是一个文法L
ifS'
是文法的开始符号R
并且S''
是文法的开始符号 for T
。L = R*
对于语言R
,thenS = S'S | e
是语法,L
如果S'
是语法的开始符号R
。所写的规则 4 和 5 不保持线性。可以为左线性和右线性文法保留线性(因为这些文法描述了常规语言,而常规语言在这些操作下是封闭的);但一般不能保持线性。为了证明这一点,一个例子就足够了:
R -> aRb | ab
T -> cTd | cd
L = RT = a^n b^n c^m d^m, 0 < a,b,c,d
L' = R* = (a^n b^n)*, 0 < a,b
假设 有一个线性文法L
。我们必须有一个S
产生某些东西的开始符号的产生式。为了产生一些东西,我们需要一串终端和非终端符号。要成为线性的,我们最多只能有一个非终结符。也就是说,我们的生产必须是形式
S := xYz
其中 x 是一串终结符,Y 是单个非终结符,z 是一串终结符。如果x
为非空,则反射显示唯一有用的选择是a
; 其他任何东西都无法派生该语言中的已知字符串。同样,如果z
是非空的,唯一有用的选择是d
。这给出了四种情况:
x
空的,z
空的。Y
这是没用的,因为我们现在要解决非终结符的问题与解决S
.x = a
, 为z
空。Y
现在必须准确生成a^n' b^n' b c^m d^m
where n' = n - 1
。但是,完全相同的论点适用于起始符号为 的文法Y
。x
空,z = d
。Y
现在必须准确生成a^n b^n c c^m' d^m'
where m' = m - 1
。但是,完全相同的论点适用于起始符号为 的文法Y
。x = a
, z = d
. Y
现在必须准确地生成a^n' b^n' bc c^m' d^m'
wheren'
和m'
are 与 2 和 3 一样。但是完全相同的参数适用于起始符号为 的文法Y
。对于有用的产生式来说,没有一个可能的选择S
实际上对让我们更接近语言中的字符串有用。因此,没有导出字符串,这是矛盾的,这意味着 for 的语法L
不能是线性的。
假设有一个语法L'
。然后该语法必须生成 中的所有字符串(a^n b^n)R(a^m b^m)
,以及 中的字符串e + R
。但它不能通过上面使用的论点生成前者:任何对此有用的产生式都不会让我们更接近语言中的字符串。