python实现c语言词法分析器

一、构造程序设计语言的描述

<程序>→<类型说明>main(){ <函数体> }
<类型说明>→char|int
<函数体>→<变量声明部分>|<常量定义>|<输入语句>|<条件语句>|<循环语句>|<表达式>|<输出语句><返回语句>
<常量定义>→<类型说明><赋值语句>;|<赋值语句>;
<变量声明部分>→<类型说明><标识符>;
<赋值语句>→<标识符>=<无符号整数>|{<标识符><运算符><标识符>}
<输入语句>→scanf(“%<标识符>”,& <标识符>);
<输出语句>→printf(“%<标识符>”,<表达式>);
<条件语句>→if (<判断语句>){<函数体>}
<循环语句>→while(<判断语句>){<函数体>}
<判断语句>→<标识符><运算符><标识符>|true|false
<表达式>→<标识符>=<标识符><运算符><标识符>
<返回语句>→return<标识符>;
<标识符>→<字母>{<字母>|<无符号整数>}
<字母>→a|b|…|X|Y|Z
<数字>→0|1|…8|9
<运算符>→+ |-|/|*|=|<|>|<=|>=|%|&
<无符号整数>→<数字>{<数字>}

二、内部编码表

在这里插入图片描述

三、程序

c语言程序(识别程序)

int main()
{
    int a;
    int b;
    int c;
    a=10;
	scanf("%d",&b); 
	while (b==20.1){
	b=b-1;
	}	
		if(a<b){
		c=a+b;
	}
    printf("%d",c*a);
    return 0;
}

python 程序

import re  #正则表达式的库
#保留字,一共包含了c中的7个关键字
key_word = ['int','main','printf','return','whlie','if','scanf']
#运算符和界符
operator = ['(', ')', '{', '}', ',', ';', '"', '%', '&','+', '=', '>', '<', '-', '*' ]
bosy = ['>=','<=','==']

with open('cpp.txt', 'w') as file:
    print("请输入需要进行词法分析的源程序:")
    #txt = sys.stdin.readlines()
    sentinel = '#'   # 遇到这个就结束
    lines = []
    for line in iter(input, sentinel):
        lines.append(line)
    file.writelines(lines)

with open('cpp.txt', 'r') as file:
        #预处理,增加了去除字符串的功能,毕竟字符串肯定不是标识符啊……        
        txt = ' '.join(file.readlines())
        #在一个字符串中替换所有匹配正则表达式的子串,返回替换后的子串
        #r代表原始字符串常量,用于处理正则表达式时,规避反斜杠的转义。
        #re.sub 实现正则表达式的替换
        ##去除两边空格
        deal_txt = txt.strip()
        ##替换制表符为空值
        deal_txt = deal_txt.replace('\t', ' ').replace('\r', ' ').replace('\n', ' ')
        #词法分析,标识符识别规则加入了_
        keyword = []
        opeword = []
        boword = []
        idword = []
        numword = []
        errword = []
        #返回string(deal_txt)中所有与pattern(第一个变量)匹配的全部字符串,返回形式为数组。
        pha = re.findall(r'[a-zA-Z_][a-zA-Z0-9_]*', deal_txt)
        num = re.findall(r'\d+\.?\d*e?-?\d*?',deal_txt)
        str = re.findall(r'[^\w]', deal_txt)
        bo = re.findall(r'>=|<=|==', deal_txt)
        for k in pha:
            if k in key_word:
                keyword.append({k : key_word.index(k) + 1})
            else:
                #因为前面一共有关键字加函数一共有4个。
                idword.append({k : 8})
        for n in num:
            numword.append({n : 9})
        for s in str:
            if s in operator:
                opeword.append({s: len(key_word) + operator.index(s) + 3})
            elif s != ' ':
                errword.append({s : 'ERROR'})
        for i in bo:
            if i in bosy:
                boword.append({i: len(key_word) + len(operator) +bosy.index(i) + 3})
        print("保留字:\n", keyword)
        print("标识符:\n", idword)
        print("数字常量:\n", numword)
        print("界符和操作符:\n", opeword+boword)
        if len(errword) != 0:
            print("error:\n", 28)
        

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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凡小多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值