GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 439|回复: 31
收起左侧

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

[复制链接] |关注本帖

寻觅眼镜蛇图腾香喷喷的烤鸡牧羊人GM論壇榮譽勛章山猫图腾猎鹰图腾

    这段代码是一个完整的**词法分析器(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

    评分

    参与人数 1血液 +5 追随 +1 收起 理由
    星之子 + 5 + 1 (*/ω\*)

    查看全部评分

    回复

    使用道具 举报

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

      回复

      使用道具 举报

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

        回复

        使用道具 举报

        枕套幽灵

          回复

          使用道具 举报

          最终幻想XIV最终幻想XVI赛博朋克2077近地夜航官复原职丹妮莉丝·坦格利安重生之境皮尔斯‧尼凡斯

            回复

            使用道具 举报

            白猪猪储蓄罐㊖森林羊男小丑与格雷与星光璀璨寶可夢 Pokémon赛博朋克2077龙腾世纪:审判荒野大镖客:救赎 II

              回复

              使用道具 举报

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

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

                使用道具 举报

                炽天使之拥GHOST幸运女神的微笑官复原职丹妮莉丝·坦格利安普隆普特·阿金塔姆王者之盾骑兽之子不朽之恋赛博朋克2077

                  回复

                  使用道具 举报

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

                    回复

                    使用道具 举报

                    瑞雪兆丰年,生灵万物新光之战士丹妮莉丝·坦格利安小丑与格雷与星光璀璨上古卷轴V:天际堕落之舞没有梦想的咸鱼

                      回复

                      使用道具 举报

                      枕套幽灵白猪猪储蓄罐㊖牧羊人克里斯·埃文斯小丑与格雷与星光璀璨赛博朋克2077

                        回复

                        使用道具 举报

                        金猪猪储蓄罐㊖实现梦想業火死鬥魔法不朽·传奇不熄卡洛斯·奥利维拉白野威十年一梦官复原职男巫之歌永浴爱河

                          回复

                          使用道具 举报

                          喷涌的粪桶大黄蜂(ChevroletCamaro).普隆普特·阿金塔姆御医神兔擎天柱(Peterbilt389).脉律辐石奇怪的宝箱亚当‧简森风雪之家桑克瑞德·沃特斯

                            回复

                            使用道具 举报

                            史莱姆牧场吸血魔蝠蒂法·洛克哈特苏醒的格罗姆圣甲虫秘典可爱黑猫萨菲罗斯夏日柯基龙腾世纪:审判

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

                              使用道具 举报

                              GHOST堕落之舞茉香啤酒神秘商店贵宾卡幻觉超人.赛博朋克2077

                                回复

                                使用道具 举报

                                猩红魔鹫裸体克里斯永远的克叔守护者三角头不朽之恋虚空之海的鲸美恐:新的开始

                                  回复

                                  使用道具 举报

                                  赛博朋克2077亚当‧简森克里斯·埃文斯擎天柱(Peterbilt389).超人.大黄蜂(ChevroletCamaro).嗜血斩首斧山猫图腾

                                    回复

                                    使用道具 举报

                                    幸运女神的微笑不洁圣子安德森‧戴维斯.粉猪猪储蓄罐㊖小丑与格雷与星光璀璨大天使之杖杰森‧斯坦森.『逆境中的幸运女神』御医神兔

                                      回复

                                      使用道具 举报

                                      金猪猪储蓄罐㊖炼金之心魔眼护符骑兽之子召唤古代战士近地夜航元气菠菜人烈焰天使弓龙血指环『灰域来音』

                                        回复

                                        使用道具 举报

                                        『还乡歌』里昂‧S‧甘乃迪闪耀的魔仙棒巴基超人.汤姆·赫兰德.火柴 - Gamemale

                                          回复

                                          使用道具 举报

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

                                          本版积分规则

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

                                          GMT+8, 2024-11-15 12:40 , Processed in 0.165158 second(s), 143 queries , Redis On.

                                          Copyright © 2013-2024 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表