Я начал писать простой парсер 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:
- , когда действия парсера записываются и не выполняются до тех пор, пока:
- не будут обработаны все парсеры, кроме одного
- два парсераобъединены
- Никогда не следует изменять
yyval
в действии (которое является предвидением).
Вопросы:
- когда мне никогда не нужно объединяться, я уверен, что выполняются только те действия, которые приводят к окончательному анализу?
- Является ли присвоение
$list
локальной переменной в первую очередь допустимым исправлением, или я должен глубоко скопировать вектор?