使用flex环境的编译原理实验_词法分析器

要做出来一个词法分析器
分析的规则有祖传代码可用(
操作环境用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 != '}');
}

你可能感兴趣的:(odds,and,ends,flex,词法分析,编译原理)