JISON Recursion Для чтения всего входного текста после токена

Я очень плохо знаком с парсером /cfg или jison. Я хочу, чтобы моя грамматика:

  1. Читать все после токена АДРЕС к EOF

  2. Между "ADDRESS TO EOF" может быть несколько токенов ADDRESS (из шага 1)

Мой пример ввода выглядит так:

...abc xyz address 101 My Street, Austin, CO 12345 is abc xyz my name is govind my address is 102 My Street,Austin, CO 12345 and here it is end of file.

Результат, который я ожидаю

address 101 My Street, Austin, CO 12345 is abc xyz my name is govind my address is 102 My Street,Austin, CO 12345 and here it is end of file.`

Код, который я пытаюсь

/* lexical grammar */

%lex
%options flex

%{
if (!('chars' in yy)) {
   yy.temp = 0;
}


%}
%%
\s+                   /* skip whitespace */ 
(address|Address)      return 'ADDRESS'
<<EOF>>                return 'EOF'
[A-Za-z0-9]+           return 'VARIABLE'
.                     /*skip */

/lex

%start expressions
%% /* language grammar */

expressions
   : other EOF
    {return $1;}

   ;

other
  :VARIABLE{$$=$1;}  
  |other ADDRESS other {$$=$1+"-"+$2+"-"+$3;} 
  ;

То, что я думаю, должно быть немного больше выражения для достижения результата как other ADDRESS other бросает конфликт S/R. Может ли кто-нибудь предложить мне, что, как я могу пропустить все входы до появления первого ADDRESS токен, а затем положить все остальные входы в $$, Благодарю.

1 ответ

Как правило, когда вы хотите распознать только первый X в списке X или Y, вам нужно что-то вроде этого:

list: head X tail;
tail: | tail X | tail Y;
head: | head Y;

Вот head соответствует любому числу (включая 0) Y и tail соответствует любому числу (включая 0) X или Y. Следовательно, X соответствует list должен быть первым X на входе, и нет никакой двусмысленности.

tail нетерминал здесь не нужен в этом случае, но часто полезно создать правильное дерево разбора. Вы можете написать приведенную выше грамматику:

list: head X | list X | list Y;
head: | head Y;

Если вы также хотите сопоставить списки без X, вы можете добавить производство list: head:

list: head | head X tail;
tail: | tail X | tail Y;
head: | head Y;
Другие вопросы по тегам