马房山实验报告大学编译原理实验——词法分析

武汉理工大学编译原理实验——词法分析

题目描述

请根据给定的文法设计并实现词法分析程序,从源程序中识别出单词,记录其单词类别和单词值,输入输出及处理要求如下:

(1)数据结构和与语法分析程序的接口请自行定义;类别码需按下表格式统一定义;

(2)为了方便进行自动评测,输入的被编译源文件统一命名为testfile.txt;输出的结果文件统一命名为output.txt,结果文件中每行按如下方式组织:
  单词类别码   单词的字符/字符串形式   (中间仅用一个空格间隔)

单词的类别码请统一按如下形式定义:

在这里插入图片描述

(3)程序需具有错误识别功能,发现单词错误,该单词的输出为:error
【输入形式】testfile.txt中的符合文法要求的测试程序。
【输出形式】要求将词法分析结果输出至output.txt中。
【样例输入】
begin x=9;x=2*x+1/3;end%#

【样例输出】
1 begin
10 x
18 =
11 9
17 ;
10 x
18 =
11 2
15 *
10 x
13 +
11 1
16 /
11 3
17 ;
2 end
error
0 #

源代码

由于题目没有规定语言,这里我使用Python实现。

import re

charList = {'begin':'1', 'end':'2', '+':'13', '-':'14', '*':'15', '/':'16', ';':'17', '=':'18', '<':'19', '<>':'20', '<=':'21', '>':'22', '>=':'23', '(':'24', ')':'25', '#':'0', r'[A-Za-z]':'10', r'[0-9]':'11'}

nums = r'[0-9]'
chars = r'[A-Za-z]'

with open('testfile.txt', 'r') as fp:
	with open('output.txt', 'w') as fw:
		strs = fp.read()
		i = 0
		while i < len(strs):
			if strs[i] == 'b':
				if strs[i:i+5] == 'begin':
					fw.write(charList['begin'])
					fw.write(' begin\n')
					i += 5
					continue
				
			if strs[i] == 'e':
				if strs[i:i+3] == 'end':
					fw.write(charList['end'])
					fw.write(' end\n')
					i += 3
					continue
					
			if strs[i:i+2] in charList:
				fw.write(charList[strs[i:i+2]])
				fw.write(' ' + strs[i:i+2] + '\n')
				i += 2
				continue
			
			if re.match(r'[A-Za-z]', strs[i]):
				fw.write('10')
				fw.write(' ' + strs[i] + '\n')
				i += 1
				continue
				
			if re.match(r'[0-9]', strs[i]):
				fw.write('11')
				fw.write(' ' + strs[i] + '\n')
				i += 1
				continue
				
			if strs[i] in charList:
				fw.write(charList[strs[i]])
				fw.write(' ' + strs[i] + '\n')
				i += 1
				continue
				
			if strs[i] == ' ' or strs[i] == '\n':
				i += 1
				continue
			
			fw.write('error\n')
			i += 1
		fw.close()
	fp.close()		

(正则表达式多香)(乐)

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值