# -*- coding: utf-8 -*-
# @File : LL(1).py
# @Author: Judong Li
# @Date : 2020/05/29
# @Desc : 编译原理——LL1语法分析器
import csv
class Stack(object):
"""栈"""
def __init__(self):
self.items = []
def is_empty(self):
"""判断是否为空"""
return self.items == []
def push(self, item):
"""加入元素"""
self.items.append(item)
def pop(self):
"""弹出元素"""
return self.items.pop()
def peek(self):
"""返回栈顶元素"""
return self.items[len(self.items)-1]
def size(self):
"""返回栈的大小"""
return len(self.items)
def show(self):
print(self.items)
class LL1_Analyzer:
def __init__(self):
self.SymbolStack=Stack()
#终结符/非终结符
self.Endsymbol=[]
self.notEndsymbol=[]
#终结符/非终结符索引表
self.Endsymbol_index={
}
self.notEndsymbol_index={
}
#语法
self.gramas=[]
#First//Follow集
self.AnalyseTable=[]
#分析表
self.AnalyseTable=[]
#First/Follow集
self.FirstDict={
}
self.FollowDict={
}
def PrintAllParameters(self):
print("Gramas(预处理后):\n\t",self.gramas)
print("Not Endsymbol(非终结符):\n\t",self.notEndsymbol)
print("Endsymbol(终结符):\n\t",self.Endsymbol)
print("Not Endsymbol Indes(非终结符索引):\n\t",self.notEndsymbol_index)
print("Endsymbol Indes(终结符索引):\n\t",self.Endsymbol_index)
print("FirstDict(First集):")
[print("\t ",key,self.FirstDict[key])for key in self.FirstDict.keys()]
print("FollowDict(Follow集):")
[print("\t ",key,self.FollowDict[key])for key in self.FollowDict.keys()]
print("AnalyseTable(分析表):\n\t")
[print("\t",x)for x in self.AnalyseTable]
# for x in range(len(self.Endsymbol)):
# for y in range(len(self.notEndsymbol)):
# print(self.Endsymbol[x],self.notEndsymbol[y],self.AnalyseTable[y][x])
#创建索引以及完成符号与索引的转换
def GetSymbolIndex(self,Symbol):# flag: True->终结符//False->非终结符
flag=self.isEndSymbol(Symbol=Symbol)
try:
if flag:
return self.Endsymbol_index[Symbol]
else:
return self.notEndsymbol_index[Symbol]
except:
# print("\033[31m这是红色字体\033[0m")
print("\033[31mError:Meeting value unknown(遇到未知符号)\033[0m")
exit(-1)
def CreateIndex(self):
#建立符号->索引表
for i in range(len(self.notEndsymbol)):
self.notEndsymbol_index[self.notEndsymbol[i]]=i
for i in range(len(self.Endsymbol)):
self.Endsymbol_index[self.Endsymbol[i]]=i
基于LL(1)分析法的语法分析器Python实现
最新推荐文章于 2024-06-27 21:52:01 发布
该博客介绍了如何使用Python实现基于LL(1)分析法的语法分析器。内容包括文法内容、输入字符示例、输出结果展示以及LL分析表的自动输出和构造过程。重点讲述了First集和Follow集的构造方法,以及分析表的生成和分析步骤解析。
摘要由CSDN通过智能技术生成