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