python写了个词法解析器,没写完,记录一下

该代码实现了一个简单的词法解析器,用于处理包含特定符号、保留字和括号的输入字符串。它识别双引号、单引号、注释以及不同类型的括号,并检查它们的正确匹配。如果遇到语法错误,如括号不匹配或在不应出现的地方使用保留字,程序会返回错误信息。
摘要由CSDN通过智能技术生成

def 词法解析(输入:str):
    输入=list(输入)
    符号=["+","-",",",";","*","/","=","<",">",")","(","[","]","{","}","|","!","&"]
    保留字=["if","else","while","break","return"]
    无双引号=True
    无单引号=True
    无转义符=True
    输出=[]
    i=len(输入)
    字符=[]
    while i!=0:
        i=i-1
        if 输入[0]=='"' and 无单引号 and 无转义符:
            无双引号=not 无双引号
            if len(字符)!=0:
                if 无双引号:
                    输出.append((''.join(字符)).strip())
                else:
                    输出.append(''.join(字符))
                字符=[]
            输出.append('"')
        elif 输入[0]=="'" and 无双引号 and 无转义符:
            无单引号=not 无单引号
            if len(字符)!=0:
                if 无单引号:
                    输出.append((''.join(字符)).strip())
                else:
                    输出.append(''.join(字符))
                字符=[]
            输出.append("'")
        elif 输入[0]=="#":
            if "\n" in 输入:
                a=输入.index("\n")
                i=i-a
                del 输入[0:a]
            else:
                break
        elif 输入[0] in 符号 and 无单引号 and 无双引号:
            if len(字符)!=0:
                输出.append((''.join(字符)).strip())
                字符=[]
            输出.append(输入[0])
        else:
            if 无双引号 and 无单引号 and 输入[0]!="\n":
                字符.append(输入[0])
            elif (not 无双引号) or (not 无单引号):
                字符.append(输入[0])
        无转义符=True
        if 输入[0]=="\\" and 无转义符:
            无转义符=False
        del 输入[0]
    输入=输出.deepcopy()
    输出=[]
    if 无双引号 and 无单引号 and 无转义符:
        无双引号=True
        无单引号=True
        类型='无'
        包围层级=['']
        i=0
        m=len(输入)
        左包围符号=["(","[","{"]
        右包围符号=[")","]","}"]
        while i!=m:
            if (输入[i] in 保留字) and 无单引号:
                if 包围层级[-1]=='(' or 包围层级[-1]=='[':
                    print("\033[1m\033[5m\033[31m错误:\n  词法解析器报错:\n    您不能再索引或参数中使用命令!\n错误代码:1\033[0m")
                    return [False,1]
                else:
                    #
            elif (输入[i] in 左包围符号) and 无双引号 and 无单引号:
                包围层级.append(输入[i])
            elif (输入[i] in 右包围符号) and 无双引号 and 无单引号:
                if 包围层级[-1]==输入[i]:
                    del 包围层[-1]
                    #
                else:
                    print("\033[1m\033[5m\033[31m错误:\n  词法解析器报错:\n    括号(();[];{})使用错误,您不能这样使用!\n错误代码:3\033[0m")
                    return [False,3]
        #数 字符 代码段 索引 算符 命令 参数
    else:
        print("\033[1m\033[5m\033[31m错误:\n  词法解析器报错:\n    引号使用错误或者转义符号使用错误,您可能少加了一个引号或在末尾加了转义符号!\n错误代码:0\033[0m")
        return[False,0]
    return 输出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值