2016-01-17 7 views
0

Вот моя вершина Yacc file.yYacc- Struct как незавершенный или неизвестный тип

%code requires { 

    struct Id { 
     char *var; 
    }; 

    struct Commds; 

    struct Commd { 
     struct Id lhs; 
    }; 

    struct Commds { 
     struct Commd commd; 
     struct Commds *next; 
    };  
} 

Я использовал этот код в моем %union для определенных новых типов для синтаксического анализа.

%union { 
    char *id;  
    long long integer; 
    struct Id Identifier; 
    struct Commd Command; 
    struct Commds *Commands;   
} 
.... 
%type <Command> command 
%type <Commands> commands 

У меня нет никаких проблем при его использовании с $$ -dollars атрибутов в то время как дерево разбора строит вверх, оценивая лексемы из моего лексере. К сожалению, я хотел бы использовать мои структуры, которые определены в начале файла другими способами в разделе %{ codes %}. К сожалению всякий раз, когда я определяю функцию следующим образом:

void add(struct Commd cmd) {...}; 

Я получаю сообщение об ошибке: неизвестный тип! Я был бы благодарен за то, что рассказал мне, как сделать эти структуры видимыми для всего моего парсера.

+0

В вашем блоке определений структуры, похоже, слишком много замыкающих элементов. Вы можете сначала изучить это. –

+0

проверил, это не так. Я думаю, проблема связана с y.tab.h – Dago

+0

Я не могу воспроизвести это. Можете ли вы просто вставить минимальный пример (если возможно, менее 20 строк), который показывает проблему? (Только блоки кода были бы идеальными.) – rici

ответ

0

Эта ошибка обычно происходит потому, что у вас есть накидные, жетоны и типы:

%union { 
    char *id;  
    long long integer; 
    struct Id Identifier; 
    struct Commd Command; 
    struct Commds *Commands;   
} 
.... 
%type <Command> command 
%type <Commands> commands 

перед тем кодом C в {% %} скобки. Вы должны положить это после {% %}. В основном вы говорите, что ваш терминал или не терминал имеет тип struct Commd, но yacc не знает, что такое struct Commd, потому что вы включили его под кодом союза.

Вы не создали весь код, поэтому я могу только предположить, что вы это сделали. Если это так, это ваш ответ.

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