理论教育 编译器设计之路:源代码实现

编译器设计之路:源代码实现

时间:2023-11-04 理论教育 版权反馈
【摘要】:程序2-3 Lex.cpp第3行:用于判定单词是否正确的标志,初始置为true。第4行:源程序文本的当前读取位置,初始置为0。第10行:源程序当前行号为1,表示正在处理第1行。第13行:未读到源程序尾并且无出错单词,则继续识别单词。程序2-5 Lex.cpp第3行:在关键字表中查找字符串。程序2-6 Lex.cpp第3行:将单词缓存区的最末一个字符删除,即实现退回一个字符的功能。

编译器设计之路:源代码实现

程序2-2 Lex.h

在一些现代编译器设计中,有时,词法分析器不仅需要记录行号信息,还有可能需要记录列号信息,具体情况视调试器而定。当然,记录列号信息要比行号信息复杂一些,尤其是在有预处理阶段的编译器中。

程序2-3 Lex.cpp

第3行:用于判定单词是否正确的标志,初始置为true。

第4行:源程序文本的当前读取位置,初始置为0。

第6行:读取m_szFileName指定的文件,将文件以字符串形式返回置入m_szSource。

第7行:在m_szSource尾部添加一个空格,以便处理最后一个单词时,也能运用超前搜索识别。

第8行:转换表的开始状态置入m_iNonTerminal,即当前状态。

第9行:单词缓存区清空。

第10行:源程序当前行号为1,表示正在处理第1行。

第11行:单词流清空。

第13行:未读到源程序尾并且无出错单词,则继续识别单词。

第15行:如果当前读入字符是换行符,则将源程序当前行号累加1。

第20行:将当前读字符加入单词缓存区。

第21行:查询当前状态下读取当前字符时的转换状态,当前字符ASCII码大于128时,取128即可。

第27行:当前读取位置后移一个字符。

程序2-4 Lex.cpp

第3行:临时变量初始化为0。

第4行:下一个转入状态等于-99,表示当前状态下不允许读取当前字符,即单词识别出错。

第6行:下一个转入状态小于0,表示当前状态下读取当前字符时进入终止状态,即单词识别完成。

第8行:由于超前搜索识别,单词缓存区、当前读取位置回退一个字符。

第9行:滤去单词缓存区的左右空格。

第10行:终止状态为1,表示当前单词是标识符。

第12行:注意,这里将字符串转成大写的原因是Pascal语言标识符是大小写不敏感的。

第13行:判断当前单词是否为关键字。

第14行:将单词标识为关键字,并加入单词流。(www.daowen.com)

第17行:判断当前单词是否为TRUE/FALSE(布尔常量)。

第18行:将单词标识为常量,并加入单词流,登记常量表。

第20行:将单词标识为标识符,并加入单词流。

第23行:判断当前单词是否为常量。

第24行:将单词标识为常量,并加入单词流,登记常量表。

第25行:判断当前分析的单词是否为界符。

第26行:将单词标识为界符,并加入单词流。

第27行:判断当前单词是否为运算符。

第28行:将单词标识为运算符,并加入单词流。

第29行:判断终止状态是否为-42,在这种情况下,需要处理两次回退。

第31行:单词缓存区、当前读取位置回退一个字符。

第32行:滤去单词缓存区的左右空格。

第33行:将单词标识为整型常量,并加入单词流,登记常量表。

第35行:将单词缓存区清空,准备识别下一个单词。

第36行:将当前状态置为转换表的开始状态。

第40行:下一个转入状态大于或等于0,表示当前状态下读取当前字符时进入非终止状态,即单词未识别完成,将当前状态置为iTag指示的下一个状态。

程序2-5 Lex.cpp

第3行:在关键字表中查找字符串。

第4行:字符串是关键字。

第6行:返回关键字的ID。

程序2-6 Lex.cpp

第3行:将单词缓存区的最末一个字符删除,即实现退回一个字符的功能。

第4行:将当前位置回退一个字符。

程序2-7 Lex.cpp

程序2-6和2-7是用于提交单词的,即把识别得到的单词加入单词流中。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