LINUX.ORG.RU

Какая разница между bison и byacc?

 , ,


0

1

Есть программа на C++, в которой один файл генерируется byacc-ом из *.y файла. Насколько будет отличаться результат при использовании других yacc-совместимых генераторов? В частности, «bison -y».

P.S. Если byacc нормально работает, а bison сыпет ошибки вида

error: $$ of «exprlist» has no declared type
error: $4 of «stat» has no declared type
значит ли это, что в исходном тексте есть серьёзные ошибки?

Программа: http://warmplace.ru/soft/pixilang/pixilang3.6.zip

★★★★★

Так, вроде, генерирует:

diff --git a/pixilang_compiler.y b/pixilang_compiler.y
index 2a16bca..b20c17e 100644
--- a/pixilang_compiler.y
+++ b/pixilang_compiler.y
@@ -292,14 +292,14 @@ lnode* remove_lsym_table( lnode* statlist )
     return new_tree;
 }
 
-%}
-
-%union //Possible types for yylval and yyval:
+union YYSTYPE //Possible types for yylval and yyval:
 {
     PIX_INT i;
     PIX_FLOAT f;
     lnode* n;
-}
+};
+
+%}
 
 %token NUM_I NUM_F GVAR LVAR WHILE BREAK CONTINUE IF ELSE GO RET FNNUM FNDEF INCLUDE HALT
 %left OROR ANDAND

xaizek ★★★★★ ()
Ответ на: комментарий от xaizek

В результате получаются некомпилируемые CPP:

pixilang_compiler.y: В функции «void create_empty_lsym_table()»:
pixilang_compiler.y:235:26: предупреждение: сравнение знакового и беззнакового целых выражений [-Wsign-compare]
pixilang_compiler.y: На глобальном уровне:
pixilang_compiler.y:295:1: ошибка: expected unqualified-id before «%» token
pixilang_compiler.y: В функции «int yyparse()»:
pixilang_compiler.y:325:66: ошибка: запрос элемента «n» в «* yyvsp», имеющего не классовый тип «YYSTYPE {aka int}»
pixilang_compiler.y:334:15: ошибка: запрос элемента «n» в «yyval», имеющего не классовый тип «YYSTYPE {aka int}»
...
pixilang_compiler.y:338:38: ошибка: запрос элемента «n» в «*(yyvsp + 18446744073709551608u)», имеющего не классовый тип «YYSTYPE {aka int}»
...

question4 ★★★★★ ()
Ответ на: комментарий от Zubok

Bison was originally written by Robert Corbett in 1985.[1] Later, in 1989, Robert Corbett released another parser generator named Berkeley Yacc. Bison was made Yacc-compatible by Richard Stallman.[4]

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

question4 ★★★★★ ()
Ответ на: комментарий от xaizek

Это можно добавить:

#define YYSTYPE union YYSTYPE

Куда добавлять? В самое начало? GCC сигналит об ошибке:

pixilang_compiler.y: На глобальном уровне:
pixilang_compiler.y:297:1: ошибка: expected unqualified-id before «%» token
pixilang_compiler.cpp:1503:9: ошибка: агрегатный тип «YYSTYPE yylval» неполон и не может быть определён
...

question4 ★★★★★ ()
Ответ на: комментарий от question4

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

Это же разные программы с разными расширениями yacc, но даже если грамматика в границах yacc определённых в POSIX, то bison не является 100% совместимым с ним. POSIX предписывает при отсутствии %type отдавать в $$ тип union, но bison так не делает и хочет %type-директивы, чтобы подставлять в качестве $$ поле union'а. Отсюда и те ошибки.

xaizek ★★★★★ ()