语法分析-上下文无关文法简单理解

作者: print("") 分类: 编译原理 发布时间: 2024-12-16 21:28

一个上下文无关文法包括:

一个字符集、一个变元集合以及一个产生式集合,并且变元集合中有一个变元被称为初始变元。

所谓产生式就是 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

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注