Трудности во время компиляции (g ++, bison, flex) с yyparse (); - PullRequest
4 голосов
/ 22 июня 2011

У меня проблема с компиляцией моего кода:

Flex:

%{
#include "lista4.tab.hpp"
#include <stdlib.h>
extern int yylex();
%}
%%
"=" {return EQ;}
"!="    {return NE;}
"<" {return LT;}
">" {return GT;}
":="    {return ASSIGN;}
";" {return SEMICOLON;}
"IF"    {return IF;}
"THEN"{return THEN;}

"END" {return END;}
[_a-z]+ {yylval.text = strdup(yytext); return IDENTIFIER;}
[ \t]+
[0-9]+          {
                yylval.var = atoi (yytext);
                return NUMBER;
                }
[-+/^*'%'()]    {
                return *yytext;
                }
\n              return RESULT;
%%

Bison:

%{
  extern "C"
  {
    int yyparse();
    int yylex(void);
    void yyerror(char *s){}
    int yywrap(void){return 1;}
  }

  #include <iostream>
  #include <vector>
  #include <string>
  #include <stdlib.h>
  #include <map>

  using namespace std;

  vector <string> instructions;
  map <> vars;
%}

%union{
  char* text;
  int var;
}


%token EQ
%token NE
%token ASSIGN
%token SEMICOLON
%token IF
%token THEN
%token <text> IDENTIFIER
%token <var> NUMBER
%token <var> RESULT

%left '+' '-'
%left '*' '/' '%'
%right '^'

%%

exp: NUMBER
| IDENTIFIER
| IDENTIFIER "+" IDENTIFIER
| IDENTIFIER "-" IDENTIFIER
;
%%

int main(void){
  yyparse();
} 

И скрипт bash:

#!/bin/bash
clear
rm launcher lex.yy.cpp *.tab.cpp *.tab.hpp
bison  -d -o lista4.tab.cpp *.y
flex -o lex.yy.cpp *.l
g++ -o launcher *.cpp -lfl

Я разместил здесь только самую важную часть кода, потому что остальные здесь не нужны.В любом случае, если кто-то хотел бы увидеть весь код, я вставил его здесь: http://pastebin.com/1rS2FBJj. Но он немного больше и занимает больше места.

Когда я попытался скомпилировать все в * .c файлы, а затем с помощью gcc все было хорошо.Но когда я переключил компилятор на g ++ и файлы на cpp, я получил такую ​​ошибку:

lista4.tab.cpp: In function ‘int yyparse()’:
lista4.tab.cpp:1397: warning: deprecated conversion from string constant to ‘char*’
lista4.tab.cpp:1540: warning: deprecated conversion from string constant to ‘char*’
/tmp/ccdqpQVx.o: In function `yyparse':
lista4.tab.cpp:(.text+0x252): undefined reference to `yylex'
collect2: ld returned 1 exit status

Может кто-нибудь дать мне совет, как это исправить?

1 Ответ

11 голосов
/ 22 июня 2011

В вашем файле Flex вы объявляете это:

extern int yylex();

При компиляции в C ++ это объявляет функцию с связью C ++ .В вашем файле Bison вы объявляете это:

extern "C" {
  int yylex();
}

Это дает ему C связь .Это две разные функции.Вы определяете версию C ++ (точнее, Flex определяет ее для вас), но вы объявляете версию C, а версия C - та, которую компилятор считает, что вы пытаетесь вызвать(в сгенерированном Bison коде).Компоновщик видит, что используется версия C, но не может найти определение.

Выберите одну связь и используйте ее последовательно.(Я бы выбрал C ++, поскольку он позволяет полностью исключить "внешние" элементы из кода.)

...