本来说觉得编译原理考的太烂了,按当时老师说写个词法分析器可以期末加几分,我就抽空做了,但是做完了却懒得去找老师了演示了。。。
其实词法分析器的作用就是将一段高级语言代码按照既定的规则转换为低级语言的单词,以便于接下来对这些单词的解释和编译。
一、设计单词表
二、构建状态转换图DFA
三、代码(用python练手)
#保留字列表
key = ['program', 'var', 'int', 'const', 'begin', 'end', 'if', 'then', 'while', 'do', 'read', 'write']
#把每行字符串分词
def lexicalAnalyze(wordlist):
s = '' #单词
syn = 0 #标号
i = 0 #字符串索引
for word in wordlist:
if word == ' ': #若为空格则判断下一个字符
i += 1
continue
else:
if i >= len(wordlist): #防止i越界
break
elif wordlist[i] >= 'a' and wordlist[i] <= 'z': #判断是什么字符串
for word in wordlist:
if i >= len(wordlist): # 防止i越界
break
elif (wordlist[i] >= 'a' and wordlist[i] <= 'z') or (wordlist[i] >= '0' and wordlist[i] <= '9'):
s += wordlist[i]
i += 1
else:
break
for keyword in key: #检查是不是保留字
if s == keyword:
syn = key.index(s) + 1 #是保留字
break
else: #是标识符
syn = 13
lexicalPrint(syn, s)
s = ''
elif wordlist[i] >= '0' and wordlist[i] <= '9': #判断是否为常数
for word in wordlist:
if i >= len(wordlist): # 防止i越界
break
elif wordlist[i] >= '0' and wordlist[i] <= '9':
s += wordlist[i]
i += 1
else:
break
syn = 14
lexicalPrint(syn, s)
s = ''
#判断是否为其他字符
elif wordlist[i] == '+':
s += wordlist[i]
i += 1
syn = 15
lexicalPrint(syn, s)
s = ''
elif wordlist[i] == '-':
s += wordlist[i]
i += 1
syn = 16
lexicalPrint(syn, s)
s = ''
elif wordlist[i] == '*':
s += wordlist[i]
i += 1
syn = 17
lexicalPrint(syn, s)
s = ''
elif wordlist[i] == '/':
s += wordlist[i]
i += 1
syn = 18
lexicalPrint(syn, s)
s = ''
elif wordlist[i] == ':':
s += wordlist[i]
i += 1
if wordlist[i] == '=':
s += wordlist[i]
i += 1
syn = 20
else:
syn = 19
lexicalPrint(syn, s)
s = ''
elif wordlist[i] == '=':
s += wordlist[i]
i += 1
syn = 21
lexicalPrint(syn, s)
s = ''
elif wordlist[i] == '>':
s += wordlist[i]
i += 1
if wordlist[i] == '=':
s += wordlist[i]
i += 1
syn = 23
else:
syn = 22
lexicalPrint(syn, s)
s = ''
elif wordlist[i] == '<':
s += wordlist[i]
i += 1
if wordlist[i] == '=':
s += wordlist[i]
i += 1
syn = 25
elif wordlist[i] == '>':
s += wordlist[i]
i += 1
syn = 26
else:
syn = 24
lexicalPrint(syn, s)
s = ''
elif wordlist[i] == '(':
s += wordlist[i]
i += 1
syn = 27
lexicalPrint(syn, s)
s = ''
elif wordlist[i] == ')':
s += wordlist[i]
i += 1
syn = 28
lexicalPrint(syn, s)
s = ''
elif wordlist[i] == '{':
s += wordlist[i]
i += 1
syn = 29
lexicalPrint(syn, s)
s = ''
elif wordlist[i] == '}':
s += wordlist[i]
i += 1
syn = 30
lexicalPrint(syn, s)
s = ''
elif wordlist[i] == ',':
s += wordlist[i]
i += 1
syn = 31
lexicalPrint(syn, s)
s = ''
elif wordlist[i] == ';':
s += wordlist[i]
i += 1
syn = 32
lexicalPrint(syn, s)
s = ''
elif wordlist[i] == '#':
s += wordlist[i]
syn = 0
lexicalPrint(syn, s)
print('碰到#号,结束程序!')
break
#控制输出格式
def lexicalPrint(syn, s):
syn = str(syn)
print('<' + syn + ',' + s + '>')
#将测试文件按行读取
def lexicalInput():
with open('test.txt', 'r') as f:
for line in f.readlines():
wordlist = line.strip() #去掉回车和句首空格
lexicalAnalyze(wordlist) #每一行都作分词处理
lexicalInput()
四、测试代码
program testexample;
{note}
var
k,sum1,sum2,x:int;
const
num=20,times=10;
begin
sum1:=0; sum2:=0;
k:=num;
while k>=1 do
begin
read(x);
if x>=0
then sum1:=sum1+x;
sum2:=sum2+x;
k:=k-1;
end;
write(sum1,times*sum2/num);
end;
#
五、测试结果