程序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是用于提交单词的,即把识别得到的单词加入单词流中。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。