python 算符优先分析法的设计实现 编译原理

这篇具有很好参考价值的文章主要介绍了python 算符优先分析法的设计实现 编译原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文内容:

1、给出文法如下:
G[E]

E->T|E+T;

T->F|T*F;

F->i|(E);
可以构造算符优先表如下:

+ * ( ) i
+ > < < > <
* > > < > <
( < < < = <
) > > >
i > > >


2、计算机中表示上述优先关系,优先关系的机内存放方式有两种1)直接存放,2)为优先关系建立优先函数,这里由学生自己选择一种方式;
3、给出算符优先分析算法如下:

k:=1;S[k]:='#';
REPEAT
        把下一个输入符号读进a中;
        IF S[k]属于Vt THEN j:=k ELSE j:=k-1;

        WHILE S[j]>a DO
        BEGIN
                REPEAT

                        Q:=S[j];
                        IF S[j-1]属于Vt THEN j:=j-1 ELSE j:=j-2

                UNTIL s[j]<Q
                把S[j+1]...S[k]归约为某个N;

                k:=j+1;
                S[k]:=N;
        END OF WHILE;
        IF S[j]<a OR S[j]=a THEN

        BEGIN
                k:=k+1;

                S[k]:=a

        END
        ELSE ERROR

UNTIL a=‘#'

样例:

python 算符优先分析法的设计实现 编译原理python 算符优先分析法的设计实现 编译原理

 代码如下:

# 输出结果
def output(str, a, b, type):
    global program
    program.append([type, str[a:b + 1]])


# 判断字符串一部分是否属于关键字
# 是返回1不是返回2
def iskeywords(str, a, b):
    # 关键字
    keywords = {"if", "int", "for", "while", "do", "return", "break", "continue"}
    s = str[a:a + b + 1]  # 拷贝字符
    if s in keywords:  # 判断是否存在,存在返回1,否则返回2
        return 1
    else:
        return 2


# 判断字符是否属于运算符或分隔符的一部分。
# 不是返回0,是返回1,是且后面能跟=号返回2
def belong_to(str, type):
    if type == 4:  # 选择运算符
        library = "+-*/=><!"  # 运算符
    else:  # 选择分隔符
        library = ",;{}()"  # 分隔符
    if str in library:  # 存在
        # 是可能后面跟=号的几个符号
        if type == 4 and library.index(str) >= 4:
            return 2
        else:
            return 1
    return 0


# 递归的词法分析函数,读入一行str字符串,初始位置 n = 0
# 分离+判断,打印输出类型
# 由之前的c语言版本改写而成
def scan(str, n):
    # 7 种类型(最后输出1 - 5)
    # -1
    # 0: 初始
    # 1: 关键字, 在keywords中
    # 2: 标识符
    # 3: 常数(无符号整型)
    # 4: 运算符和界符:+ - * / = > < >= <= !=
    # 5: 分隔符:, ; {}()
    i = n
    type = 0
    while i < len(str):
        if type == 0:  # 初始态
            if str[i] == ' ':  # 空格跳过
                n += 1
                i += 1
                continue
            elif str[i] == '\0' or str[i] == '\n':  # 是结束
                return
            elif ('a' <= str[i] <= 'z') or ('A' <= str[i] <= 'Z'):
                type = 1  # 是字母,
            elif '0' <= str[i] <= '9':
                type = 3  # 是数字,常数
            else:
                type = belong_to(str[i], 4)
                if type > 0:  # 是运算符
                    # 是能跟=号的运算符,后面是=号
                    if type == 2 and str[i + 1] == '=':
                        i = i + 1  # 结束位置后移
                    output(str, n, i, 4)  # 输出 + 递归 + 结束
                    scan(str, i + 1)
                    return
                elif belong_to(str[i], 5):  # 是分隔符
                    output(str, n, i, 5)  # 输出 + 递归 + 结束
                    scan(str, i + 1)
                    return
                else:
                    print("失败:", str[i])
                    return
        elif type == 1:  # 关键字或标识符
            if not (('a' <= str[i] <= 'z') or ('A' <= str[i] <= 'Z')):  # 不是字母了
                if '0' <= str[i] <= '9':  # 是数字,只能是标识符
                    type = 2
                else:  # 非字母数字
                    type = iskeywords(str, n, i - 1)
                    output(str, n, i - 1, type)  # 输出 + 递归 + 结束
                    scan(str, i)
                    return
        elif type == 2:  # 标识符
            if not (('a' <= str[i] <= 'z') or ('A' <= str[i] <= 'Z')):
                # 不是字母了
                if not ('0' <= str[i] <= '9'):
                    # 不是数字
                    output(str, n, i - 1, type)  # 输出 + 递归 + 结束
                    scan(str, i)
                    return
        elif type == 3:
            if not ('0' <= str[i] <= '9'):
                # 不是数字
                output(str, n, i - 1, type)  # 输出 + 递归 + 结束
                scan(str, i)
                return
        else:
            print("%d失败" % type)
        i += 1


