请根据给定的文法设计并实现词法分析程序,从源程序中识别出单词,记录其单词类别和单词值,输入输出及处理要求如下:
(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()
(正则表达式多香)(乐)