Ошибки компиляции в программе на C ++ для анализа файла с использованием lex и yacc

0

Я хочу прочитать файл в программе 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.

  • 0
    А какие ошибки компиляции вы получили в частности? Вы ожидаете, что мы просто угадаем их?
  • 0
    @ πάνταῥεῖ он написал это как комментарий, но ошибка странная
Теги:
lex
yacc

1 ответ

2

yyin в настоящее время оскверняется как странный макрос и не предполагается использовать. Вместо этого используйте API-реентера:

FILE * src = fopen("test_file.cws", "r");
yyset_in(src, scanner);
  • 0
    " осквернен как странный макрос"? Это было намеренно? Это меня рассмешило.
  • 0
    Это только тот случай, потому что он использует чистый (реентерабельный) сканер. (Имейте в виду, чистые сканеры - хорошая вещь.) Это также задокументировано. yyin определяется как макрос для использования только внутри действий сканера.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню