【自制】【Python】【编译原理】词法分析器和语法分析器
这段代码是一个完整的**词法分析器(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`方法在遇到无法处理的词法单元或未定义的解析表条目时也会抛出异常。
### 总结
该代码实现了一个从词法分析到语法解析的完整流程,将源代码解析为语法树。
static/image/hrline/5.gif
static/image/hrline/5.gif
非常普通的代码,学过一些编译原理的计科生都会写
由于源代码是用python写的,运行会很慢
主要是针对JavaScript写的分析器,不过非常简陋
按理说应该再写一个语义分析器的(编译器的前端:1、词法分析器->2、语法分析器->3、语义分析器),但是代码已经太长了,已经花了我一周时间来测试,抽不出时间来接着写
static/image/hrline/5.gif
static/image/hrline/5.gif
大家问我为什么这几星期怎么不在?因为缺钱了,所以去接单写代码去了
static/image/hrline/5.gif
static/image/hrline/5.gif
关于小说的问题,我会继续写的,我不可能要断更
看不懂但支持,楼主加油哇https://img.gamemale.com/album/202410/17/232221fykmdblkvvst7fl4.gif 在泥潭甚至能够学到编译原理的知识 天惹,还能学python和js,泥潭神通广大 感觉好厉害,不是很能看明白 我靠,泥潭真的能学到东西啊,超绝编程( ̄﹃ ̄) 在编译原理课上面听过,但是早就忘了,后来确实也用不到这些知识 泥潭的code大佬也是越来越多了捏~
感谢分享 阿巴阿巴(´×ω×`)咱……咱只是来催更滴~不过在工作中些小说也不容易哇 好详细的教程,感觉泥潭迟早能凑出一篇完整的基础编程教学 泥潭真素人才济济,我也要继续学习了! 语法分析什么的,感觉看起来好专业的帖子。 这个看起来还挺专业的 感觉在大学的python a课程里面学到过,不过都不记得的,现在只会chat4直接写需求了,对于审计来说完全够用了 计科生表示怎么来泥潭都没逃过:Q 看着很不错的技术含量的说~可惜这些都随着大学毕业抛脑后了 还是要喂饱自己先的,小说等有灵感和空闲再续也好 技术贴,科普帖?真是五八八门的知识都能get 额,说不定以后可能会用到呢 教教接单写代码惹,怎么才能接到单子咩,好想赚钱喵