Что такое хороший инструмент для автоматического расчета наборов FIRST и FOLLOW? - PullRequest
4 голосов
/ 14 февраля 2010

В настоящее время я нахожусь в процессе игры с грамматикой BNF, которую, я надеюсь, смогу перейти в форму LL (1). Тем не менее, я только что закончил вносить изменения и вычислять новые наборы FIRST и FOLLOW для грамматики вручную в третий раз сегодня, и я устаю от этого. Должен быть лучший способ!

Может ли кто-нибудь предложить инструмент, который с учетом грамматики автоматически вычислит первый и последующий наборы для всех нетерминалов?

Ответы [ 3 ]

3 голосов
/ 14 февраля 2010

Год назад у нас был семестровый проект в университете, в котором я учусь, где нашей задачей было создать язык программирования. Как группа, мы решили, что хотим иметь возможность писать синтаксический анализатор с нуля, поэтому нам нужно было стремиться к грамматике LL (1), так как иначе было бы совершенно нереально написать синтаксический анализатор.

Конечно, наша отправная точка была далека от LL (1), поэтому нам тоже пришлось ее поставить на место. Для этого мы использовали инструмент kfgEdit из пакета AtoCC . Все, что вы делаете, это вводите свои правила, и затем он может проверить, является ли это грамматикой LL (1) одним нажатием кнопки.

Справедливое предупреждение: инструмент немного привередлив в том, что он принимает. Хотя вы часто используете EBNF для настоящей грамматики, так что вы можете написать? и * и +, чтобы указать, сколько раз этот токен должен появиться там, это не поддерживается. Группировка также не поддерживается. Возможно, вы обнаружите, что это занимает очень много времени, и вы почти наверняка захотите выполнить некоторую «перестановку» после того, как достигнете LL (1), чтобы сделать грамматику даже близкой к читабельности.

Конечно, в зависимости от типа грамматики, с которой вы имеете дело, это может не составлять вам особых проблем. Мы создали своего рода гибрид Pascal / C с довольно ограниченным набором конструкций (процедур, функций, только встроенных примитивных типов и массивов из них, если бы это была единственная конструкция цикла, которую мы придумали бы вместо себя стандарт 3 ...), и мне потребовалось как минимум неделя, чтобы превратить его в грамматику LL (1) - возможно, на самом деле 2. Обратите внимание, что это примерно 4 месяца, так что там было потрачено много времени.

Если вы абсолютно ДОЛЖНЫ иметь грамматику LL (1), то вам, очевидно, придется нажимать на, если вы попадаете в такую ​​ситуацию, но если вам разрешено использовать генераторы синтаксического анализатора, такие как yacc / bison или SableCC, тогда вы в конечном итоге, скорее всего, будет гораздо проще идти по этому маршруту. Это не значит, что вы ДОЛЖНЫ пойти по этому пути - я обнаружил, что на самом деле написание всего вручную дало некоторую информацию, которую я, вероятно, не смог бы получить иначе, - но для вас было бы лучше получить эту информацию в другой ситуации, чем ваша текущая .

tl; dr версия: используйте kfgEdit из пакета AtoCC .

0 голосов
/ 16 октября 2010

Набор инструментов для реинжиниринга программного обеспечения *1001* имеет генератор синтаксических анализаторов, который вычисляет наборы FIRST и FOLLOW; это также позволит вам проверить конечный автомат L (AL) R, который он генерирует.

Однако, если у вас есть легитимная контекстно-свободная грамматика, вам не нужно «сворачивать ее» в форму LL; генератор парсера DMS генерирует парсеры GLR из любой контекстно-свободной грамматики.

0 голосов
/ 14 февраля 2010

Для анализа рекурсивного спуска стоило бы взглянуть на ANTLR . Однако я не уверен, что он дает точный ответ на ваш вопрос - найдите наборы FIRST и FOLLOW для данной грамматики.

...