语法分析(递归下降)以及中间代码生成

本文探讨了编译原理中的语法分析,特别是递归下降解析方法,并详细解释了代码实现。通过实例展示了如何将输入程序分割并进行分析。接着介绍了中间代码生成的过程,强调了在语法分析基础上进行语义分析的重要性。最后,提到了代码已上传至GitHub供参考。
摘要由CSDN通过智能技术生成

代码在GitHub上:
https://github.com/lee-geng/B_bianyiyuanli/tree/master

语法分析

一开始我也不是很懂什么是语法分析,但是为了完成实验,还是看了一下过程。在这里插入图片描述可以看到这语法分析,其实是一层一层套用的,程序是由常量说明,变量说明,语句这三部分组成,或者是仅有语句组成。[ ] 中括号括起来的表示可选。那么常量说明是什么呢?它在第二小点,也给出了定义就是由 一个Const, 加上常量定义,或者重复加上(、常量定义)。那么其余的也是如此。

代码详解

  • 分割字符

#全局的p,用来表示当前读到第几个字符,letter是一个list 
#作用是把程序分割成一个 一个块。字母数字是一块,标点是一块,
#结果在letter 里。
def read_string():
    global p,letter;
    p1=p;
    letter='';
    for i in range(p,length):
        #跳过前导空格和换行,
        #一直读到非空格,和换行为止。
        if (f_read[i]==' ')|(f_read[i]=='\n') :
            p1=p1+1;
        else:
            break;
                break;
    flag_alnum=0;
    flag_notalnum=0;
    for i in range(p1,length):
        #因为前面已经跳过空格和换行了
        #这里在遇到空格和换行,就停止
        if (f_read[i]==' ') | (f_read[i]=='\n'):
            break;
        else:
            if f_read[i].isalnum():
                #是否是字母或数字
                if flag_notalnum==1:
                    #前面出现过不是字母和数字。
                    #那么就需要退出
                    break;
                letter=letter+f_read[p1];
                p1=p1+1;
                flag_alnum=1;
            else:#是标点,;()之类的
                if flag_alnum==1:
                    #前面出现过字母和数字。
                    #那么就需要退出,标点和他们是分开的。
                    break
                letter=letter+f_read[p1];
                p1=p1+1;
                flag_notalnum=1;
    p=p1;把当前的p 更新到p1
    return letter;

例子: api+3+b; 那么经过这个函数就会分成 api,+,3,+,b这5个部分(api是个变量名 )
a+3b;那么经过这个函数就会分成 a,+,3b 。这三个部分。

  • 读入要分析的程序。

#读入 要分析的程序 放在f_read里
with open('examplse2.txt', 'r') as f1:
    f_read=f1.read()
    length = len(f_read);

如下图程序。
在这里插入图片描述

  • 主程序。程序的入口(因为是用 jupyter notebook 写的)

#进行分析了。p初始值为0;
def lexer_analysiss():
    global p;
    while(p<len(f_read)):
        read_string()
        judge_which()
  • 判断是进入哪一个块。一开始程序的三大块。常量说明,变量说明,语句。

#分析这个是要进入哪里了。
#是Const,还是Var 还是语句
def judge_which():
    if  'Const'==letter:
        print("Const_description();")
        Const_description();
    elif 'Var'==letter:
        print("Var_description();")
        Var_description();
    elif letter[0].isalpha:
        print("sentense");
        sentense();
    else:
        print("错误Const");
  • Const 语句说明部分

#Const 语句说明
def Const_description():
    read_string()
    if is_iden()==1:
        #判断是不是标识符,自己写的
        print(black,"标识符 ",letter)
        read_string();
        if letter == '=': 
            print(black,"赋值符号",letter)
            read_string();            
            if is_number()==1:
                print(black,"常量",letter);
                read_string();
                if letter==',':
                    print(black,"逗号",letter)
                    Const_description();#循环调用
                elif letter==';':
                    print(black,"分号",letter)
                    return 1;
        else:
            print("常量定义错误")
            return 0;
    else:
        print("常量定义错误");
  • Var说明

def Var_descript
递归下降分析法 一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 二、实验说明 1、递归下降分析法的功能 词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。 2、递归下降分析法的前提 改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法, 3、递归下降分析法实验设计思想及算法 为G的每个非终结符号U构造一个递归过程,不妨命名为U。 U的产生式的右边指出这个过程的代码结构: (1)若是终结符号,则和向前看符号对照, 若匹配则向前进一个符号;否则出错。 (2)若是非终结符号,则调用与此非终结符对应的过程。当A的右部有多个产生式时,可用选择结构实现。 三、实验要求 (一)准备: 1.阅读课本有关章节, 2.考虑好设计方案; 3.设计出模块结构、测试数据,初步编制好程序。 (二)上课上机: 将源代码拷贝到机上调试,发现错误,再修改完善。第二次上机调试通过。 (三)程序要求: 程序输入/输出示例: 对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E->eBaA (2)A->a|bAcB (3)B->dEd|aC (4)C->e|dc 输出的格式如下: (1)递归下降分析程序,编制人:姓名,学号,班级 (2)输入一以#结束的符号串:在此位置输入符号串例如:eadeaa# (3)输出结果:eadeaa#为合法符号串 注意: 1.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); 2.对学有余力的同学,可以详细的输出推导的过程,即详细列出每一步使用的产生式。 (四)程序思路 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将输入符号串输入到字符缓冲区中。 2.利用递归下降分析法分析,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值