Lex和Yacc的入门


lex和yacc简介

lex和yacc是自动编译C代码的工具,适合于解析简单语言.这些工具常用于编译器或者解释器的组成部分,或者用于读取配置文件.“lex”和“yacc”这两个名字所代表的也包括这些工具的 GNU 版本 flex 和 bison. lex 和 yacc 是一对配对工具。lex 将文件分解为成组的“记号(tokens)”,大体上类似于单词。yacc 接受 成组的记号,并将它们装配为高层次的结构,类似于句子。yacc 设计用来处理 lex 的输出,不过您也可以 编写自己的代码来完成此任务。同样,lex 的输出很大程度上设计用于为某类解析器提供数据。

lex使用

Lex语法分析

yacc使用

实例应用

使用的是linux系统下的flex和bison,它们是lex和yacc的加强版.
calculator.l的源码

%{  
#include <stdio.h>  
#include "y.tab.h"  

int  
yywrap(void)  
{  
    return 1;  
}  
%}  
%%  
"+"             return ADD;  
"-"             return SUB;  
"*"             return MUL;  
"/"             return DIV;  
"\n"            return CR;  
([1-9][0-9]*)|0|([0-9]+\.[0-9]*) {  
    double temp;  
    sscanf(yytext, "%lf", &temp);  
    yylval.double_value = temp;  
    return DOUBLE_LITERAL;  
}  
[ \t] ;  
. {  
    fprintf(stderr, "lexical error.\n");  
    exit(1);  
}  
%%

calculator.y源码

%{  
#include<stdio.h>  
#include<stdlib.h>  
#define YYDEBUG 1  
%}  
%union {  
int int_value;  
double double_value;  
}  
%token <double_value> DOUBLE_LITERAL  
%token ADD SUB MUL DIV CR  
%type <double_value> expression term primary_expression  
%%  
line_list  
    : line  
    | line_list line  
    ;  
line  
    : expression CR  
    {  
        printf(">>%lf\n",$1);  
    }  
expression  
    : term  
    | expression ADD term  
    {  
        $$=$1+$3;  
    }  
    | expression SUB term  
    {  
        $$=$1-$3;  
    }  
    ;  
term  
    : primary_expression  
    | term MUL primary_expression  
    {  
        $$=$1*$3;  
    }  
    | term DIV primary_expression  
    {  
        $$=$1/$3;  
    }  
    ;  
primary_expression  
    : DOUBLE_LITERAL  
    ;  
%%  
int  
yyerror(char const *str)  
{  
    extern char *yytext;  
    fprintf(stderr,"parser error near %s\n",yytext);  
    return 0;  
}  
int main(void)  
{  
    extern int yyparse(void);  
    extern FILE *yyin;  

    yyin=stdin;  
    if(yyparse()){  
        fprintf(stderr,"Error! Error! Error!\n");  
        exit(1);  
    }  
}
操作命令
$bison -ydv calculator.y
$flex calculator.l
$gcc -o calc y.tab.c lex.yy.c
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值