根据提供的文件信息,我们可以深入解析该词法分析器的核心功能及其设计原理。下面将围绕“词法分析源程序(基于mini-C)”这一主题展开详细的知识点介绍。 ### 一、词法分析基础 词法分析是编译过程中的一个重要阶段,其主要任务是对源程序进行扫描,并将其分解为一系列具有特定意义的符号或记号(Token)。这些记号是后续语法分析的基础。 ### 二、记号类型与规则 #### 1. 关键字(keyWord) 在给定的代码中,定义了以下关键字: - `void`:表示无类型的函数返回值。 - `int`:整型数据类型。 - `float`:浮点型数据类型。 - `if`、`else`:条件判断语句的关键字。 - `while`、`for`:循环控制语句的关键字。 - `return`:用于返回函数的结果。 - `break`:跳出循环结构。 - `printf`、`scanf`:标准输入输出函数。 - `main`:主函数的标识符。 #### 2. 特殊符号(specialSymbol) 定义了一些常见的特殊符号,例如: - `&&`、`||`:逻辑运算符。 - `<`、`>`、`<=`、`>=`、`==`、`!=`:比较运算符。 - `=`:赋值运算符。 - `(`、`)`:圆括号。 - `{`、`}`:花括号。 - `;`:语句结束标志。 - `,`:逗号分隔符。 - `.`:成员访问操作符。 - `+`、`-`、`*`、`/`:算术运算符。 - `++`、`--`:自增自减运算符。 #### 3. 数值类型 - `intNum`:表示整数值。 - `floatNum`:表示浮点数值。 #### 4. 标识符(id) 表示变量名、函数名等。 #### 5. 注释(comment) 支持单行注释(`//`)和多行注释(`/* */`)。 #### 6. 字符串(string) 支持字符串常量。 ### 三、词法分析器实现 #### 1. 基本结构 - 使用正则表达式来匹配不同的记号类型。 - 定义了一系列的计数器来统计每种记号出现的次数。 #### 2. 功能模块 - **读取源代码**:通过`yyin`指向源代码文件,使用`fopen`打开文件。 - **词法分析**:调用`yylex`函数执行词法分析过程。 - **统计输出**:在词法分析完成后,输出各种记号的统计信息。 #### 3. 主要逻辑 - 对于每一种记号类型,都有相应的处理逻辑,如计数、打印等。 - 使用`yytext`变量存储当前匹配到的记号文本。 ### 四、示例代码分析 #### 1. 变量初始化 - 初始化多个计数器变量,用于统计不同类型的记号数量。 #### 2. 记号匹配逻辑 - 通过`yylex`函数执行词法分析。 - 每当匹配到一个记号时,都会更新对应的计数器,并打印出该记号的信息。 #### 3. 统计结果输出 - 在词法分析完成后,打印出所有计数器的值,显示每种记号出现的次数。 ### 五、总结 该词法分析器实现了对基于mini-C语言的源代码进行词法分析的基本功能,包括关键字、特殊符号、数值类型、标识符、注释以及字符串的识别与统计。通过对源代码的逐行扫描,它可以有效地将源代码分解成一系列具有特定意义的记号,为后续的语法分析和编译过程打下坚实的基础。
#include<stdio.h>
#include<string.h>
int keyWordCount = 0;
int specialSymbolCount = 0;
int intNumCount = 0;
int floatNumCount = 0;
int idCount = 0;
int commentCount = 0;
int stringCount = 0;
%}
digit [0-9]
letter [a-zA-Z]
keyWord void|int|float|if|else|while|for|return|break|printf|scanf|main
specialSymbol "&&"|"||"|"<="|">="|"=="|"<"|">"|"!="|"="|"("|")"|"{"|"}"|";"|","|"."|"+"|"-"|"*"|"/"|"++"|"--"
intNum {digit}+
floatNum {digit}+\.{digit}+
id {letter}+({letter}|{digit}|[_])*
delim [" "\t\n]
whiteSpace {delim}+
%%
{keyWord} {
keyWordCount++;
printf("keyWord: %s\n", yytext);
}
{specialSymbol} {
specialSymbolCount++;
printf("specialSymbol: %s\n", yytext);
}
{intNum} {
- 粉丝: 5
- 资源: 11
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助