Есть ли такая вещь, как LL (0) парсеры? - PullRequest
21 голосов
/ 10 марта 2011


Я где-то видел вопрос, спрашивающий разницу между парсерами LL (0) и LR (0). Есть ли такая вещь как парсеры LL (0)? Если да, то как они анализируют, не глядя ни на какой токен?

Ответы [ 3 ]

21 голосов
/ 10 марта 2011

LL (0) парсеры смотрят на токены, но они не решают, какие продукты применить к ним. Они просто определяют, принадлежит ли последовательность к языку или нет. Это означает, что каждый нетерминальный символ должен иметь одну правую часть и что рекурсия не может быть.

G == ID name lastname
name == STRING
lastname == STRING

# lexer rules
# -----------
ID == [0-9]+
STRING == <unicode>+

Обратите внимание, что, как упоминается @ 280Z28, для работы с частями переменной длины (ID и STRING) необходим отдельный лексер, иначе грамматика не будет LL(0).

Последовательность действий, применяемых для анализа ввода с этой грамматикой, требует нулевого просмотра.

Предварительный просмотр необходим для детерминизма, когда существует более одного производства, которое может быть применено после того, как часть данной входной последовательности была проанализирована.

Теоретически, грамматика порождает язык, и в этом случае двусмысленность (наличие более чем одного способа получения данной фразы) - это хорошо. При синтаксическом анализе наличие единственного и единственного способа мешает семантике (смыслу), и это то, что мы хотим.

При синтаксическом анализе языков программирования заглядывание - это информация, необходимая для того, чтобы знать, какую грамматическую продукцию использовать дальше.

В языках LL (0) выбор отсутствует, поэтому входная последовательность либо принимается и анализируется, либо отклоняется.

2 голосов
/ 10 марта 2011

K в LR (k) относится к числу прогнозных токенов. Вы всегда используете по крайней мере один токен для определения действия, которое нужно выполнить. Страница Википедии содержит дополнительную информацию по этому вопросу.

Интуитивно понятно, что дополнительные символы предпросмотра позволяют вам делать выбор сокращения с большим количеством информации, что позволяет выражать грамматики больших классов без конфликтов.

2 голосов
/ 10 марта 2011

Когда я брал компиляторы, мы никогда не говорили о них, хотя мы говорили о LL (1).Там нет упоминания о них в Википедии .

Анализатор LL (0) будет означать, что анализатор может принять решение, не зная следующий токен в потоке.Я ожидаю, что если языки с таким свойством существуют, они чертовски редки.

...