【编译原理】使用python构造高级语言c语言的词法分析程序,模拟词法分析过程

      构造高级语言的词法分析程序,模拟词法分析过程。程序要求能对输入的字符串流进行词法分析,在实验的过程中,学会应用单词分析的方法——NFA(非确定有穷自动机)和DFA(确定有穷自动机),加深对词法分析原理的理解。

  1. 词法分析程序能够识别关键字、运算符号和定界符
  2. 识别其它单词是标识符(id)和整型常数(num),通过下列正规式定义。
    id=letter(letter|digit)*
    num=digit digit*
    letter=a |…|z|A|…|Z ,digit=0|…|9 小写和大写字母是有区别的。
  3. 词法分析程序的功能
    (1)输入为所给文法的源程序字符串。
    (2)程序的输出形式为二元组单词串的输出形式。

示例:
测试数据:
输入的文件为: a.txt
int main()
{int abc=3;

程序执行结果为:
单词 单词类别
int 关键字
main 关键字
( 定界符
) 定界符
{ 定界符
abc 标识符
= 运算符
3 整数
} 定界符

import re

#关键字,百度百科上复制来的63个关键字……
key_word = ['asm','do','if','return','typedef','auto','double','inline','short','typeid','bool',
            'dynamic_cast','int','signed','typename','break','else','long','sizeof','union','case',
            'enum','mutable','static','unsigned','catch','explicit','namespace','static_cast',
            'using','char','export','new','struct','virtual','class','extern','operator','switch',
            'void','const','false','private','template','volatile','const_cast','float','protected',
            'this','wchar_t','continue','for','public','throw','while','default','friend','register'
            'true','delete','goto','reinterpret_cast','try','main']

#一些常用函数,不然老被识别为标识符,目前是16个
function_word = ['cin','cout','scanf','printf','abs','sqrt','isalpha','isdigit','tolower','toupper'
                 'strcpy','strlen','time','rand','srand','exit']
#运算符
operator = ['+','-','*','/',':',':=','<','<>','<=','>','>=','=','%']
#定界符
delimiters =[';','(',')','#','==','{','}',',','&','[',']',"'","."]
with open('cpp.txt', 'r') as file:
        #预处理,增加了去除字符串的功能,毕竟字符串肯定不是标识符啊……
        txt = ' '.join(file.readlines())
        deal_txt = re.sub(r'/\*(.|[\r\n])*?\*/|//.*', ' ', txt)
        deal_txt = re.sub(r'\"(.|[\r\n])*?\"', ' ', txt)
        deal_txt = deal_txt.strip()
        deal_txt = deal_txt.replace('\t', ' ').replace('\r', ' ').replace('\n', ' ')
        #词法分析,标识符识别规则加入了_
        keyword = []
        funword = []
        opeword = []
        idword = []
        numword = []
        deword=[]
        errword = []
        #把不同类型字符分类
        #标识符型
        pha = re.findall(r'[a-zA-Z_][a-zA-Z0-9_]*', deal_txt)
        #数字型
        num = re.findall(r'\d+',deal_txt)
        #符号型
        str = re.findall(r'[^\w]', deal_txt)
        #从标识符型里找出关键字、保留字、自定义标识符
        for p in pha:
            if p in key_word:
                keyword.append(p)
            elif p in function_word:
                funword.append(p)
            else:
                idword.append(p)
        #找出数字型
        for n in num:
            numword.append(n)
        #找出运算符和分隔符
        for s in str:
            if s in operator:
                opeword.append(s)
            elif s in delimiters:
                deword.append(s)
            elif s != ' ':
                errword.append({s : 'ERROR'})
        print("关键字:\n", keyword)
        print('函数:\n', funword)
        print("标识符:\n", idword)
        print("数字:\n", numword)
        print("运算符:\n", opeword)
        print("界符:\n",deword)
        if len(errword) != 0:
            print("其他:\n", errword)

运行结果:
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实验一 用PL/O语言编写用户源程序 (一)实验目的:  1了解运行TURBO PASCAL系统对计算机软硬件环境的要求。 2熟悉PASCAL系统中的基本语句及文件类型的使用方法。 3掌握PL/O语言程序的结构及构成规则。 (二)实验内容与步骤  1用PL/0语言编写程序:建立和访问正文文件 2用PL/O语言编写能打印如下图形的程序 * * * * * * * * * * * * * * * * * * * * * * * * * 3用PL/O语言编写求3~100之间全部素数的程序。 4 将一正数倒置。 5 对任意给定的整数,列出其二进制、八进制、十六进制表示形式。 6深刻理解源程序、目标程序编译程序的概念。 7用EBNF描述PL/O语言程序结构及构成规则。 注:  实验二 构造识别符号串的自动机 (一)实验目的: 1掌握形式语言与自动机的概念 2了解正规集及有穷自动机的关系 3能构造识别相应符号串的自动机 4能构造词法分析程序所识别的各类单词的自动机 (二)实验步骤及内容: 1用高级语言编写程序:该程序能接受所有的标识符。 2用高级语言编写程序:该程序能接受所有的常数(整数和定点小数)。 3用高级语言编写程序:该程序能接受PL/0的所有保留字。 4 用高级语言编写程序:该程序能接受PL/0的所有界符、运算符。 (三)有关说明:  1高级语言可选择 C语言实现。 2以上各程序要求:对输入的任意符号串能给出接受与否的识别信息。 实验三 词法分析程序构造 (一)实验目的 1掌握PL/O编译程序使用方法 2掌握PL/O编译程序的总体结构 3掌握PL/O编译程序词法分析程序 4改编总控程序词法分析程序 (二)实验内容及步骤 1单词的分类: 可将所有标识符归为一类;将常数归为另一类:保留字、界符、运算符符则可采取一词一类。 2符号表的建立 可事先建立一保留字表,以备识别保留字时进行查询。变量名表及常数表则在词法分析过程中建立。 3单词串的输出形式: 所输出的每一单词,均按形如(CLASS,VALUE)的二元式编码。对于变量标识符和常数,CLASS字段为相应的类别码,VALUE字段是该标识符、常数在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串,其最大长度为四个字符;常数表登记项中则存放该常数(整数)的二进制形式)。对于保留字、界符和运算符,由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。(或:为便于查看由词法分析程序输出的单词串也可以在CLASS字段上放置单词符号串本身)。 4编写上述词法分析程序 (三)有关说明:  1该词法分析程序只能识别用PL/O语言书写的简单程序。 2也可改编PL/O的编译程序中的词法分析程序,使之能识别含repeat语句的程序。 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值