[lex與yacc第二版] ch03-03

本文主要是ch03-03的編譯過程:

ch03-3.l

%{
#include "y.tab.h"
#include <math.h>
extern double vbltable[26];
%}

%%
([0-9]+|([0-9]*\.[0-9]+)([eE][-+]?[0-9]+)?) {
	yylval.dval = atof(yytext); return NUMBER;
	}

[ \t]	;		 /* ignore white space */

[a-z]	{ yylval.vblno = yytext[0] - 'a'; return NAME; }

"$"	{ return 0; /* end of input */ }

\n	|
.	return yytext[0];
%%

ch03-03.y

%{
double vbltable[26];
%}

%union {
    double dval;
    int vblno;
}

%token <vblno> NAME
%token <dval> NUMBER
%left '-' '+'
%left '*' '/'
%nonassoc UMINUS

%type <dval> expression
%%
statement_list:    statement '\n'
    |    statement_list statement '\n'
    ;

statement:    NAME '=' expression    { vbltable[$1] = $3; }
    |    expression        { printf("= %g\n", $1); }
    ;

expression:    expression '+' expression { $$ = $1 + $3; }
    |    expression '-' expression { $$ = $1 - $3; }
    |    expression '*' expression { $$ = $1 * $3; }
    |    expression '/' expression
                {    if($3 == 0.0)
                        yyerror("divide by zero");
                    else
                        $$ = $1 / $3;
                }
    |    '-' expression %prec UMINUS    { $$ = -$2; }
    |    '(' expression ')'    { $$ = $2; }
    |    NUMBER
    |    NAME            { $$ = vbltable[$1]; }
    ;
%%

以上是原始的程序,使用flex 和 bison生成c文件之後,再VS2010 中編譯不通過。

報錯1:找不到y.table.h

bison -d ch03-03.y 生成的文件是ch3-03.tab.h  所以要把y.table.h 改成ch3-03.tab.h

報錯2:缺少符號_yyerror

這個主要是ch03-03.y  沒有定義

解決了以上兩個錯誤,vs2010可以編譯通過,但是隻能輸入沒有輸出:

原因是 .y文件中沒有main函數。

修正後的ch03-3.l

%{
#include "ch3-03.tab.h"
#include <math.h>
extern double vbltable[26];
%}

%%
([0-9]+|([0-9]*\.[0-9]+)([eE][-+]?[0-9]+)?) {
	yylval.dval = atof(yytext); return NUMBER;
	}

[ \t]	;		 /* ignore white space */

[a-z]	{ yylval.vblno = yytext[0] - 'a'; return NAME; }

"$"	{ return 0; /* end of input */ }

\n	|
.	return yytext[0];
%%

修正後的ch03-03.y:

%{
double vbltable[26];
%}

%union {
	double dval;
	int vblno;
}

%token <vblno> NAME
%token <dval> NUMBER
%left '-' '+'
%left '*' '/'
%nonassoc UMINUS

%type <dval> expression
%%
statement_list:	statement '\n'
	|	statement_list statement '\n'
	;

statement:	NAME '=' expression	{ vbltable[$1] = $3; }
	|	expression		{ printf("= %g\n", $1); }
	;

expression:	expression '+' expression { $$ = $1 + $3; }
	|	expression '-' expression { $$ = $1 - $3; }
	|	expression '*' expression { $$ = $1 * $3; }
	|	expression '/' expression
				{	if($3 == 0.0)
						yyerror("divide by zero");
					else
						$$ = $1 / $3;
				}
	|	'-' expression %prec UMINUS	{ $$ = -$2; }
	|	'(' expression ')'	{ $$ = $2; }
	|	NUMBER
	|	NAME			{ $$ = vbltable[$1]; }
	;
%%
main()
{
	yyparse();
}

yyerror(s)
char *s;
{
    fprintf(stderr, "%s\n", s);
	return 0;
}

vs2010 工程鏈接:

https://download.csdn.net/download/lacoucou/12478203

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章