LL (0) парсеры смотрят на токены, но они не решают, какие продукты применить к ним. Они просто определяют, принадлежит ли последовательность к языку или нет. Это означает, что каждый нетерминальный символ должен иметь одну правую часть и что рекурсия не может быть.
G == ID name lastname
name == STRING
lastname == STRING
# lexer rules
# -----------
ID == [0-9]+
STRING == <unicode>+
Обратите внимание, что, как упоминается @ 280Z28, для работы с частями переменной длины (ID
и STRING
) необходим отдельный лексер, иначе грамматика не будет LL(0)
.
Последовательность действий, применяемых для анализа ввода с этой грамматикой, требует нулевого просмотра.
Предварительный просмотр необходим для детерминизма, когда существует более одного производства, которое может быть применено после того, как часть данной входной последовательности была проанализирована.
Теоретически, грамматика порождает язык, и в этом случае двусмысленность (наличие более чем одного способа получения данной фразы) - это хорошо. При синтаксическом анализе наличие единственного и единственного способа мешает семантике (смыслу), и это то, что мы хотим.
При синтаксическом анализе языков программирования заглядывание - это информация, необходимая для того, чтобы знать, какую грамматическую продукцию использовать дальше.
В языках LL (0) выбор отсутствует, поэтому входная последовательность либо принимается и анализируется, либо отклоняется.