简单的Flex / Bison C
发布时间:2020-12-15 02:14:36 所属栏目:百科 来源:网络整理
导读:我已经寻找我的答案,但是我没有得到任何快速的回应一个简单的例子. 我想使用g编译一个flex / bison扫描器解析器,因为我想使用C类创建AST和类似的东西. 在互联网上搜索我发现一些漏洞,所有的说,唯一需要的是在lex文件中使用extern“C”声明一些函数原型. 所以
我已经寻找我的答案,但是我没有得到任何快速的回应一个简单的例子.
我想使用g编译一个flex / bison扫描器解析器,因为我想使用C类创建AST和类似的东西. 在互联网上搜索我发现一些漏洞,所有的说,唯一需要的是在lex文件中使用extern“C”声明一些函数原型. 所以我的shady.y文件是 %{ #include <stdio.h> #include "opcodes.h" #include "utils.h" void yyerror(const char *s) { fprintf(stderr,"error: %sn",s); } int counter = 0; extern "C" { int yyparse(void); int yylex(void); int yywrap() { return 1; } } %} %token INTEGER FLOAT %token T_SEMICOL T_COMMA T_LPAR T_RPAR T_GRID T_LSPAR T_RSPAR %token EOL %token T_MOV T_NOP %% ... GRAMMAR OMITTED ... %% main(int argc,char **argv) { yyparse(); } 而shady.l文件是 %{ #include "shady.tab.h" %} %% "MOV"|"mov" { return T_MOV; } "NOP"|"nop" { return T_NOP; } ";" { return T_SEMICOL; } "," { return T_COMMA; } "(" { return T_LPAR; } ")" { return T_RPAR; } "#" { return T_GRID; } "[" { return T_LSPAR; } "]" { return T_RSPAR; } [1-9][0-9]? { yylval = atoi(yytext); return INTEGER;} [0-9]+"."[0-9]+ | "."?[0-9]? { yylval.d = atof(yytext); return FLOAT; } n { return EOL; } [ t] { /* ignore whitespace */ } . { printf("Mystery character %cn",*yytext); } %% 最后在makefile中我用g代替gcc: shady: shady.l shady.y bison -d shady.y -o shady.tab.c flex shady.l g++ -o $@ shady.tab.c lex.yy.c -lfl flex和bison正常工作,但链接后,我会收到以下错误: Undefined symbols: "_yylex",referenced from: _yyparse in ccwb57x0.o 当然如果我尝试改变任何关于bison文件中的函数,它说yylex没有被声明在yyparse的范围内. 我试图解决一些比看起来更复杂的东西吗?实际上,我不需要一个封闭的结构来以面向对象的方式访问解析和词法分析,我只想让它工作. 我只想在bison文件中使用C(创建AST)并从C对象调用yyparse(). 提前致谢 解决方法
你需要外部的“C”{}为yylex在shady.l:
%{ extern "C" { int yylex(void); } #include "shady.tab.h" %} %% "MOV"|"mov" { return T_MOV; } "NOP"|"nop" { return T_NOP; } ...etc... 另外,在添加了一个虚拟语法规则之后,我只需要建立并运行它: 559 flex shady.l 560 bison -d shady.y 561 g++ shady.tab.c lex.yy.c (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |