В ответ на ваш главный вопрос: для очень простой грамматики можно определить, является ли она LL (1), без построения наборов FIRST и FOLLOW, например,
A & rarr; А + А | а
не является LL (1), а
A & rarr; а | б
есть.
Но когда вы усложняете ситуацию, вам нужно провести некоторый анализ.
A & rarr; Б | а
B & rarr; A + A
Это не LL (1), но это может быть не сразу очевидно
Грамматические правила для арифметики быстро становятся очень сложными:
expr & rarr; term {'+' term}
термин & rarr; фактор {'*' фактор}
фактор & rarr; номер | '(' expr ')'
Эта грамматика обрабатывает только умножение и сложение, и уже не сразу понятно, является ли грамматика LL (1). Все еще можно оценить это, просматривая грамматику, но с ростом грамматики это становится менее осуществимым. Если мы определим грамматику для всего языка программирования, почти наверняка потребуется сложный анализ.
Тем не менее, есть несколько очевидных признаков того, что грамматика не является LL (1) & mdash; как A & rarr; A + A выше & mdash; и если вы сможете найти что-то из этого в своей грамматике, вы будете знать, что ее нужно переписать, если вы пишете парсер рекурсивного спуска. Но нет ярлыка для проверки того, что грамматика равна LL (1).