词法分析器

本来说觉得编译原理考的太烂了,按当时老师说写个词法分析器可以期末加几分,我就抽空做了,但是做完了却懒得去找老师了演示了。。。
其实词法分析器的作用就是将一段高级语言代码按照既定的规则转换为低级语言的单词,以便于接下来对这些单词的解释和编译。

一、设计单词表

二、构建状态转换图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;
#

五、测试结果

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值