Проблемы масштабирования синтаксического анализатора Bison C ++ - PullRequest
0 голосов
/ 21 декабря 2018

Я использую Bison 3.0.4 + flex2.6.0 для генерации синтаксического анализатора C ++.Все отлично работает для небольших файлов, но когда все становится действительно большим (сотни строк или действительно большие токены), я начинаю получать странные ошибки, такие как:

"фатальная внутренняя ошибка сканера - никаких действий не найдено"

Я провел некоторое исследование отладки и +, и я считаю, что это проблемы со стеком, а руководство зубров говорит, чтобы установить YYINITDEPTH ....

  • проблема в том, гдеЯ установил макрос?Я положил его в начало моего файла .yy, но ничего не изменилось.
  • есть ли способ напечатать / показать значение во время выполнения?

Я попытался перейти на бизон 3.2, чтобы проверить, исправит ли это проблему, но я получаю эту ошибку:

"ошибка: макрос" YY_RVREF "передал 2 аргумента,но занимает всего 1 "

Есть идеи?Я полностью застрял!

This is what my .yy file looks like:

%skeleton "lalr1.cc"
%require  "3.0"
%debug
%locations
%defines
%define api.namespace {SIT}
%define parser_class_name {SIT_Parser}

%code requires{
   namespace SIT {
      class SIT_Reader;
      class SIT_Scanner;    
   }

// The following definitions is missing when %locations isn't used

#ifndef YY_NULLPTR

#if defined __cplusplus && 201103L <= __cplusplus

#define YY_NULLPTR nullptr

#else

#define YY_NULLPTR 0

#endif

#endif

#ifndef YYINITDEPTH

#define YYINITDEPTH 9000

#endif

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Эта ошибка:

error: macro "YY_RVREF" passed 2 arguments, but takes just 1

произошла из-за (глупой) ошибки в 3.2.Пожалуйста, обновитесь до 3.2.4, это исправляет эту ошибку.

0 голосов
/ 22 декабря 2018

Эта проблема указывает на какое-то повреждение памяти, возможно, в результате неопределенного поведения где-то в ваших действиях синтаксического анализа (которые не видны из вашего вопроса).

Крайне маловероятно переполнение стека синтаксического анализатора, потому что бизон-произведенный синтаксический анализатор будет сообщать о любых ошибках, возникающих в результате превышения емкости стека разбора.(Он вызывает yyerror с соответствующим сообщением об ошибке и возвращает 2 из функции разбора.)

...