基于lex的词法分析实验分析c语言
时间: 2023-07-13 17:34:20 浏览: 95
基于Flex实现的C和C++语言的词法分析器【100012898】
下面是一个基于lex的C语言词法分析实验,用于从输入的C源代码中识别并输出关键字、标识符、数字、运算符、界符等词法单元。
输出结果为:
```
Keyword: int
Identifier: main
Delimiter: (
Delimiter: )
Delimiter: {
Keyword: return
Number: 0
Delimiter: ;
Delimiter: }
```
1.创建一个名为“lexer.l”的文件,并添加以下内容:
```
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
%}
// 定义关键字
%option noyywrap
%{
char* keywords[] = {"auto", "break", "case", "char", "const", "continue", "default",
"do", "double", "else", "enum", "extern", "float", "for", "goto",
"if", "int", "long", "register", "return", "short", "signed", "sizeof",
"static", "struct", "switch", "typedef", "union", "unsigned", "void",
"volatile", "while"};
%}
// 定义规则
%%
"/*"([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+"/ {
// ignore comments
}
"//"(.)* {
// ignore comments
}
[0-9]+ {
printf("Number: %s\n", yytext);
}
[a-zA-Z_][a-zA-Z0-9_]* {
int i;
for (i = 0; i < 32; i++) {
if (strcmp(yytext, keywords[i]) == 0) {
printf("Keyword: %s\n", yytext);
break;
}
}
if (i == 32) {
printf("Identifier: %s\n", yytext);
}
}
[ \t] {
// ignore whitespace
}
[\n] {
printf("Newline\n");
}
[(){}\[\];,] {
printf("Delimiter: %s\n", yytext);
}
"+"|"-"|"*"|"/"|"%"|"++"|"--"|"=="|"!="|"<"|">"|"<="|">="|"&&"|"||"|"!"|"&"|"|"|"^"|"<<"|">>" {
printf("Operator: %s\n", yytext);
}
. {
printf("Unknown: %s\n", yytext);
}
%%
int main(int argc, char** argv) {
yylex();
return 0;
}
```
这个实验演示了如何使用lex来识别C语言中的各种词法单元。在规则部分中,使用正则表达式匹配数字、标识符、运算符、界符等不同类型的词法单元。规则部分还包括两个通配符规则,用于忽略注释和空格。在代码部分,定义了一个字符串数组来存储所有的关键字,并使用strcmp函数将识别到的标识符与关键字进行比较,以区分它们。最后,使用yytext变量来访问识别的文本单元。
要使用这个实验,可以按照以下步骤进行操作:
1.将上面的代码保存为“lexer.l”文件。
2.在终端中使用以下命令编译生成的C文件:
```
lex lexer.l
gcc lex.yy.c -o lexer
```
3.运行生成的可执行文件,并输入一些C源代码,例如:
```
int main() {
return 0;
}
```
输出应该类似于上面展示的结果。
阅读全文