@ crozzfire, Ира предоставила правильный ответ на ваш первоначальный вопрос, подумайте над тем, чтобы проголосовать за него.
Позвольте мне ответить на ваш вопрос с дополнительным требованием разделить проанализированные значения на два списка.Не создавайте разные правила для разбора этих списков, так как грамматика списка одинакова для обоих случаев.Вам нужен флаг, чтобы указать, были ли LIKES или HATES найдены перед списком.Четвёртый параметр функции Lemon Parse
подходит для этого лучше всего.См. Раздел «Интерфейс синтаксического анализатора» Документация Lemon .
Ниже приведена обновленная грамматика Иры, которая устанавливает и проверяет такую переменную флага.Обратите внимание, что правила set_likes_state
и set_hites_state
должны быть размещены непосредственно перед токенами LIKES и HATES, чтобы выполнялось соответствующее действие при уменьшении токенов.
%extra_argument {unsigned* state}
final ::= likes_stmt.
final ::= hates_stmt.
likes_stmt ::= set_likes_state LIKES list(A).
hates_stmt ::= set_hites_state HATES list(A).
list ::= list VALUE(A). { if (*state == 0) {/*add A to list1*/} else {/*add A to list2*/}; }
list ::= VALUE(A). { if (*state == 0) {/*add A to list1*/} else {/*add A to list2*/}; }
set_likes_state ::= . { *state = 0; }
set_hites_state ::= . { *state = 1; }