Экземпляр объекта в flex-bison c

#c #compiler-construction #linker-errors #bison #flex-lexer

#c #компилятор-построение #компоновщик-ошибки #bison #flex-lexer

Вопрос:

Мой main.hpp выглядит так :

 #include "json.tab.h"
#include "ob.hpp"

extern Ob *ob;
  

В моем test.l я написал :

 %{
    #include "main.hpp"
%}


%token  KEY
%token  COMMA

%%
KEY_SET         : KEY                                                 {ob->someOp();}
                | KEY_SET COMMA KEY                                   {ob->someOp();}
%%
  

Но это дает мне :

 C:......c:(.text 0x37a): undefined reference to `ob'
C:......c:(.text 0x38e): undefined reference to `Ob::someop()'
  

Итак, как я могу вызвать этот объект Ob из любого места моего синтаксического анализатора?

Мой класс акушерства( Ob.hpp ) :

 #include <bits/stdc  .h>
using namespace std;

#ifndef O_H_
#define O_H_

using namespace std;

class Ob {
public:
    Ob();
    ~Ob();
    someop();
};

#endif /*O_H_*/
  

И Ob.cpp :

 Ob::someop()
{
    cout << "c   is lit" << endl;
}
  

Теперь я сделал весь метод в Ob статическим, так что нет необходимости иметь экземпляр. И мое правило сборки выглядит примерно так :

 g   lex.yy.c test.tab.c main.cpp *.hpp -o test.exe
  

И я сделал генератор синтаксического анализа простым, без какого-либо вызова метода, и он работает нормально, без ошибок, без предупреждений :

 %%
KEY_SET         : KEY     
                | KEY_SET COMMA KEY    
%%
  

И когда я добавил {Ob::someOp();} , то это снова выдает мне ту же ошибку.

Все мои коды здесь : https://gist.github.com/maifeeulasad/6d0ea58cd70fbe255a4834eb46f2e1fd

Комментарии:

1. В сообщениях об ошибках ae говорится, что вы не определили ob или Ob::someop() . Вы не показали никакого кода, который определяет любую из этих вещей. Поэтому на данный момент меня не удивляет, что вы получаете эти ошибки. Вы утверждаете, что вы определили ob и Ob::someop() ? Если это так, то вы должны показать этот код. Поскольку это ошибки компоновщика, некоторые подробности о том, как вы создаете свою программу, также помогли бы.

2. @john Я добавил весь код, который, по моему мнению, мне нужен, можете ли вы проверить еще раз?

3. Ну, если это весь код, то по-прежнему нет определения для ob , и Ob::someop() это синтаксическая ошибка (тип возвращаемого значения отсутствует, предположительно, он должен быть void Ob::someop() ). Поэтому я могу только предположить, что вы на самом деле не компилируете Ob.cpp , поскольку в противном случае вы бы увидели сообщения об ошибках компилятора.

4. @john , 3-й sloc из main.hpp содержит ссылку на Ob с ключевым словом extern. И test.l импортирует или включает main.hpp .. не должно test.l иметь ссылку на Ob?? И я тоже пробовал с ключевым словом void .. и окончательное правило сборки имеет g lex.yy.c test.tab.c main.cpp -o test.exe , которое содержит main.cpp . И он содержит main.hpp ..

5. Также: (1) эта проблема не имеет ничего общего с flex или bison. Это просто запутывает проблему (и, вероятно, сбивает с толку вас тоже). Сначала выясните, как написать программу на C , распределенную по нескольким файлам. Затем вы можете добавить flex и bison в микс. (2) Никогда не просите GCC скомпилировать файл заголовка ( *.hpp ), если вы не знаете, о чем просите. (То, что вы просите, — это предварительно скомпилированный заголовок. Если вы не знаете, что это такое, вы не хотите просить о его создании.) (3) Ob.cpp невозможно скомпилировать: <stdin>:13:12: error: ISO C forbids declaration of ‘someop’ with no type [-fpermissive] . Пожалуйста, исправьте это

Ответ №1:

Вы должны передать все .cpp файлы и no .hpp команде компиляции. .hpp Будет автоматически включен препроцессором. Если вы этого не сделаете (вы не включаете Ob.cpp в свою команду), то он не сможет найти определение функций, содержащихся в них.

Итак, ваша команда компиляции должна быть такой:

 g   lex.yy.c test.tab.c main.cpp Ob.cpp -o test.exe
  

Комментарии:

1. извините, но это не работает … все еще не определено .. и я обновил вопрос, можете ли вы проверить еще раз??

2. В вопросе нет ничего, что указывало бы на то, что это проблема.

3. Посмотрите на команду компиляции и посмотрите на ошибку, которую она выдает. Это предполагает, что неопределенные ссылки вызваны отсутствием исходного файла.

4. Я не думаю, что это связано с сборкой, так как я тоже пытался g lex.yy.c test.tab.c main.cpp *.hpp -o test.exe … Я думаю, что проблема заключается в прямом объявлении , — не хватает знаний для написания кода на c , так как я не знаю, как структурировать эти коды, возможно, я что-то путаю, импортируя что-то лишнее где-то или я импортирую меньше .. Я обновил вопрос и добавил свой рабочий каталог в gist, пожалуйста, ознакомьтесь с ним … gist.github.com/maifeeulasad /…

5. Прочитайте еще раз мой ответ и попробуйте мою команду и сообщите мне результаты.

Ответ №2:

Генератор синтаксического анализа выглядит следующим образом :

 %{
    #include<stdio.h>
    #include "main.h"
    #include "json.h"
    using namespace Maifee;
%}
...
meaw           : INTEGER               {Json::ok();}
  

Заголовок:

 #ifndef JSON_H
#define JSON_H

#include <bits/stdc  .h>
using namespace std;

namespace Maifee{

class Json {
public:
    static void ok();
};
#endif // JSON_H
  

Файл cpp :

 #include <bits/stdc  .h>
#include "json.h"

using namespace std;
using namespace Maifee;

void Json::ok()
{
    //whatever here
}