«что угодно» не имеет объявленного типа - PullRequest
0 голосов
/ 22 марта 2010

я занимаюсь разработкой парсера с использованием бизона ... в моей грамматике я получаю эту ошибку

Вот код

extern NodePtr  CreateNode(NodeType, ...);
extern NodePtr  ReplaceNode(NodeType, NodePtr); 
extern NodePtr  MergeSubTrees(NodeType, ...); 


            ...................


NodePtr   rootNodePtr = NULL; /* pointer to the root of the parse tree */
NodePtr   nodePtr = NULL; /* pointer to an error node */


                         ...........................

NodePtr   mainMethodDecNodePtr = NULL;

                   ................

/* YYSTYPE */

%union {
 NodePtr nodePtr;
}

Я получаю эту ошибку всякий раз, когда я использую как $$. NodePtr или $ 1.nodePtr ... Я получаю Parser.y: 1302.32-33: $ 1 из `Expressi on 'не имеет объявленного типа

1 Ответ

2 голосов
/ 22 марта 2010

Это означает, что первый элемент (терминальный или нетерминальный) в RHS правила Expression в строке 1302 файла parser.y не имеет объявленного типа для него. Если это терминал, вам нужно добавить %token декларации для него, а если он не терминальный, вам нужно добавить для него %type декларацию. Когда вы сделаете это (вероятно, либо $type <nodePtr> или %token <nodePtr>), вы получите доступ к значению как просто $1 (без суффикса .nodePtr)

редактировать

звучит так, как будто строка 1302 должна быть $$ = $1;. %type <nodePtr> XXX должен идти в первом разделе, где XXX - нетерминал для этого правила. Когда вы используете %union в файле .y, теги, объявленные в объединении, должны использоваться ТОЛЬКО в объявлениях %type и %token - они не должны появляться ни в одном действии в файле .y

...