要做出来一个词法分析器
分析的规则有祖传代码可用(
操作环境用linux
因为linux做这些方便一些
/*
*/
%{
#include "stdio.h"
#include "stdlib.h"
%}
INT_DEX [1-9][0-9]*|[0]
INT_HEX [0][Xx]([1-9][0-9]*|[0])
INT_OCT [0][0-7]
FLOAT [0-9]*[.][0-9]+([eE][+-]?[0-9]*|[0])?f?
SEMI [;]
COMMA [,]
ASSIGNOP [=]
RELOP [>]|[<]|[>][=]|[<][=]|[=][=]|[!][=](^[=])
PLUS [+]
MINUS [-]
STAR [*]
DIV [/]
AND [&][&]
OR [|][|]
DOT [.]
NOT [!]
TYPE int|float
LP \(
RP \)
LB \[
RB \]
LC \{
RC \}
STRUCT struct
RETURN return
IF if
ELSE else
WHILE while
SPACE [ \n\t]
ID [a-zA-Z_][a-zA-Z_0-9]*
/*end of definition*/
%%
{SEMI} {
printf("get semmi : %s\n", yytext);
}
{COMMA} {
printf("get comma : %s\n", yytext);
}
{ASSIGNOP} {
printf("get assignop : %s\n", yytext);
}
{INT_DEX} |
{INT_HEX} |
{INT_OCT} {
printf("get an integer: %s\n", yytext);
}
{FLOAT} {
printf("get a float: %s\n", yytext);
}
{PLUS} |
{MINUS} |
{DIV} |
{STAR} {
printf("get an operator: %s\n", yytext);
}
{RELOP} {
printf("get a relop: %s\n", yytext);
}
{AND} |
{OR} |
{NOT} {
printf("get a logic operator: %s\n", yytext);
}
{DOT} {
printf("get a dot: %s\n", yytext);
}
{STRUCT} |
{RETURN} |
{IF} |
{ELSE} |
{WHILE} {
printf("get keyword: %s\n", yytext);
}
{TYPE} {
printf("get type: %s\n", yytext);
}
{LP} |
{RP} |
{LB} |
{RB} {
printf("get brackets : %s\n", yytext);
}
{SPACE} {
/*ABANDON THESE CHARACTORS*/
}
{ID} {
printf("get an ID: %s\n", yytext);
}
{LC} { char c;
do
{ c = input();
if (c == EOF) break;
//if (c == '\n') lineno++;
} while (c != '}');
}
%%
int yywrap() {
return 1;
}
int main(int argc, char** argv) {
if (argc > 1) {
if (!(yyin = fopen(argv[1], "r"))) {
perror(argv[1]);
return 1;
}
}
while (yylex());
return 0;
}
把这个保存成一个.l文件 例如 c.l
执行
flex c.l
然后就会发现多出个 lex.yy.c文件
用gcc编译
gcc lex.yy.c
此时就会发现多了个 a.out 文件
在a.out的路径下
执行
./a.out
就可以正常的输入输出了~
这个代码不能正确识别出EOF
因为识别EOF的模块在{里
{LC} { char c;
do
{ c = input();
if (c == EOF) {
break;
}
//if (c == '\n') lineno++;
} while (c != '}');
}