使用lex编写一个C语言的词法分析器
时间: 2024-05-15 10:15:13 浏览: 112
基于LEX的C语言词法分析器
下面是一个简单的C语言词法分析器,使用lex编写:
```
%{
#include <stdio.h>
%}
/* 定义关键字 */
int KEYWORDS = 0;
%option noyywrap
/* 定义正则表达式 */
DIGIT [0-9]
LETTER [a-zA-Z]
IDENTIFIER {LETTER}({LETTER}|{DIGIT})*
NUMBER {DIGIT}+(\.{DIGIT}+)?(E[+-]?{DIGIT}+)?
%%
/* 忽略空格、制表符、回车等 */
[ \t\n\r] ;
/* 定义关键字 */
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 { KEYWORDS++; return KEYWORD; }
/* 定义操作符 */
\+\+|--|==|!=|<=|>=|&&|\|\||<<|>>|\+|-|\*|/|%|<|>|=|!|~|&|\||\^|<<=|>>=|&=|\|=|\^=|\+=|-=|\*=|/=|%= { return OPERATOR; }
/* 定义分隔符 */
,|;|:|\?|\[|\]|\(|\)|\{|\} { return SEPARATOR; }
/* 定义标识符 */
{IDENTIFIER} { return IDENTIFIER; }
/* 定义数字 */
{NUMBER} { return NUMBER; }
%%
int main(int argc, char **argv)
{
yylex();
printf("Keywords: %d\n", KEYWORDS);
return 0;
}
```
这个词法分析器可以识别C语言中的关键字、操作符、分隔符、标识符和数字,并统计关键字的个数。在使用时,需要安装flex工具,并执行以下命令编译:
```
flex c_lexer.l
gcc lex.yy.c -lfl -o c_lexer
```
然后运行c_lexer即可。
阅读全文