calc.l
%{
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include "calc.tab.h"
%}
%option noyywrap
%%
([0-9])+|([0-9])*"."([0-9])+ { yylval = atof( yytext ); /*printf("yytext:%s, yylval:%f/n", yytext, yylval);*/ return NUM; }
[ /t]+
"/n" { return '/n'; }
. { return *yytext; }
%%
calc.y
%{
#define YYSTYPE double
#include <math.h>
#include <stdio.h>
int yylex (void);
void yyerror (char const *);
%}
/* Bison declarations. */
%token NUM
%left '-' '+'
%left '*' '/'
%left NEG /* negation--unary minus */
%right '^' /* exponentiation */
%% /* The grammar follows. */
input: /* empty */
| input line
;
line: '/n'
| exp '/n' { printf ("%f/n", $1); }
;
exp: NUM { $$ = $1; /*printf("%f = %f/n", $$, $1);*/ }
| exp '+' exp { $$ = $1 + $3; /*printf("%f = %f + %f/n", $$, $1, $3);*/ }
| exp '-' exp { $$ = $1 - $3; /*printf("%f = %f - %f/n", $$, $1, $3);*/ }
| exp '*' exp { $$ = $1 * $3; /*printf("%f = %f * %f/n", $$, $1, $3);*/ }
| exp '/' exp { $$ = $1 / $3; /*printf("%f = %f / %f/n", $$, $1, $3);*/ }
| '-' exp %prec NEG { $$ = -$2; /*printf("%f = -%f/n", $2);*/ }
| exp '^' exp { $$ = pow ($1, $3); /*printf("%f = pow(%f, %f)/n", $$, $1, $3);*/ }
| '(' exp ')' { $$ = $2; /*printf("%f = (%f)/n", $$, $2);*/ }
;
%%
flex calc.l -->lex.yy.c
bison -d calc.y -->calc.tab.c(-d生成头文件calc.tab.h给calc.l使用)
然后在calc.tab.c加入:
int main()
{
return yyparse(); //调用语法分析yyparse
}
void yyerror(char const *s)
{
fprintf(stderr, "%s/n", s); //语法分析出错显示
}
使用VC编译生成calc.exe运行。