编译原理 词法分析(可处理注释)代码实现

实验目的

主要是为了区分4种词(保留字(包括自定义字)、数字、字母、比较符),建立并输出token和符号表。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

编译原理词法分析 Python语言实现、代码简洁且易懂

lookup_dic = {'begin': 1,   'if': 2,    'then': 3,  'while': 4, 'do': 5,    'end': 6,
              '+': 13,      '-': 14,    '*': 15,    '/': 16,    ':': 25,    ':=': 18,
              '<': 20,      '<>': 21,   '<+': 22,   '>': 23,    '>=': 24,   '=': 25,
              ';': 26,      '(': 27,    ')': 28,    '#': 0}
#{key:value}
def emit(value, type_str):
    emit_index = ''
    emit_value = value
    if type_str == 'num':
        emit_index = '11'
    elif type_str == 'word':
        if value in lookup_dic.keys():
            emit_index = str(lookup_dic[value])
        else:
            emit_index = '10'
            emit_value = '\''+value+'\''
    elif type_str == 'symbol':
        emit_index = str(lookup_dic[value])
    print('(' + emit_index + ',' + emit_value + ')', end = ' ')


def lex(input_str):
    i = 0
    while input_str[i] != '#':
        char = input_str[i]
        #处理注释
        if char == '/':
            if input_str[i+1] == '/':
                i+=1
                while input_str[i+1] != '\n':
                    i+=1
            elif input_str[i+1] =='*':
                i+=1
                while input_str[i] != '*' or  input_str[i+1] != '/':
                    i+=1
                i+=1
        #空格:pass
        elif char == ' ' or char == '\t' or char == '\n':
            pass
        #数字:查看下一个是否为数字 输入num类型
        elif char.isdigit():
            num_str = char
            while input_str[i+1].isdigit():
                i += 1
                num_str += input_str[i]
            emit(num_str, 'num')
        #字符类型:
        elif char.isalpha():
            word_str = char
            #检查是否input_str[i + 1]为数字与字母组成 是则拼接
            while input_str[i + 1].isalnum():
                i += 1
                word_str += input_str[i]
            emit(word_str, 'word')
        #关键字类型
        elif char in lookup_dic.keys():
            symbol_str = char
            #循环判断下一个字符是否也为关键字 是则拼接
            while input_str[i+1] in lookup_dic.keys() and input_str[i+1] != '/':
                i += 1
                symbol_str += input_str[i]
            emit(symbol_str, 'symbol')

        i += 1
    emit('#', 'symbol')


input_str = 'begin x:=9;/*dsfdsa*/int lsd;if x>0 then x:=2*x+1/3;end#'
lex(input_str)



with open('c_program.txt','r') as f:
    str1 = f.read()
    print(str1)
print(lex(str1))

参考博客:https://blog.csdn.net/weixin_41405111/article/details/103776748
添加了注释处理的代码
适用于华南农业大学数学与信息学院编译原理实验课

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值