python词法分析器
(0)
import re  #正则表达式的库
#保留字,一共包含了c中的6个关键字
key_word = ['int','main','printf','return','whlie','if','scanf']
#运算符和界符
operator = ['(', ')', '{', '}', ',', ';', '"', '%', '&','+', '=', '>', '<', '-', '*' ]
bosy = ['>=','<=','==']
with open('cpp.txt', 'w') as file:
    print("请输入需要进行词法分析的源程序:")
    #txt = sys.stdin.readlines()
    sentinel = '#'   # 遇到这个就结束
    lines = []
    for line in iter(input, sentinel):
        lines.append(line)
    file.writelines(lines)
with open('cpp.txt', 'r') as file:
        #预处理,增加了去除字符串的功能,毕竟字符串肯定不是标识符啊……        
        txt = ' '.join(file.readlines())
        #在一个字符串中替换所有匹配正则表达式的子串,返回替换后的子串
        #r代表原始字符串常量,用于处理正则表达式时,规避反斜杠的转义。
        #re.sub 实现正则表达式的替换
        ##去除两边空格
        deal_txt = txt.strip()
        ##替换制表符为空值
        deal_txt = deal_txt.replace('\t', ' ').replace('\r', ' ').replace('\n', ' ')
        #词法分析,标识符识别规则加入了_
        keyword = []
        opeword = []
        boword = []
        idword = []
        numword = []
        errword = []
        #返回string(deal_txt)中所有与pattern(第一个变量)匹配的全部字符串,返回形式为数组。
        pha = re.findall(r'[a-zA-Z_][a-zA-Z0-9_]*', deal_txt)
        num = re.findall(r'\d+',deal_txt)
        str = re.findall(r'[^\w]', deal_txt)
        bo = re.findall(r'>=|<=|==', deal_txt)
        fnum=re.findall(r'\d+\.?\d*e?-?\d*?','5')
        for k in pha:
            if k in key_word:
                keyword.append({k : key_word.index(k) + 1})
            else:
                #因为前面一共有关键字加函数一共有4个。
                idword.append({k : 8})
        for n in num:
            numword.append({n : 9})
        for s in str:
            if s in operator:
                opeword.append({s: len(key_word) + operator.index(s) + 3})
            elif s != ' ':
                errword.append({s : 'ERROR'})
        for i in bo:
            if i in bosy:
                boword.append({i: len(key_word) + len(operator) +bosy.index(i) + 3})
        print("保留字:\n", keyword)
        print("标识符:\n", idword)
        print("数字常量:\n", numword)
        print("界符和操作符:\n", opeword+boword)
        print("界符和操作符:\n", fnum)
        if len(errword) != 0:
            print("error:\n", 28)
        
本文为作者valive发布,未经允许禁止转载!
上一篇 下一篇
评论
评论已关闭 >_<

评论已关闭