我在一款小型语言/IDE中工作。我需要知道如何配置flex和bison以使它们可以协同工作,并且不使用任何全局或静态变量。我需要将我的AST指针传递给bison。我还需要bison将我的AST传递给flex。这是一个线程环境,但我不需要任何线程同步。对于每个yyparse()调用,我需要一个单独的yylineno变量。我阅读了有关%define api.pure、%parse-param和%option reentrant的文档。但我不知道如何将它们组合起来使用...提前感谢...
我尝试过以下内容:
scanner.l:
%{
#include <iostream>
#include <sstream>
#include "parser.tab.h"
#define YY_DECL extern "C" int yylex(YYSTYPE * lvalp, yyscan_t scanner)
extern void yyerror(yyscan_t scanner, NBloco * bloco, const char *s);
%}
%option noyywrap
%option yylineno
%option reentrant
%option bison-bridge
%%
//...scanner code
解析器.y文件:
%{
#include <iostream>
#include "AST.h"
#ifndef YY_TYPEDEF_YY_SCANNER_T
#define YY_TYPEDEF_YY_SCANNER_T
typedef void* yyscan_t;
#endif
extern "C" int yylex(YYSTYPE * lvalp, yyscan_t scanner);
extern "C" FILE *yyin;
extern int yylineno;
void yyerror(yyscan_t scanner, NBloco * bloco, const char *s);
%}
%union{
//union code
}
%define api.pure full
%lex-param { yyscan_t scanner }
%parse-param { yyscan_t scanner }
%parse-param { NBlock* block}
//tokens...
//types...
%%
//parser code...
我得到了这个:
parser.y:13:22: warning: 'yylex' initialized and declared 'extern' [enabled by default] extern "C" int yylex(YYSTYPE * lvalp, yyscan_t scanner);
parser.y:13:22: error: 'YYSTYPE' was not declared in this scope
parser.y:13:32: error: 'lvalp' was not declared in this scope extern "C" int yylex(YYSTYPE * lvalp, yyscan_t scanner);
parser.y:13:48: error: expected primary-expression before 'scanner'
extern "C" int yylex(YYSTYPE * lvalp, yyscan_t scanner);
^
parser.y:13:55: error: expression list treated as compound expression in initializer [-fpermissive]
extern "C" int yylex(YYSTYPE * lvalp, yyscan_t scanner);
^
parser.tab.c: In function 'int yyparse(yyscan_t, NBloco*)':
parser.tab.c:932:39: error: 'yylex' cannot be used as a function
# define YYLEX yylex (&yylval, scanner)
parser.tab.c:1618:16: note: in expansion of macro 'YYLEX'
yychar = YYLEX;
//更多错误...
我还需要修复yylineno以适应每个文件......我基于http://benlynn.blogspot.com.br/2013/12/reentrant-parsers-with-flex-and-bison.html和http://www.lemoda.net/c/reentrant-parser/index.html
main()
作用域中创建的实例? - πάντα ῥεῖ