Передайте переменную информацию через правила бизонов - PullRequest
0 голосов
/ 16 мая 2018

Допустим, у меня есть два следующих правила:

rule1: names INTEGER    {*do something1*}

names: ID
     | names ID         {*do something2*}

Как я могу включить информацию INTEGER в мое что-то сделать2 действие?В этом конкретном примере я хочу напечатать информацию INTEGER рядом с каждым идентификатором (из имен).

1 Ответ

0 голосов
/ 16 мая 2018

Вы не можете передавать информацию в этом направлении.Во время выполнения *do something2*, то есть после прочтения каждого имени, анализатор еще даже не видел целое число.Целое число приходит после имен на входе и на входе читается линейно от начала до конца - вперед не заглядывает.

Так что если вы хотите напечатать имена вместе с целым числом,единственный способ сделать это - сделать так, чтобы после было прочитано целое число, т. е. в действии *do something1*.

Для этого вы можете *do something2* сохранить имена вмассив или другая структура данных.Затем *do something1* может выполнить итерацию по структуре данных, создаваемой *do something2*, и распечатать каждое имя вместе с целым числом.

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

...