《Flex与Bison中文版》填坑之旅_2#

书上面fb1-5.l和fb1-5.y两个案例在本人的环境(请参考前文)下存在错误:

  1. fb1-5.tab.cpp:602:23: error: 'yylex' was not declared in this scope
  2. fb1-5.tab.cpp:1452:35: error: 'yyerror' was not declared in this scope
    (在两个地方出现)

所以,在fb1-5.y中还需要补充相关的代码。主要在.y文件的第一部分需要补充声明
extern int yylex();和 void yyerror(const char* s);

  1. 补充yylex()是因为由.y文件生成的parser代码中有要使用由.l文件生成的scanner中的yylex()函数,如果不声明为extern的,那么当编译parser的时候编译器就会报错,找不到该函数。
  2. 补充yyerror()是因为需要前置声明。我不知道作者的环境下是怎样的,但一般C/C++的函数的编写规矩是要前置声明的。
// fb1-5.y
%{
#include <stdio.h>
extern int yylex();  //补充此处代码
void yyerror(char* s); //补充此处代码
%}
/*declare tokens*/
%token NUMBER
%token ADD SUB MUL DIV ABS OP CP
%token EOL
%%
calclist:
    | calclist exp EOL { printf("= %d\n", $2); }
    ;
exp: factor { $$ = $1; }
    | exp ADD factor { $$ = $1 + $3; }
    | exp SUB factor { $$ = $1 - $3; }
    ;
factor: term { $$ = $1; }
    | factor MUL term { $$ = $1 * $3; }
    | factor DIV term { $$ = $1 / $3; }
    ;
term: NUMBER { $$ = $1; }
    | ABS term { $$ = ($2 >= 0)? $2 : - $2; }
    | OP exp CP { $$ = $2 }
    ;
%%
int main(int argc, char **argv){
    yyparse();
    return 0;
}
void yyerror(const char* s){
    fprintf(stderr, "error: %s\n", s);
}

上面的代码中没有使用文件读入,你如果想通过读取文件,那么可以补充yyin相关代码(请参考前文)。

// fb1-5.l
%{
#include"fb1-5.tab.h"
%}
%option noyywrap
%%
"+" { return ADD; }
"-" { return SUB; }
"*" { return MUL; }
"/" { return DIV; }
"|" { return ABS; }
"(" { return OP;  }
")" { return CP;  }
[0-9]+  { yylval = atoi(yytext); return NUMBER; }
\n  { return EOL; }
[ \t] { /* ignore the white spaces */ }
.   { printf("Mystery character %c\n", *yytext); }
"//".* { /* ignore comments */ }
%%

本人使用的CodeBlocks环境(请参考前文),在对整个工程进行build处理时,第一次编译会报错,说在编译flex生成的cpp时找不到由.y生成的那个头文件。
请不要着急,再次build一下就好了。
因为,CodeBlocks的build过程(没有自己写makefile)是先win_flex处理.l文件,生成了.flex.cpp,然后接着就编译该生成的.flex.cpp,但由于.l文件中include了由bison处理.y后生成的头文件“fb1-5.tab.h”,但这时win_bison还没有处理.y文件,也就没有生成"fb1-5.tab.h"。既然还不存在,那当然会报找不到的错了。


转载请注明出处,否则不太好哇?

END

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容