WINDOWS下bison和flex的使用

来源:互联网 发布:什么是c语言 编辑:程序博客网 时间:2024/05/16 16:08

以一个简单计算器为例

mycalc.l

%{#include <stdio.h>#include "y.tab.h"intyywrap(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);}%%

mycalc.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    ;                 %%intyyerror(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 --yacc -dv mycalc.yflex mycalc.lgcc -o mycalc y.tab.c lex.yy.c



0 0
原创粉丝点击