Yylval undefined с изгибом и бизоном

Я искал почти каждый материал онлайн. Но я все еще смущен, почему лексер не может идентифицировать yylval.

Вот так: Я определил кучу ADT в node.h и реализую их в node.c, моя цель - создать AST после того, как эти структуры будут правильно сохранены. Но меня забивают бизоны.

Во-первых, я меняю %union на union YYSTYPE {...}; и typedef union YYSTYPE YYSTYPE;, поэтому я не делаю этого, некоторые другие файлы, опубликованные в Интернете, работают с %uinion.

Затем меня задерживают вещи yylval. Я сделал bison -d вещи и проверил его уже в parser.c (я указал выход bison), поэтому я думаю, что extern YYSTYPE yylval; должен работать. Но это не так. Поэтому я задаюсь вопросом, есть ли другой способ решить yylval необъявленную проблему.

Я использую только два типа YYSTYPE struct, int и char *, могу ли я отделить объединение YYSYTPE и struct для AST? Это означает, что нетерминалы не будут иметь связанных типов. У вас есть другие идеи?

Ответ 1

В случае помощи другим, я обнаружил (OpenBSD lex v2.5.4 + yacc), в том числе

extern YYSTYPE yylval;

в моем источнике lex было недостаточно для предотвращения проблемы с yylval undefined, хотя файл y.tab.c содержит:

#ifndef YYSTYPE
typedef int YYSTYPE;
#endif

Я исправил это, поставив явное определение в источнике lex:

#define YYSTYPE int
extern YYSTYPE yyltype

Однако неясно, будет ли определение таким образом распространяться на локаль исходного файла yacc...

Ответ 2

Вы должны использовать% union. Вам не нужно набирать союз.

Вы используете bison -d для получения файла заголовка с любыми объявлениями (типами терминалов, нетерминалов и токенов). Пример:

bison -d parser.y Допустим два файла: parser.tab.c и parser.tab.h. Вы можете включить последний файл в свой файл lexer, чтобы он знал о ваших определениях %token. Этот файл также включает определение yylval и его тип.

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

Ответ 3

У вас есть% pure-parser (или аналогичный), установленный в вашем .y файле? Это отключает нормальные объявления lex, так как они не являются повторными.

https://www.gnu.org/software/bison/manual/html_node/Pure-Decl.html