加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

简单的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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读