2013-11-12 2 views
0

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

unari.lex:

%{ 
    #include "unari.tab.h" 
    using namespace std; 
%} 
%option noyywrap 

%% 

a  {yylval=1; return TOK_A;} 
\n  return '\n'; 
\+  return '+'; 
.  /*ignore all rest*/ 

%% 

unari.y:

%{ 
    #include <iostream> 
    using namespace std; 
    void yyerror(const char *errorinfo); 
    int yylex(); 
%} 

%left TOK_A 
%left '+' 

%% 
line: exp '\n'  {cout<<$1<<endl; return 0;} 
     ; 
exp: exp exp  {$$=$1+$2;} 
     | exp '+' exp {$$=$1+$3;} 
     | TOK_A   {$$=yylval;} 
     ; 
%% 
void yyerror(const char *errorinfo) { 
     cout<<"problem"<<endl; 
} 


int main() { 
    while(yyparse()==0); 
    return 0; 
} 

makefile:

calc: lex.yy.o unari.tab.o 
    g++ unari.tab.o lex.yy.o -o calc.exe 

unari.tab.o: unari.tab.c 
    g++ -c unari.tab.c 

lex.yy.o: lex.yy.c 
    g++ -c lex.yy.c 

lex.yy.c: unari.lex unari.tab.h 
    flex unari.lex 

unari.tab.c unari.tab.h: unari.y 
    bison -d unari.y 

clean: 
    rm *.h *.c *.o *.exe 

Проблема заключается в том, , Я получаю следующую ошибку при компиляции на окнах:

makefile1:: *** multiple target patterns. Stop. 

Кто-нибудь признает проблему? Я убегаю голову над этим в течение более 3-х часов уже пытались поиска в Интернете и не нашел ничего полезного ....

+0

Flex тег для глинобитных/Apache UI Framework. Тег Flex-lexer используется для лексического анализатора. – JeffryHouser

+1

Вы уверены, что это ваш точный make-файл? –

+0

Это может быть ваша проблема: «unari.tab.c unari.tab.h: unari.y». Обычно есть только одно слово слева от: ' –

ответ

1

Вместо

unari.tab.c unari.tab.h: unari.y 
    bison -d unari.y 

попробовать

unari.tab.h: unari.y 
    bison -d unari.y 

unari.tab.c: unari.y 
    bison unari.y 

Там может быть другими способами сделать это, но я уверен, что это сработает для вас.


Нечетный. Я скопировал ваши файлы, и как только я получил все проблемы с пробелами/вкладками, которые были разработаны в Makefile, похоже, что все работает нормально.

[Charlies-MacBook-Pro:~/junk] crb% make clean 
rm *.h *.c *.o *.exe 
[Charlies-MacBook-Pro:~/junk] crb% make 
bison -d unari.y 
unari.y: conflicts: 2 shift/reduce 
flex unari.lex 
g++ -c lex.yy.c 
g++ -c unari.tab.c 
g++ unari.tab.o lex.yy.o -o calc.exe 


[Charlies-MacBook-Pro:~/junk] crb% which make 
/usr/bin/make 
[Charlies-MacBook-Pro:~/junk] crb% make --version 
GNU Make 3.81 

Могут возникнуть проблемы с make на окнах, и у меня нет оконной машины. Возможно, попробуйте использовать несколько шаблонов для поиска. Стоп.'

+0

Мне любопытно, эта работа для вас? –

+0

Нет, это не так ... ошибка – Jjang

0

Трудно видеть здесь (или даже в вашем редакторе по умолчанию), но сделать очень строгим в отношении наличия вкладок перед комментариями к следующей строке.

foo.c foo.h: foo.lex 
<tab>command 

, где < tab> представляет символ табуляции. Если у вас есть пробелы, то это, скорее всего, потерпит неудачу.

P.S. число целей слева от двоеточия действительно. Это означает, что команда (ы) генерирует сразу все эти цели.

http://amake.m2osw.com/amake-rules.html

+0

Убедитесь, что там есть вкладки, а после: есть только пробелы, но это тоже не сработало ... – Jjang

+0

Ну, может быть, Чарли прав, и вы используете инструмент создания, который не поддерживает более одной цели сразу (перед «:»). –

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