yylval не определено с помощью flex и bison - PullRequest
10 голосов
/ 09 июня 2011

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

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 14 марта 2012

В случае, если это поможет другим, я обнаружил (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 ...

1 голос
/ 09 июня 2011

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

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

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

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

0 голосов
/ 03 апреля 2017

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

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

...