实验目的
主要是为了区分4种词(保留字(包括自定义字)、数字、字母、比较符),建立并输出token和符号表。
编译原理词法分析 Python语言实现、代码简洁且易懂
lookup_dic = {'begin': 1, 'if': 2, 'then': 3, 'while': 4, 'do': 5, 'end': 6,
'+': 13, '-': 14, '*': 15, '/': 16, ':': 25, ':=': 18,
'<': 20, '<>': 21, '<+': 22, '>': 23, '>=': 24, '=': 25,
';': 26, '(': 27, ')': 28, '#': 0}
#{key:value}
def emit(value, type_str):
emit_index = ''
emit_value = value
if type_str == 'num':
emit_index = '11'
elif type_str == 'word':
if value in lookup_dic.keys():
emit_index = str(lookup_dic[value])
else:
emit_index = '10'
emit_value = '\''+value+'\''
elif type_str == 'symbol':
emit_index = str(lookup_dic[value])
print('(' + emit_index + ',' + emit_value + ')', end = ' ')
def lex(input_str):
i = 0
while input_str[i] != '#':
char = input_str[i]
#处理注释
if char == '/':
if input_str[i+1] == '/':
i+=1
while input_str[i+1] != '\n':
i+=1
elif input_str[i+1] =='*':
i+=1
while input_str[i] != '*' or input_str[i+1] != '/':
i+=1
i+=1
#空格:pass
elif char == ' ' or char == '\t' or char == '\n':
pass
#数字:查看下一个是否为数字 输入num类型
elif char.isdigit():
num_str = char
while input_str[i+1].isdigit():
i += 1
num_str += input_str[i]
emit(num_str, 'num')
#字符类型:
elif char.isalpha():
word_str = char
#检查是否input_str[i + 1]为数字与字母组成 是则拼接
while input_str[i + 1].isalnum():
i += 1
word_str += input_str[i]
emit(word_str, 'word')
#关键字类型
elif char in lookup_dic.keys():
symbol_str = char
#循环判断下一个字符是否也为关键字 是则拼接
while input_str[i+1] in lookup_dic.keys() and input_str[i+1] != '/':
i += 1
symbol_str += input_str[i]
emit(symbol_str, 'symbol')
i += 1
emit('#', 'symbol')
input_str = 'begin x:=9;/*dsfdsa*/int lsd;if x>0 then x:=2*x+1/3;end#'
lex(input_str)
with open('c_program.txt','r') as f:
str1 = f.read()
print(str1)
print(lex(str1))
参考博客:https://blog.csdn.net/weixin_41405111/article/details/103776748
添加了注释处理的代码
适用于华南农业大学数学与信息学院编译原理实验课