# 添加S->;E;,形成句子括号
# S->;E;        ;       ;
# E->T|E+T      +,*,i,( +,*,i,)
# T->F|T*F      *,i,(   *,i,)
# F->i|(E)      i,(     i,)
#   A-> ···aB···    b∈FIRSTVT(B)    a<b
#   A-> ···Bb···    a∈LASTVT(B)     a>b

#       +   *   (   )   i   ;
#   +   >   <   <   >   <   >
#   *   >   >   <   >   <   >
#   (   <   <   <   =   <
#   )   >   >       >       >
#   i   >   >       >       >
#   ;   <   <   <       <   =

# 算符分析函数
def Operator_Analysis():
    priority_relationship = {  # 优先关系
        '+': {'+': '>', '*': '<', '(': '<', ')': '>', 'i': '<', ';': '>'},
        '*': {'+': '>', '*': '>', '(': '<', ')': '>', 'i': '<', ';': '>'},
        '(': {'+': '<', '*': '<', '(': '<', ')': '=', 'i': '<', ';': None},
        ')': {'+': '>', '*': '>', '(': None, ')': '>', 'i': None, ';': '>'},
        'i': {'+': '>', '*': '>', '(': None, ')': '>', 'i': None, ';': '>'},
        ';': {'+': '<', '*': '<', '(': '<', ')': None, 'i': '<', ';': '='}}
    p = program.copy()  # 剩余输入串
    s = [';']  # 栈
    a = None  # 当前符号
    k = 0
    j = 0
    while 1:
        # 读入下一个符号
        a = p.pop(0)
        if a[0] == 2 or a[0] == 3:
            a = 'i'
        else:
            a = a[1]
        if not s[k] == 'F':  # 找找终结符
            j = k
        else:
            j = k - 1
        while priority_relationship[s[j]][a] == '>':  # 规约
            while 1:
                Q = s[j]
                if not s[j - 1] == 'F':
                    j = j - 1
                else:
                    j = j - 2
                if priority_relationship[s[j]][Q] == '<':  # 找到左括号结束
                    break
            if len(s[j + 1:k + 1]) % 2 == 0:    # 如果不是奇数就不是 a op b,a,(a),这几种形式,
                print("错误")
                return -1

            s = s[0:j + 1]
            s.append('F')
            k = j + 1
        if priority_relationship[s[j]][a] == '<' or priority_relationship[s[j]][a] == '=':
            s.append(a)  # 入栈
            k = k + 1
        else:
            print("错误")
            return -1
        if a == ';':
            break
    print("正确")
    return 1


file = "program.txt"
file = open(file)  # 读取文件
while i := file.readline():
    program = []  # 记录读到的句子
    scan(i, 0)
    print(i, end='')
    Operator_Analysis()
file.close()

结果:文章来源地址https://www.toymoban.com/news/detail-467119.html

