Я хочу прочитать файл в программе C++ и передать его в lex и yacc для синтаксического анализа, но я получаю ошибки компиляции. Вот мой файл main.cpp (с первой ошибкой):
extern "C"
{
#include "parser_iface.h"
#include "parser.h"
#include "lexer.h"
}
#include <stdio.h>
#include <iostream>
int yyparse(yyscan_t scanner);
int main(void)
{
yyscan_t scanner;
extern FILE *yyin;
if (yylex_init(&scanner))
return NULL;
yyin = fopen("test_file.cws", "r"); // <- error C2039: 'yyin_r' : is not a member of '_iobuf'
if(yyin == NULL)
{
std::cout << "Error!" << std::endl;
}
else
{
std::cout << "Parsing" << std::endl;
yyparse(scanner);
}
yy_delete_buffer(0, scanner);
yylex_destroy(scanner);
printf("Press ENTER to close. ");
getchar();
return 0;
}
Верх моего файла lex (.l) выглядит следующим образом:
%{
#include "parser_iface.h"
#include "parser.h"
#include <stdio.h>
%}
%option outfile="lexer.c" header-file="lexer.h"
%option warn reentrant noyywrap never-interactive nounistd bison-bridge
Верх моего файла yacc (.y) выглядит следующим образом:
%{
#include "parser_iface.h"
#include "parser.h"
#include "lexer.h"
int yyerror(yyscan_t scanner, const char *msg);
int curr_mod;
%}
%code requires
{
#ifndef YYSCAN_T
#define YYSCAN_T
typedef void* yyscan_t;
#endif
}
%output "parser.c"
%defines "parser.h"
%define api.pure
%lex-param { yyscan_t scanner }
%parse-param { yyscan_t scanner }
Я использую win_flex и win_bison.
yyin
в настоящее время оскверняется как странный макрос и не предполагается использовать. Вместо этого используйте API-реентера:
FILE * src = fopen("test_file.cws", "r");
yyset_in(src, scanner);
yyin
определяется как макрос для использования только внутри действий сканера.