Реализовать цикл в Bison, используя BNF - PullRequest
1 голос
/ 11 января 2012

Итак, я получил этот код:

calclist: /* nothing */   matches at beginning of input
 | calclist exp EOL { printf("= %d\n", $1); } EOL is end of an expression
 ;

Объясняется, что:

первые два правила, которые определяют набор символов, реализуют цикл, который читаетвыражение завершается символом новой строки и печатает его значение.Определение calclist использует общую рекурсивную идиому из двух правил для реализации последовательности или списка: первое правило пустое и ничего не соответствует;второй добавляет элемент в список.Действие во втором правиле печатает значение опыта в $ 2.

Из книги «Сгибание и бизон».Может кто-нибудь сказать, пожалуйста, как такой синтаксис подразумевает цикл?Я могу понять рекурсию в exp (которая написана позже, но я не включаю, потому что она здесь неактуальна).Однако, глядя на такой синтаксис, я могу думать только о том, что первое правило ничего не соответствует, чтобы синтаксический анализатор ничего не обрабатывал, таким образом, имея бесконечный цикл, пока первый символ не будет получен из стандартного входного потока и не начнется второе правило.Однако я не понимаю второго правила.Как он может достичь части exp?Не будет ли он продолжать повторяться, когда встречает calclist?

Ответы [ 2 ]

4 голосов
/ 11 января 2012

Второе правило подразумевает цикл, как если бы у вас была строка, такая как:

exp EOL exp EOL exp EOL exp EOL

Каждый из этих "exp EOL" является калькулятором, который включен в другой кальклист.Следовательно, правила будут сокращать эту строку следующим образом:

exp EOL exp EOL exp EOL exp EOL
calclist1 exp EOL exp EOL exp EOL exp EOL < - Rule 1. calclist1 is [ ], the empty string.
calclist2 exp EOL exp EOL exp EOL < - Rule 2. calclist2 is calclist1 exp EOL
calclist3 exp EOL exp EOL < - Rule 2. calclist3 is calclist2 exp EOL
calclist4 exp EOL < - Rule 2. calclist4 is calclist3 exp EOL
calclist5 < - Rule 2. calclist5 is calclist4 exp EOL

Вот что это означает, создавая цикл.Как и та часть, которую вы цитировали, это обычная «идиома» при определении грамматик для создания списка выражений произвольной длины.

Я надеюсь, что это ответ на ваш вопрос.1011 *

1 голос
/ 11 января 2012

Если бы это был парсер рекурсивного спуска, но я думаю, дело в том, что это не так.

...