词法分析 | 自顶向下分析算法

作者: print("") 分类: 编译原理 发布时间: 2025-01-01 23:22

首先我们给定文法G如下:

S -> N V N
N -> s
   | t
   | g
   | w
V -> e
   | d

需要推导出句子s如下:
g d w

使用图演示一下具体的过程

使用一个脚本来演示类似的算法

class Parser:
    def __init__(self, grammar):
        self.grammar = grammar  # 文法规则,以字典形式存储

    def parse(self, sentence):
        stack = []  # 初始化栈
        productions = self.grammar['S']
        for production in productions:
            stack.append(production)
        index = 0
        tmp_n=0
        tmp_v=0
        index2=0
        access_list=[]
        while stack:
            if index2>=len(stack):
                index2=int(len(stack)-1)
                if index2<0:index2=0
            top = stack[index2]
            del stack[index2]
            if top in self.grammar:  # 非终结符
                if top=='N':
                    stack.insert(index,self.grammar[top][tmp_n])
                    tmp_n+=1
                if top=='V':
                    stack.insert(index,self.grammar[top][tmp_v])
                    tmp_v+=1
            else:
                if top!=sentence[index]:
                    stack.insert(index,self.grammar['S'][index])
                else:
                    access_list.append(top)
                    tmp_n=0
                    tmp_v=0
                    index+=1
                    index2+=1
            #break
        return "".join(access_list) == "".join(sentence)  # 所有符号匹配成功

# 定义文法
grammar = {
    'S': ['N','V', 'N'],
    'N': ['s', 't', 'g', 'w'],
    'V': ['e', 'd']
}

parser = Parser(grammar)
sentence = ['g','d','w']

print(sentence[0])
if parser.parse(sentence):
    print("句子", sentence, "符合文法")
else:
    print("句子", sentence, "不符合文法")

上述自上而下的方式太过于消耗性能,可以改为如下的方式

例子如下:

class Parser:
    def __init__(self, grammar):
        self.grammar = grammar  # 文法规则,以字典形式存储

    def parse(self, sentence):
        stack = []  # 初始化栈
        productions = self.grammar['S']
        for production in productions:
            stack.append(production)
        index = 0
        access_list=[]
        while stack:
            top = stack.pop()
            if top in self.grammar:  # 非终结符
                flag=False
                for i2 in self.grammar[top]:
                    if i2 == sentence[index]:
                        index+=1
                        access_list.append(i2)
                        flag=True
                if not flag:
                    return False
                
        print(access_list)   
        return "".join(access_list) == "".join(sentence)  # 所有符号匹配成功

# 定义文法
grammar = {
    'S': ['N','V', 'N'],
    'N': ['s', 't', 'g', 'w'],
    'V': ['e', 'd']
}

parser = Parser(grammar)
sentence = ['g','d','w']

if parser.parse(sentence):
    print("句子", sentence, "符合文法")
else:
    print("句子", sentence, "不符合文法")

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

发表回复

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