Compiler errors flex和bison的问题

Compiler errors flex和bison的问题,compiler-errors,compiler-construction,bison,flex-lexer,Compiler Errors,Compiler Construction,Bison,Flex Lexer,我试图在flex和bison中创建一个编译器,但不幸的是,我发现了一些问题 当我尝试编译时,编译器会给我以下类型的错误: flex.lex.c:286:37: error: expected ‘)’ before ‘->’ token #define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] flex.lex.c:139:19: note: in expansion of m

我试图在flex和bison中创建一个编译器,但不幸的是,我发现了一些问题

当我尝试编译时,编译器会给我以下类型的错误:

flex.lex.c:286:37: error: expected ‘)’ before ‘->’ token
 #define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]
flex.lex.c:139:19: note: in expansion of macro ‘YY_CURRENT_BUFFER_LVALUE’ #define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)
dichiarazioni.h:2:12: note: in expansion of macro ‘yylineno’
extern int yylineno; /* from lexer */
flex.lex.c:134:17: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘->’ token #define yyin yyg->yyin_r
dichiarazioni.h:5:14: note: in expansion of macro ‘yyin’
 extern FILE *yyin;
make: *** [<incorporato>: flex.lex.o] Error 1
野牛.y

  %option header-file="flex.lex.h"
  %option reentrant bison-bridge
  %{
    #include "bison.tab.h"
    #include "dichiarazioni.h"
  %}

   %%

    "char"  { yylval->fn = 10; return TYPE; }
    "int"   { yylval->fn = 11; return TYPE; }
    "if"|"IF"               { return IF; }
    "else"|"ELSE"           { return ELSE; }

    "inc"                   { yylval->fn = 24; return OPERATORE; }
    "dec"                   { yylval->fn = 25; return OPERATORE; }
    "set"                   { yylval->fn = 26; return OPERATORE; } 

     etc etc
     %%
 %{
 #include <stdio.h>
 #include <stdlib.h>
 %}

 %{
 #include "flex.lex.h"
 #include "dichiarazioni.h"
 %}

 %define api.value.type {union YYSTYPE}

%token NUMBER
%token <fn> TYPE
%token SEMI
%token ALPHA
%token ELIF
%token <fn> CMP
%token <fn> OPERATORE
%token <fn> PRINT
.......

%type <fn> term NUMBER
%type <op> operazioni
%type <c> ALPHA string
.....
%start main

%%

string: ALPHA 
;
.....
%%
extern int yylineno; /* from lexer */
void yyerror(char *s, ...);
extern int yyparse();
extern FILE *yyin;
//extern int yylex();

union YYSTYPE{
    int fn;
    char* c;
    struct operazioni* op;
    ....
 };

如果您想要使用可重入的lexer,您需要仔细阅读描述API更改的文档。特别是,
yyin
yylineno
都不是全局变量,
yylex
的原型不是
yylex(void)
。此外,flex使用预处理器宏,因此在可重入的lexer中,您仍然可以引用
yyin
和其他标准变量,就像它们是全局变量一样。但在flex操作之外,必须对scanner上下文对象使用可重入的访问器和设置器函数

您还需要在程序中的某个位置创建和初始化scanner对象,并将其作为额外参数传递给解析器。在不创建循环头依赖项的情况下实现这一点有点棘手;您可以查看解决此问题的详细建议方法。(但请先阅读手册:-)


另外,我建议让bison为
YYSTYPE
生成
union
声明,而不是自己在自己的头文件中,通过在语法文件中使用
%union
声明来生成。但也许我只是过时了。:-)

您使用的是
%选项bison bridge
而没有在bison解析器中使用
%pure parser
,这是行不通的--
bison bridge
用于连接bison的
%pure parser
选项使用的(非标准)可重入API


从.l文件中删除
%option bison桥
,或者将
%pure解析器
添加到.y文件中。如果执行后一种操作,您还需要更改.h文件(yyerror/yyparse change、yyin和yylineno退出)。

请尝试确保包含的代码正确缩进。如图所示,它无法工作,因为flex要求模式(和其他一些行)正好出现在行的开头。粘贴不正确的代码会让人困惑,因为这会导致无法测试代码。此外,最好包含一个完整的自包含程序。不要用
etc
或类似注释替换代码的大部分,而是通过构建简化但可编译的功能子集来减小程序的大小。特别是当您刚开始使用flex和bison时,您会发现在添加所需的所有其他功能之前,用一个最小的骨架进行实验更容易。