python实现词法分析器

基于python3 实现一个简单的词法分析器。

主要使用的库:正则表达式、tkinter

识别关键字,标识符,运算符,分界符,数字(整数和浮点数)

当以数字开头时报错,标识符超过8个字符长度时报错

运行结果如下:

词法分析器结果

 有gui界面的源码:

import tkinter as tk
from typing import NamedTuple
import re

class Token(NamedTuple):
    type: str
    value: str
    line: int
    column: int

def tokenize(code):
    keywords = {'if', 'int', 'char', 'for', 'while', 'do', 'return', 'break', 'continue', 'goto', 'float'}
    token_specification = [
        ('NOTES', r'\/\*[\s\S]*\*\/|\/\/.*'),  # 跳过注释
        ('ERROR', r'[0-9]+[A-Za-z_]+|[A-Za-z_]+[@#$%^&?]+[A-Za-z0-9_]*'),  # 标识符不能以数字开头
        ('NUMBER', r'\d+(\.\d*)?'),  # 识别数字
        ('ASSIGN', r'='),  # 赋值运算
        ('END', r';'),
        ('ID', r'[A-Za-z0-9_]+'),  # 识别标识符
        ('OP', r'[+\-*/><]+[+-=]*?'),  # 算术运算符
        ('NEWLINE', r'\n'),  # 行结束
        ('SKIP', r'[ \t]+'),  # 跳过空格和制表符
        ('SEP', r'[#{}"\'!(),\.]'),  # 符号
        ('MISMATCH', r'.'),  # 其他任何字符

    ]
    tok_regex = '|'.join('(?P<%s>%s)' % pair for pair in token_specification)
    line_num = 1
    line_start = 0
    for mo in re.finditer(tok_regex, code):
        kind = mo.lastgroup
        value = mo.group()
        column = mo.start() - line_start
        if kind == 'ERROR':
            kind = f'在第{line_num}行附近发生错误'
        elif kind == 'NUMBER':
            value = float(value) if '.' in value else int(value)
            kind='NUMBER'
        elif kind == 'ID':
            if value in keywords:
                kind = "KEYWORDS"
            elif len(str(value)) > 8:
                kind = f'在第{line_num}行附近发生错误'
            else:
                if s == 'ID':
                    kind = f'在第{line_num}行附近发生错误'
                else:
                    kind = 'ID'
        elif kind == 'NEWLINE':
            line_start = mo.end()
            line_num += 1
            continue
        elif kind == 'SKIP' or kind == 'NOTES':
            continue
        elif kind == 'MISMATCH':
            # raise RuntimeError(f'{value!r} unexpected on line {line_num}')
            kind = f"在第{line_num}行附近发生错误"
        # print(Token(kind, value, line_num, column))
        s = kind
        yield Token(kind, value, line_num, column)

# statements = '''
#     //这是一个测试文档
# #include <stdio.h> //这是编译预处理指令
# int main(){
#     int 1a,ch@ch,a2,sddssdsfsfsfsffsfsfsfsdfsf
#     a = 10.0
#     if int=0;
#     b=a+20
#     printf("Hello, World!"); //输出所指定的一行信息
#     return 0; //函数执行完毕时返回函数值0
# }
# /*这是*/
# '''
# for token in tokenize(statements):
#     print(token)

window=tk.Tk()
window.title('词法分析器')
window.geometry('900x750')

lab1=tk.Label(height=1,text='输入')
lab1.grid(row =1,column=1)
lab2=tk.Label(height=1,text='输出')
lab2.grid(row =1,column=2)

t1=tk.Text(window,width=60,height=50)
t1.grid(row =2,column=1)
t2=tk.Text(window,height=50)
t2.grid(row =2,column=2)

s=''
# 进入词法分析
def insertText():
    global s
    s=t1.get('1.0', 'end-1c')
    t=tokenize(s)
    t2.delete("1.0", "end")
    # print(token)
    for token in tokenize(s):
        # print(token)
        st=f"{token[0]}\t"+f"{token[1]}\t"+f"在{token[2]}行"
        t2.insert(tk.END,st)
        t2.insert(tk.END, "\n")

b1=tk.Button(window,text="词法分析",width=12,height=2,command=insertText)
b1.grid(row =3,column=2)

# 重置
def clearText():
    t1.delete("1.0", "end")
    t2.delete("1.0", "end")

b2=tk.Button(window,text="重置",width=12,height=2,command=clearText)
b2.grid(row =3,column=1)


window.mainloop()

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的 Python 词法分析器实现的示例代码: ``` import re # 定义关键字和运算符 keywords = ['if', 'else', 'while', 'for', 'int', 'float', 'bool', 'true', 'false'] operators = ['+', '-', '*', '/', '=', '==', '!=', '<', '>', '<=', '>='] # 定义词法分析函数 def lexer(input_string): tokens = [] current_token = '' for char in input_string: if char.isspace(): if current_token: tokens.append(current_token) current_token = '' elif char in operators: if current_token: tokens.append(current_token) current_token = '' tokens.append(char) else: current_token += char if current_token: tokens.append(current_token) return tokens # 定义测试字符串 test_string = 'if (x > 0) { y = 2 * x; } else { y = -2 * x; }' # 进行词法分析 tokens = lexer(test_string) # 输出结果 print(tokens) ``` 这个代码实现了一个简单的词法分析器,可以将输入的字符串分解成一个个 token。在这个示例中,我们定义了关键字和运算符,然后遍历输入字符串,将其分解成一个个 token。如果遇到空格,就将当前的 token 添加到 tokens 列表中;如果遇到运算符,就将当前的 token 添加到 tokens 列表中,并将运算符也添加到 tokens 列表中;否则就将当前字符添加到当前的 token 中。最后,如果当前的 token 不为空,就将其添加到 tokens 列表中。 这个示例只是一个简单的实现,实际上词法分析器还需要处理更多的情况,比如注释、字符串、数字等等。但是这个示例可以作为一个入门的参考。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值