Cminus 词法分析器实现与解析

需积分: 9 4 下载量 121 浏览量 更新于2024-09-15 收藏 9KB TXT 举报
"Cminus词法分析的实现及原理" Cminus是一种简单的编程语言,它的词法分析是编译器设计中的重要步骤。词法分析器(Scanner或Lexer)负责将源代码分解成一个个有意义的符号,称为“标记”(Token)。在给定的描述中,词法分析器是使用C语言编写,并且基于Visual Basic C++软件环境。下面将详细解释Cminus词法分析的相关知识点。 1. **标记类型(Token Type)**: 在Cminus中,有`ALLTOKEN27`个不同的标记类型,包括结束文件(ENDFILE)、错误(ERROR)以及一些保留关键字如`IF`, `ELSE`, `INT`, `RETURN`, `VOID`, `WHILE`等。还有标识符(ID)、数字(NUM)、算术运算符(PLUS, MINUS, TIMES, OVER)以及比较运算符(GT, LT, GTEQ, LTEQ, EQ, NEQ)等。此外,还包括赋值运算符(ASSIGN)、单行注释标记(SMIT)、逗号(COMMA)、左大括号(LKUO)、右大括号(RKUO)、下标访问(LINDEX, RINDEX)、指针访问(LDA, RDA)以及分隔符(LCOMM, RCOMM)。 2. **词法分析器函数**: - `InitScan(char*filename)`:这个函数用于初始化词法分析器,它接收一个文件名作为参数,打开该文件并准备开始读取源代码。 - `token_type GetToken(void)`:这个函数是核心的词法分析函数,它会返回下一个词法标记。 - `void PrintToken(token_type token, const char* tokenString)`:这个函数用于打印识别出的标记及其对应的字符串形式,便于调试和理解。 3. **缓冲区管理**: 为了处理输入流,程序定义了两个缓冲区`lineBuf`和`token_str`。`lineBuf`用于存储当前行的字符,而`linepos`记录当前读取位置,`bufsize`记录缓冲区已读取的字符数。 4. **状态机**: 在词法分析过程中,程序使用一个枚举类型`state_type`来表示分析状态,例如`START`(开始)、`INNUM`(读取数字)、`INID`(读取标识符)、`DONE`(完成)、`INCOMMENT`(处理注释)等。状态机根据当前字符和已知的规则切换状态,以识别不同类型的标记。 5. **保留字查找(reserved_lookup)**: `reserved_lookup(char *s)`函数用于检查输入的字符串是否为Cminus的保留关键字,并返回相应的标记类型。 6. **字符获取与回退**: `GetChar()`函数用于从输入流中获取下一个字符,而`UngetChar()`则允许将字符放回,这在处理错误或需要回溯时非常有用。 7. **词法分析流程**: 词法分析通常遵循以下步骤: - 从输入源读取字符。 - 检查字符是否为空白、注释或结束标志,如果是,则跳过。 - 如果字符是数字或标识符的首字符,开始收集这些信息直到遇到非数字或非字母字符。 - 对于保留关键字,通过`reserved_lookup`函数查找匹配。 - 对于运算符和其他特殊符号,直接识别并返回对应的标记类型。 8. **实现细节**: 在给定的代码片段中,可以看到使用了枚举类型`token_type`来表示标记类型,数组`reserved_words`存储了所有保留关键字及其对应的标记类型。通过这种方式,词法分析器可以快速判断一个字符串是否为保留关键字。 总结,Cminus的词法分析器是编译器的第一步,它解析源代码,识别出关键字、标识符、数字、运算符等,为后续的语法分析和语义分析提供基础。理解并实现这样的词法分析器对于学习编译原理和语言设计非常重要。
2019-06-12 上传
1. 课程设计目标 实验建立C-编译器。只含有扫描程序(scanner)和语法分析(parser)部分。 2. 分析与设计 C-编译器设计的整体框架,本实验实现扫描处理和语法分析程序(图中粗黑部分)。 2.1 、扫描程序scanner部分 2.1.1系统设计思想 设计思想:根据DFA图用switch-case结构实现状态转换。 惯用词法: ① 语言的关键字:else if int return void while ② 专用符号:+ - * / < >= == != = ; , ( ) [ ] { } /* */ ③ 其他标记是ID和NUM,通过下列正则表达式定义: ID = letter letter* NUM = digit digit* letter = a|..|z|A|..|Z digit = 0|..|9 大写和小写字母是有区别的 ④ 空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM关键字。 ⑤ 注释用通常的C语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套 说明:当输入的字符使DFA到达接受状态的时候,则可以确定一个单词了。初始状态设置为START,当需要得到下一个token时,取得次token的第一个字符,并且按照DFA与对此字符的类型分析,转换状态。重复此步骤,直到DONE为止,输出token类型。当字符为“/”时,状态转换为SLAH再判断下一个字符,如果为“*”则继续转到INCOMMENT,最后以“*”时转到ENDCOMMENT状态,表明是注释,如果其他的则是字符停滞于当前字符,并且输出“/”。 2.1.2程序流程图