Lex&Yacc词法语法分析二者结合

来源:互联网 发布:面试linux运维故障处理 编辑:程序博客网 时间:2024/05/20 03:46
在网上我是没有找到这二者结合编译完成的命令和操作,下面写个引用一个列子来说明:
首先是vim 一个lex文件name.l,如
%{
#include "y.tab.h"
#include <stdio.h>
#include <string.h>
extern char* yylval;
%}
char [A-Za-z]
num [0-9]
eq [=]
name {char}+
age {num}+
%%
{name} { yylval = strdup(yytext);
return NAME; }
{eq} { return EQ; }
{age} { yylval = strdup(yytext);
return AGE; }
%%
int yywrap()
{
return 1;
}
然后是name.y文件
%{
typedef char* string;
#define YYSTYPE string
%}
%token NAME EQ AGE
%%
file : record file
| record
;
record : NAME EQ AGE {
       printf("%s is %s years old!!!\n", $1, $3);
 }
;
%%
int main()
{
yyparse();
return 0;
}
int yyerror(char *msg)
{
       printf("Error encountered: %s \n", msg);
}
下面是使用GNU下的工具lex和yacc进行构造可执行文件
$yacc -d name.y
生成y.tab.c和y.tab.h两个文件,-d选项是将y.tab.h文件被创建在该目录下
$flex name.l
$cc lex.yy.c y.tab.c -o name
这样便产生名为name的可执行文件,使用如下
先要编辑一个文件,这里取名为name.txt,内容为
wang = 23
xuzhh=23
yeyan = 22
$./name <name.txt
  wang is 23 years old!!!

xuzhh is 23 years old!!!

  yeyan is 22 years old!!!
是不是觉得已经写了个简单的编译器呢