词法分析程序设计
目录
实验目的
设计、编制并调试一个简单语言CP(Compiler Principle)的词法分析程序,加深对词法分析原理的理解。
实验内容
1. CP语言的词法
(1) 关键词: begin end if then else for while do and or not
注意:所有关键词都是小写的。
(2) 标识符ID,与标准C语言一致,即:以下划线或字母开头的字母数字下划线组成的符号串。
(3)无符号整数NUM:数字串
(4)运算符和分界符: +、-、*、/、>、<、=、:=、>=、<=、<>、++、--、(、)、; 、 #
注意::=表示赋值运算符、#表示注释开始的部分,;表示语句结束,<>表示不等关系
(5) 空白符包括空格、制表符和换行符,用于分割ID、NUM、运算符、分界符和关键词,词法分析阶段要忽略空白符。
2. 说明
(1)CP语言是大小写敏感语言;
(2)字母为a-zA-Z,数字为0-9;
(3)学有余力同学可以在上述词法要求基础上进行扩充和改造;
(4)每行代码中从#开始的部分为注释部分(参考python语法)
3. 设计要求
(1) 给出各类单词符号的分类编码(可以根据自己程序的需要来给各种类别单词编码,给每个词法单位一个编码,也可以给一个类别里所有符号都编同一个编码)。
(2) 词法分析程序应该能发现输入串中的错误
(3) 词法分析作为单独一遍,将词法分析程序输出的二元式序列保存为中间文件形式【也可以在屏幕窗口直接输出】
源代码
key_word = ["begin", "end", "if", "then", "else", "for", "while", "do", "and", "or", "not"]
ca_sign = ['+','-','*','/','>','<','=',':=','>=','<=','<>','++','--','(',')',';','#']
'''
关键词 01
ID 02
无符号整数NUM 03
运算符和分界符 04
'''
#去除注释
def analise1(word):
count = 0
for i in word:
count +=1
if(i == '#'):
print("< #,04 >")
word = word[:count-1]
return word
return word
#判断是否全为空格
def ifnull(word):
if len(word)<1:
return True
for i in word:
if i !=' ':
return False
return True
#去除空格
def analise2(word):
word1 = word.split(' ')
length = len(word1)
i=0
while i < length-1:
if ifnull(word1[i]):
word1.pop(i)
length -=1
continue
i +=1
return word1
#判断是否为正确的标识符
def ifco(word):
if word.isdigit():
print("< %s,03 >"%word)
elif word[0].isalpha() or word[0]=='_':
print("< %s,02 >"%word)
else:
print("< %s,erro >"%word)
#标识符的识别和判断
def analise3(word):
word1=""
word2=""
if word in ca_sign:
print("< %s,04 >"%word)
elif word in key_word:
print("< %s,01 >"%word)
else:
i=0
while i<len(word)-1:
n = 0
if word[i].isalnum() or word[i]=='_': #判断是否为字母数字串
word1 = word1 + word[i]
for j in range(i + 1, len(word)):
if word[j].isalnum()or word[j]=='_':
word1 = word1 + word[j]
n=j
else:
n=j
break
i=n
if word1 in ca_sign:
print("< %s,04 >" % word1)
elif word1 in key_word:
print("< %s,01 >" % word1)
else:
ifco(word1)
word1 = ""
else: #判断是否为正确符号
word2 = word2 + word[i]
if i+1<len(word):
if not word[i+1].isalnum():
n=i+2
word2 = word2 + word[i+1]
if word2 in ca_sign:
print("< %s,04 >" % word2)
else:
if word2[0] in ca_sign:
print("< %s,04 >" % word2[0])
else:
print("< %s,erro >"%word2[0])
if word2[1] in ca_sign:
print("< %s,04 >" % word2[1])
else:
print("< %s,erro >"%word2[1])
i=n
word2=""
continue
i=i+1
if word2 in ca_sign:
print("< %s,04 >" % word2)
else:
print("< %s,erro >" % word2)
word2 = ""
#对每一句词法分析
def analise(word):
word1 = analise1(word)
if len(word1) == 0:#只有注释
return 0
word2 = analise2(word1)
for i in word2:
analise3(i)
def main():
with open('demo1.txt',encoding='utf-8') as words:
contents = words.read()
first_w = contents.split('\n') #将文件内句子拆分
for i in first_w:
analise(i)
main()
测试案例
while(a==b)begin
a:=a+1;#zhushi
b:=b-1;
c=c*d;
d=c/d;
if(a>b) then c=C else C=c;
end
for(int i=1;i<=10;i++) begin
a_b++;#zszszszszs
b_C--;#zszszszszs
B123:=1234567;
a=@;
123a=0;
a.b;
end
部分结果
结果分析
经测试,代码的鲁棒性较好,可以分辨正确错误词法,但还有较多可以优化的地方。