1

我得到了以下要编译和运行的 flex 和 bison 代码:

unari.lex:

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

%%

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

%%

一元.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;
}

生成文件:

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

问题是,在 windows 上编译时出现以下错误:

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

有没有人认识到这个问题?我已经为此烦恼了三个多小时,尝试在网上搜索并没有发现任何有用的东西....

4

2 回答 2

2

代替

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

可能是 Windows 上的 make 问题,我没有 Windows 机器。也许尝试谷歌搜索“多个目标模式”。停止。'

于 2013-11-13T00:04:08.530 回答
0

在这里很难看到(或者默认情况下甚至在你的编辑器中),但是 make 对于在下一行的注释之前有标签非常严格。

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

其中 <tab> 代表制表符。如果你有空格,那么它很可能会失败。

PS 冒号左边的目标数是有效的。这意味着命令一次生成所有这些目标。

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

于 2013-11-13T01:16:08.753 回答