2016-11-09 3 views
-1

Я работаю над Flex & Проект Bison. Я получил свой flex & bison отлично работает, но я пытаюсь дать true argv входную строку. Поэтому я изменил yyin так, чтобы он взял argv [1], но на самом деле он не работает. Он просто игнорирует это.Flex & Bison yyin от Argv []

Вот моя main.c:

#include "parser.hpp" 
#include <stdio.h> 
#include <iostream> 
#include <stdlib.h> 

int main(int argc, char const *argv[]) { 
extern FILE* yyin; 
yyin = fopen(argv[1],"r"); 
yyparse(); 
} 

А вот мой Makefile:

all: bison flex main.cpp 
    g++ parser.cpp lexer.cpp main.cpp -o parser 
    rm lexer.cpp parser.cpp parser.hpp 
bison: parser.y 
    bison -o parser.cpp parser.y 
flex: lexer.l 
    flex -o lexer.cpp lexer.l 

Тогда я бегу так: ./parser "(2+5)"

Но он ничего не делает. Возможно, я не делаю это правильно.

+0

Я думаю, вам стоит взглянуть на то, что на самом деле делает 'fopen'. – rici

+0

Да, я взял это из примера, но мне кажется странным, что мы используем fopen. Но я не могу в основном вызывать 'yyin = argv [1];' Потому что тип не соответствует. Извините, если я задаю тупой вопрос. –

+0

@ G.Courmont: вы пытаетесь открыть файл ** (2 + 5) ** и прочитать его. –

ответ

1

Flex предоставляет yy_scan_string(), который создает новый буфер из строки с нулевым завершением (например, argv[1]), затем переключает лексирование на использование этого буфера.

Вы можете использовать это что-то вроде:

int main(int argc, char const * argv[]) { 
    YY_BUFFER_STATE buf; 

    buf = yy_scan_string(argv[1]); 
    yyparse(); 
    yy_delete_buffer(buf); 

    return 0; 
} 

Есть другие способы создания и управления буферами см строк сканирования раздел документации Flex для получения более подробной информации.

Смежные вопросы