杭电编译原理专题一(python实现)

本文详细介绍了如何设计并实现一个简单的CP语言词法分析程序,通过实验理解词法分析原理,涵盖了关键词、标识符、数值、运算符和注释的识别。程序展示了如何划分词类并处理错误,部分测试案例和结果分析揭示了优化空间。
摘要由CSDN通过智能技术生成

词法分析程序设计

目录

        实验目的

        实验内容

        源代码

        测试案例

        部分结果

        结果分析


 

实验目的

设计、编制并调试一个简单语言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

部分结果

1899bf09d227455e882dced8d2417daf.png     d187b015f35b4aeb9da8ade29df76052.png

结果分析

经测试,代码的鲁棒性较好,可以分辨正确错误词法,但还有较多可以优化的地方。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江不厌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值