【问题标题】:Compiling flex / bison program error编译 flex/bison 程序错误
【发布时间】:2013-11-12 23:54:51
【问题描述】:

我得到了以下要编译和运行的 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*/

%%

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;
}

制作文件:

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.

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

【问题讨论】:

  • Flex 标签用于 ADobe/Apache UI 框架。 Flex-lexer 标签用于词法分析器。
  • 您确定这是您的确切生成文件吗?
  • 这可能是你的问题:'unari.tab.c unari.tab.h: unari.y'。通常':'后面只剩下一个单词
  • 不,应该没问题……
  • makefile1 是什么?还是您错误地输入了错误信息?通常它会以makefile:[linenumber]: 开头,其中[linenumber] 是错误行的编号(知道这一点很有用)。 multiple target patterns 仅在您有一个具有多个目标模式的静态规则时才会生成(据我所知)。静态规则有两个 :,我在你的 makefile 中没有看到任何这样的规则。

标签: c++ c bison flex-lexer


【解决方案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

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

【讨论】:

    【解决方案2】:

    在此处很难看到(甚至默认情况下在您的编辑器中),但对于下一行的 cmets 之前的制表符,make 非常严格。

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

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

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

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

    【讨论】:

    • 确保里面有标签,并且在 : 之后只有空格,但它也不起作用......
    • 好吧,也许 Charlie 是正确的,并且您使用的 make 工具一次不支持多个目标(在 ':' 之前)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多