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

在网上我是没有找到这二者结合编译完成的命令和操作,下面写个引用一个列子来说明:
首先是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!!!
是不是觉得已经写了个简单的编译器呢

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值