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