2016-01-31 3 views
0

я побежал следующую команду в командной строке Windows:y.tab.c и y.tab.h файлы не создаются на Win64

yacc -d calci.y

После успешного выполнения он создает 2 файла: calci.tab.c и calci.tab.h. Но он должен был сгенерировать y.tab.c и y.tab.h.

Я очень новичок в lex и yacc, поэтому у меня нет идеи об ошибке.

Кроме того, он дает мне следующую ошибку, когда я пытаюсь запустить команду:

cc lex.yy.c calci.tab.c -o out.exe:

error: calci.l:3:23: fatal error: y.tab.h: No such file or directory compilation terminated.

Пожалуйста, дать некоторые предложения.

программы Yacc: --- >>

%{ 
    #include <stdio.h> 
    int yylex(void); 
    void yyerror(char *); 
%} 

%token INTEGER 

%% 

program: 
     program expr '\n'   { printf("%d\n", $2); } 
     | 
     ; 

expr: 
     INTEGER 
     | expr '+' expr   { $$ = $1 + $3; } 
     | expr '-' expr   { $$ = $1 - $3; } 
     ; 

%% 

void yyerror(char *s) { 
    fprintf(stderr, "%s\n", s); 
} 

int main(void) { 
    yyparse(); 
    return 0; 
} 

Лекса программа: - >>>>

%{ 
    #include "y.tab.h" 
    #include <stdlib.h> 
    void yyerror(char *); 
%} 

%% 

[0-9]+  { 
       yylval = atoi(yytext); 
       return INTEGER; 
      } 

[-+\n]  { return *yytext; } 

[ \t]  ;  /* skip whitespace */ 

.   yyerror("Unknown character"); 

%% 

int yywrap(void) { 
    return 1; 
} 

ответ

0

Просто примите, что зубр будет назвать свои выходные файлы на основе имя его входного файла.

Создание файлов с именем y.tab.c и y.tab.h - это унаследованное поведение исходного инструмента yacc; с текущими версиями bison, вы можете достичь совместимого поведения, предоставив опцию командной строки -y в bison. Но я не рекомендую делать это для нового кода; он также изменит некоторые детали поведения парсера, чтобы быть совместимым с устаревшими, и если у вас нет устаревшего кода, то поведение может быть нежелательным.

Основываясь на именах файлов, созданных бизоном на входных файлах, позволяет иметь более одного исходного файла бизонов в одном каталоге. Если вы не хотите использовать имя исходного файла, вы можете указать явное имя выходного файла с опцией -o (и опцией --defines, если вы хотите, чтобы имя файла заголовка имело другой префикс, чем исходный файл).

Все это означает, что вам нужно изменить имя файла, который входит в лексический, так что линия будет

#include "calci.tab.h" 

(если вы не используете -o/--defines варианты.)

+1

Или используйте опцию '-y'. –