S |
F |
S1 |
C |
B |
D |
A |
E |
Op |
while |
Id |
Const |
( |
) |
= |
; |
> |
< |
+ |
- |
|
S |
||||||||||||||||||||
F |
||||||||||||||||||||
S1 |
||||||||||||||||||||
C |
1 |
1 |
1 |
|||||||||||||||||
B |
1 |
|||||||||||||||||||
D |
1 |
1 |
||||||||||||||||||
A |
1 |
|||||||||||||||||||
E |
||||||||||||||||||||
Op |
Рассмотрим множество направляющих символов для нетерминала C: из символов-предшественников в это множество входят терминалы while и id.Из-за того, что из C может выводиться пустая строка, в множество направляющих символов будут входить символы-предшественники нетерминала F - while и id. Делаем вывод, что данная грамматика не является LL1-грамматикой.
Таким образом, формально, мы не сможем по одному считанному терминалу определить, какое правило следует применять для нетерминала C.
Однако, специфика структуры данной грамматики позволяет применить ее для построения синтаксического анализатора, реализующего LL(1)-метод анализа.
Дело в том, что правила вывода для нетерминалов S, S1, F и C – практически одинаковы. В данной грамматике это необходимо для того, чтобы реализовать всевозможные комбинации инструкций цикла while и присваивания. Подобная особенность грамматики наблюдается еще в исходном ее варианте.
Далее покажем, как можно использовать данную грамматику для построения синтаксического анализатора, реализующего LL(1)-метод анализа. Если выводы пустой строки в нетерминалах F и C заменить на некоторый специальный символ “конец файла”, т.е. данное правило будет использоваться лишь тогда, когда достигнут конец файла лексем. В этом случае из данных нетерминалов выводится пустая строка.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.