语法分析-上下文无关文法简单理解
一个上下文无关文法包括:
一个字符集、一个变元集合以及一个产生式集合,并且变元集合中有一个变元被称为初始变元。
所谓产生式就是 S→aSb 这样的,由一个变元变成变元和字符组成的串的式子。
举个例子:
自然语言中的句子的典型结构 主语 谓语 宾语 名词 动词 名词 例子: 名词:{羊, 老虎, 草, 水} 动词:{吃, 喝} 句子: 羊 吃 草 羊 喝 水 老虎 吃 老虎 草 吃 老虎
那么也可以套用如上的。
对这个例子,我们进行形式化分析:
(S 表示句子, -> 表示推出, N 表示名词, V 表示动词)
S -> N V N N -> s(sheep) | t(tiger) | g(grass) | w(water) V -> e(eat) | d(drink)
我们将其中的大写符号叫做非终结符:{S, N, V}
将小写的符号(名词+谓词)叫做终结符:{s, t, g, w, e, d}
开始符号是:S
上下文无关文法
上下文无关文法 G 是一个四元组:
G = (T, N, P, S)
其中 T 是终结符集合 N 是非终结符集合 P 是一组产生式规则 每条规则的形式: X -> β1 β2 ... βn, n >= 0 其中 X ∈ N, βi ∈(T ∪ N) S 是唯一的开始符号(非终结符) S ∈ N
G = {N, T, P, S} 非终结符号:N = {S, N, V} 终结符号: T = {s, t, g, w, e, d} 开始符号:S 产生式规则集合: { S -> N V N, N -> s, N -> t, N -> g, N -> w, V -> e, V -> d}
那么可以使用代码来演示一下
grammar = { 'S': ['N', 'V', 'N'], 'N': ['s', 't', 'g', 'w'], 'V': ['e', 'd'] } # 文法推导函数 def derive(symbol, input_string): if symbol not in grammar: return False #推导函数 count=0 for production in grammar[symbol]: #从左到右推导 第一位是N if production not in grammar: continue #判断是否在文法中 if input_string[count] in grammar[production]: count+=1 return count == len(input_string) #随机生成文法 def run_derive(symbol): ret="" if symbol not in grammar: return '' #读取文法规则 for production in grammar[symbol]: if production in grammar: name=grammar[production] #随机长度 # 使用推导函数 input_string = "set" print(derive('S', input_string))
教程地址:https://www.bilibili.com/video/BV1m7411d7iS