GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 1342|回复: 46
收起左侧

[技术交流] 【自制】【Python】【编译原理】词法分析器和语法分析器

  [复制链接] |关注本帖

邪恶的面具堕落之舞风雪之家香喷喷的烤鸡眼镜蛇图腾寻觅牧羊人

     楼主| 白冥 发表于 2024-11-14 21:14:16 | 显示全部楼层 |阅读模式 |取消关注该作者的回复
    这段代码是一个完整的**词法分析器(Lexer)**和**语法分析器(Parser)**的实现,分为以下几个关键部分:

    ### 1. **Token 类**
    - `Token`类用于表示一个词法单元,包括`type`和`value`两个属性,用于标识词法单元的类型和其原始字符串。

    ### 2. **Lexer 类**
    - `Lexer`类用于对输入代码进行词法分析,将其分解为一系列词法单元(tokens)。
    - `token_regex_patterns`属性定义了多种正则表达式模式,每个模式都对应一种词法单元类型,例如注释、字符串、布尔值、关键字、操作符等。
    - `tokenize`方法是词法分析的核心。它通过匹配正则表达式模式来生成词法单元列表。
      - 每次匹配一个词法单元后,将其存入`token_list`,并移除已匹配的源代码部分,直到源代码处理完毕。
      - `_unescape_string`方法用于处理字符串中的转义字符,如`"\n"`、`"\t"`等。

    ### 3. **ASTNode 类**
    - `ASTNode`类表示一个语法树节点,包括节点符号(symbol)和子节点(children)。
    - 提供了`insert_child`方法,用于向节点添加子节点,以及`print_ast`方法递归打印语法树结构。

    ### 4. **Parser 类**
    - `Parser`类用于根据定义的上下文无关文法将词法单元序列解析为语法树(AST)。
    - `grammar_production`属性定义了语法产生式规则,表示从顶层结构(如`program`)到基本结构的递归展开。
    - `mutually_exclusive`属性用于标识一些可以互斥的结构(例如不同类型的表达式或语句)。
    - `first_set`和`follow_set`用来存储符号的First集和Follow集,辅助生成解析表。
    - `parse_table`是预测解析表,用于决定在语法分析过程中,遇到某个词法单元时应应用的语法规则。
      
    #### 核心解析方法:
    - `parse`方法是解析器的核心,它使用LL(1)解析算法,根据`parse_table`从`token_list`中构建语法树。
      - `stack`维护语法分析中的栈,初始时为`program`,即整个程序的根节点。
      - `node_stack`用于维护AST节点,递归插入符合文法的子节点,生成语法树。
      - `parse_table`指导栈在遇到特定的`top`和`current_token`时,决定展开哪一个文法产生式。
    - `_get_first_set`和`_get_follow_set`方法用于构建First集和Follow集。
    - `_get_parse_table`使用First集和Follow集生成解析表。

    ### 5. **错误处理**
    - `Lexer`类的`tokenize`方法在无法匹配任何模式时抛出异常,指出无法解析的字符。
    - `Parser`类的`parse`方法在遇到无法处理的词法单元或未定义的解析表条目时也会抛出异常。

    ### 总结
    该代码实现了一个从词法分析到语法解析的完整流程,将源代码解析为语法树。







    非常普通的代码,学过一些编译原理的计科生都会写

    由于源代码是用python写的,运行会很慢
    主要是针对JavaScript写的分析器,不过非常简陋
    按理说应该再写一个语义分析器的(编译器的前端:1、词法分析器->2、语法分析器->3、语义分析器),但是代码已经太长了,已经花了我一周时间来测试,抽不出时间来接着写








    大家问我为什么这几星期怎么不在?因为缺钱了,所以去接单写代码去了







    关于小说的问题,我会继续写的,我不可能要断更


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    评分

    参与人数 2血液 +8 追随 +2 堕落 +1 收起 理由
    owen135 + 3 + 1 + 1 神马都是浮云
    星之子 + 5 + 1 (*/ω\*)

    查看全部评分

    回复

    使用道具 举报

    龙腾世纪:审判最终幻想XVI最终幻想XIV赛博朋克2077瑞雪兆丰年,生灵万物新眼镜蛇图腾御医神兔山猫图腾

      看不懂但支持,楼主加油哇
        收起(2)
      回复

      使用道具 举报

      炼金之心十字军护盾诡异的灵魂石我的冶金打火机不曾寄出的信件成年独角兽苏醒的格罗姆落雪勇者与龙的传说-封面

        BDonde 发表于 2024-11-14 21:30:42 | 显示全部楼层 |取消关注该作者的回复
        回复

        使用道具 举报

        特殊-家园卫士Ⓛ枕套幽灵特殊-家园卫士Ⓡ爬行植物Ⓛ『樱花树灵』爬行植物Ⓡ丹雀衔五穗,人间始丰登丹妮莉丝·坦格利安官复原职月光骑士

          回复

          使用道具 举报

          最终幻想XIV最终幻想XVI赛博朋克2077塞巴斯蒂安·斯坦杰森‧斯坦森丹妮莉丝·坦格利安希尔瓦娜斯·风行者官复原职

            回复

            使用道具 举报

            寶可夢 Pokémon小丑与格雷与星光璀璨森林羊男赛博朋克2077龙腾世纪:审判荒野大镖客:救赎 II瑞雪兆丰年,生灵万物新

              回复

              使用道具 举报

              百相千面-晦永远的克叔業火死鬥实现梦想官复原职虚空之海的鲸Zootopia幸运女神的微笑『逆境中的幸运女神』御医神兔

                在编译原理课上面听过,但是早就忘了,后来确实也用不到这些知识
                回复

                使用道具 举报

                SCP-s-1889-第二页炽天使之拥幸运女神的微笑朴素的誓言官复原职丹妮莉丝·坦格利安普隆普特·阿金塔姆克莱夫・罗兹菲尔德骑兽之子不朽之恋

                  回复

                  使用道具 举报

                  我的天使GM吸血伯爵吃饱金币的Doge阿拉喵?神灯和你一起飞行的皮卡丘小小舞台永浴爱河

                    回复

                    使用道具 举报

                    超人塞巴斯蒂安·斯坦丹妮莉丝·坦格利安希尔瓦娜斯·风行者骑士遗盔上古卷轴V:天际龙腾世纪:审判赛博朋克2077

                      回复

                      使用道具 举报

                      羅素·托維史蒂文杰森‧斯坦森女神之泪诺克提斯·路西斯·伽拉姆BIG BOSSDrover光子之海

                        回复

                        使用道具 举报

                        实现梦想業火死鬥魔法不朽·传奇不熄卡洛斯·奥利维拉白野威十年一梦官复原职男巫之歌永浴爱河虚空之海的鲸

                          Burry 发表于 2024-11-14 22:22:14 | 显示全部楼层 |取消关注该作者的回复
                          回复

                          使用道具 举报

                          『户口本: Lv7+』大黄蜂(ChevroletCamaro)远古石碑天灾骑士十字军护盾力量腕带诺克提斯·路西斯·伽拉姆黑暗消融刀锋女王 - 归宿叶卡捷琳娜大帝

                            回复

                            使用道具 举报

                            史莱姆牧场吸血魔蝠萨菲罗斯苏醒的格罗姆圣甲虫秘典可爱黑猫诺克提斯·路西斯·伽拉姆夏日柯基美恐:新的开始

                              感觉在大学的python a课程里面学到过,不过都不记得的,现在只会chat4直接写需求了,对于审计来说完全够用了
                              回复

                              使用道具 举报

                              冬之歌月光骑士丹妮莉丝·坦格利安杰森‧斯坦森荒野大镖客:救赎 II赛博朋克2077

                                回复

                                使用道具 举报

                                猩红魔鹫裸体克里斯黄金树的恩惠极·龙の意不朽之恋和你一起飞行的皮卡丘我的天使纯真护剑『梦旅存根』

                                  回复

                                  使用道具 举报

                                  野兽之子收到情书变骚喷雾亚当‧简森神秘商店贵宾卡千杯不醉马克雷文克劳

                                    枫糖 发表于 2024-11-14 22:35:28 | 显示全部楼层 |取消关注该作者的回复
                                    回复

                                    使用道具 举报

                                    『住在GM村』不洁圣子安德森‧戴维斯诺克提斯·路西斯·伽拉姆小丑与格雷与星光璀璨大天使之杖杰森‧斯坦森『逆境中的幸运女神』御医神兔

                                      回复

                                      使用道具 举报

                                      『住在GM村』珊瑚泡泡鱼不曾寄出的信件小小安全帽魔眼护符骑兽之子近地夜航元气菠菜人烈焰天使弓龙血指环

                                        回复

                                        使用道具 举报

                                        『落樱缤纷』里昂‧S‧甘乃迪闪耀的魔仙棒巴基醉乡民谣超人

                                          boshen 发表于 2024-11-14 23:28:02 | 显示全部楼层 |取消关注该作者的回复
                                          回复

                                          使用道具 举报

                                          您需要登录后才可以回帖 登录 | 立即注册

                                          本版积分规则

                                          文字版|手机版|小黑屋|GameMale

                                          GMT+8, 2024-12-22 10:23 , Processed in 0.166576 second(s), 145 queries , Redis On.

                                          Copyright © 2013-2024 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表