10;
正确
1+2;
正确
(1+2)*3+(5+6*7);
正确
((1+2)*3+4;
错误
1+2+3+(*4+5);
错误
(a+b)*(c+d);
正确
((ab3+de4)**5)+1;错误

到了这里,关于python 算符优先分析法的设计实现 编译原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编译原理:算符优先分析算法的设计与实现(含代码)

    写在最前面:我的编译原理学的不是很好,不怎么听课,所以我写代码的思路比较简单。简单的思路也就意味着代码很笨重,介意的话请点叉叉。如果有什么指教欢迎评论区留言。 特别说明 :本博代码在识别: E→E+T E→E-T E→T 时,firstvt集和lastvt集可能会出现错误。 最好合

    2024年02月10日
    浏览(53)
  • 【建模算法】层次分析法(Python实现)

    在很多情况下,我们对事物评价,应该要多维度评价。多维度评价之后我们要如何把它们合并成一个指标用于比较事物的好坏呢,这时候需要对各个指标赋权, 层次分析法就是用来赋权重的了。 这个方法主观性比较强,在数据集比较小,实在不好比较的时候可以用这个方法

    2024年01月22日
    浏览(44)
  • 主成分分析法(PCA)及其python实现

    主成分分析法(Principal Component Analysis,PCA)是一种用于把高维数据降成低维,使分析变得更加简便的分析方法。比如我们的一个样本可以由 n n n 维随机变量 ( X 1 , X 2 , . . . , X n ) (X_1,X_2,...,X_n) ( X 1 ​ , X 2 ​ , ... , X n ​ ) 来刻画,运用主成分分析法,我们可以把这些分量用更

    2024年01月16日
    浏览(46)
  • 数学建模--层次分析法(AHP)的Python实现

    目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 算术平均法求得的权重为: [0.07243906 0.30125047 0.62631047] 几何平均法求得的权重为: [0.7374984  0.17727613 0.08522547] 特征值权重法法求得的权重为: [0.07239208 0.30116321 0.62644471]

    2024年02月10日
    浏览(44)
  • Python PCA(主成分分析法)降维的两种实现

            PCA降维,一般是用于数据分析和机器学习。它的作用是把一个高维的数据在保留最大信息量的前提下降低到一个低维的空间,从而使我们能够提取数据的主要特征分量,从而得到对数据影响最大的主成分,便于我们对数据进行分析等后续操作。         例如,

    2023年04月17日
    浏览(44)
  • 【编译原理】【C语言】实验三:递归下降分析法

    C语言 实验环境:Visual Studio 2019 author:zoxiii   用高级语言实现递归下降分析程序。使用输入串i*(i+i),输出分析栈中所有内容,并给出分析结果。   自顶向下分析就是从文法的开始符触发并寻找出这样一个推导序列:推导出的句子恰好为输入符号串;或者说,能否从根节

    2023年04月21日
    浏览(40)
  • 评价模型(一) 层次分析法(AHP),熵权法,TOPSIS分析 及其对应 PYTHON 实现代码和例题解释

    数学建模系列文章: 以下是个人在准备数模国赛时候的一些模型算法和代码整理,有空会不断更新内容: 评价模型(一)层次分析法(AHP),熵权法,TOPSIS分析 及其对应 PYTHON 实现代码和例题解释 评价模型(二)主成分分析、因子分析、二者对比及其对应 PYTHON 实现代码和例

    2024年02月08日
    浏览(62)
  • 【编译原理】 实验三 LL(1)分析法(LL1分析表的自动生成)

    由于代码较长,csdn对文章总长度有字数限制,想只看完整代码的请移步另一篇博客。 https://blog.csdn.net/qq_46640863/article/details/125705891 理论与习题讲解移步视频 https://www.bilibili.com/video/BV1zu4y1C7SL 1.实现LL(1)分析算法 2.输入:教材中的算术表达式文法;待分析的语句(如i+i*i) 3.输

    2024年02月06日
    浏览(46)
  • 层次分析法(matlab实现)

           在决策理论中,层次分析法是一种以 数学 和 心理学 为基础,组织和分析复杂决策的结构化技术,它代表了一种 量化决策标准权重 的准确方法,通过成对比较,利用个别专家的经验来估计因素的相对大小        在很多情况下,我们对事物的评价,应该多维度的进

    2024年02月09日
    浏览(47)
  • 【软件测试】边界值分析法测试用例设计实例

    原题链接:洛谷 P2602 [ZJOI2010] 数字计数 输入两个正整数a,b,求在 [ a , b ] [a,b] [ a , b ] 中的所有整数中,每个数码(0~9)各出现了多少次。 输入格式: 输入两个正整数a, b确定区间

    2023年04月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包