用python来实现一个简单的词法分析器

上编译原理课时,老师说可以用同学们可以使用不同的语言写一个词法分析器,于是首先我想到的是python。本来的思路是写一个自动机,用一个指针来表示当前读取的字符,另一个指针往后读,通过不同读取字符的状态用自动机来确定是哪种类别。后面由于python指针好像只要那个seek(),tell()函数好像不是很好操作,于是就想到另一种方法就是使用正则来匹配我们的文件内容,找出我们需要识别的词,同时输出单词的类别!(仅仅提供参考,个人也是个菜鸡!)

题目就是如下:

需要识别的词

  1. 关键字:if、int、for、while、do、return、break、continue;单词种别码为1。
  2. 标识符;单词种别码为2。
  3. 常数为无符号整形数;单词种别码为3。
  4. 运算符包括:+、-、*、/、**、=、:=、<=、<>、<、>=、>单词种别码为4。
  5. 分隔符包括:,、; 单词种别码为5

代码如下:

import re
def cal_character(longtext):
    string_list=re.findall(r'[_a-zA-Z][_a-zA-Z0-9]*',longtext)#匹配出字符串
    keywords=['if','int','for','while','do','return','break','continue']
    for string in string_list:
        if string in keywords:
            print("(1,"+string+")")
        else:
            if string=="":
                continue
            else:
                print("(2,"+string+")")

def cal_number(longtext):
    number_list=re.findall(r'[\d]*',longtext)
    for number in number_list:
        if number!="":
            print("(3,",number+")")

def cal_operator(longtext):
    operators=['+','-','*','/','**','=',':=','<=','<>','<','>=','>']
    for operator in operators:
        try:
            if re.search(f'{operator}',longtext):
                print("(4,",operator+")")
            else:
                continue
        except Exception as e:
            continue


def cal_delimiters(longtext):
    delimiters=[",",":",";","{","}","[","]",'(',')']
    for delimiter in  delimiters:
        try :
            if re.search(f'[{delimiter}]',longtext):
                print("(5,",delimiter+")")
            else:
                continue
        except Exception as  E:
            continue

#以上模块均可以通过正则表达式进行匹配
if __name__ == '__main__':
    with open("cpp.txt",'r')as f:
        text=f.read()
        print(text)
        cal_character(text)
        cal_number(text)
        cal_operator(text)
        cal_delimiters(text)

其实上述代码就是通过定义不同匹配单词类型的函数,如1.字符串类(包含了标识符和关键字)正则匹配到之后可以先判断是否为关键字,剩下的就是标识符。2.数字类,就直接正则匹配就好

3.运算符类,4。界符类

这里用到的都是c语言的关键字.

这里提供一个文本文件.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值