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

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

  • 题目描述
  • 源代码

题目描述

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

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

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

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

马房山实验报告大学编译原理实验——词法分析_第1张图片

(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()		

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

你可能感兴趣的:(造福后人,python)