C Bison GLR - постоянный стек - PullRequest
       44

C Bison GLR - постоянный стек

0 голосов
/ 22 сентября 2019

Я начал писать простой парсер LR (1) с Bison.При обработке списков я использовал простую реализацию вектора, например, при разборе списка выражений:

tuple-expression-list: expression[first] ',' expression[second] { 
    foo_vector_init(&$$); 
    foo_vector_push_back(&$$, $first); 
    foo_vector_push_back(&$$, $second); }

tuple-expression-list: tuple-expression-list[list] ',' expression[expr] { 
    foo_vector_push_back(&$list, $expr); $$ = $list; }

Это работало нормально.Но затем изменилась грамматика, и мне пришлось пойти на анализатор GLR.Внезапно компилятор пожаловался на постоянство $list.Я обнаружил, что для парсеров GLR:

  1. , когда действия парсера записываются и не выполняются до тех пор, пока:
    • не будут обработаны все парсеры, кроме одного
    • два парсераобъединены
  2. Никогда не следует изменять yyval в действии (которое является предвидением).

Вопросы:

  1. когда мне никогда не нужно объединяться, я уверен, что выполняются только те действия, которые приводят к окончательному анализу?
  2. Является ли присвоение $list локальной переменной в первую очередь допустимым исправлением, или я должен глубоко скопировать вектор?

1 Ответ

1 голос
/ 22 сентября 2019
  1. Когда мне никогда не нужно объединяться, я уверен, что выполняются только действия, которые приводят к окончательному анализу?

Да. В документации указано, что

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

Дело в том, что выполняемые семантические действия (только) связаны с действительными принятыми сокращениямидля общего разбора.

Является ли присвоение $ list локальной переменной первым допустимым исправлением или я должен глубоко скопировать вектор?

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

  • такое присваивание создает поверхностную копию вектора (в отличие, скажем, от указателя или ссылки на существующий объект), и что
  • предшествующее содержимоевектор не подлежит изменению в любой возможной строке сокращений, которая выполняет рассматриваемое семантическое действие, и что
  • копия, а не оригинал, представляется как семантическое значение действия,

достаточно мелкой копии.

...