词法分析器 (基本符号表,状态转换图)
引言:编译原理的实验部分是关于编译器的,我决定将这部分的学习和实践过程记录下来,也希望看到这篇文章的有缘人来指正和提出宝贵的意见。
基本符号表
本次实验我通过python语言(十分简单和方便)来实现c语言的词法分析器。首先来建立c语言的基本符号表。通过查找得到以下 大部分的关于c语言的运算符和关键字。
ps:开始我以为main可以是关键字,因为我觉得main作为主函数入口已经是共识。
- 关键字
void | if | else | switch | case | for | long |
---|---|---|---|---|---|---|
do | while | break | return | static | auto | int |
long | float | double | char | struct | short | enum |
typedef | const | unsigned | signed | extern | register | |
goto | continue | sizeof | 其他 |
- 特殊符号和运算符
{ | } | [ | ] | ( | ) | + | ++ |
---|---|---|---|---|---|---|---|
- | – | * | ** | / | // | /* | */ |
! | << | >> | < | > | = | >= | <= |
== | += | -= | *= | /= | != | | | || |
& | && | , | ; | # | . |
- 数值量以及标识符(变量)
在整个的句子中(也就是对应的程序段)除了上述出现的 还要特别重要的也是比较复杂的两种情况:常量和标识符。对应在程序中的声明的变量和个变量赋值的一些数字。在此还要建立一个变量名表来存程序段中的声明的变量以及赋给它的数值。在开始扫描程序的过程中标识符表应该是空的
状态转化表
通过上述的基本符号表来建立状态,对应于在程序中状态的终态是查表。来输出对应的内码值。
ps:终态上的星号代表着回退一个字符
- 标识符和关键字或数值
- 其他情况
ps:对于大多数情况,都要回退一个字符,避免误读错时字符
结束语
给自己的编译原理开篇,我估摸着这门课最终要写一个完整的编译器出来,可能一个需要好几次的文章记录。代码还在写,整个的代码逻辑都和上述的状态转换图有关。代码我正在写中。这一次的代码输出需求是 输入一段程序输出对应 关键字 和符种 还有常量和它的二进制数值 还有变量以及变量的二进制数。代码部分近期会发文章。