Распознавание чисел принадлежит сканеру или парсеру? - PullRequest
5 голосов
/ 18 августа 2011

Когда вы смотрите на описание языка EBNF, вы часто видите определение для целых и действительных чисел:

integer  ::= digit digit*   // Accepts numbers with a 0 prefix
real     ::= integer "." integer (('e'|'E') integer)?

(Определения были сделаны на лету, я, вероятно, допустил в них ошибку).

Хотя они появляются в контекстно-свободной грамматике, цифры часто распознаются на этапе лексического анализа.Включены ли они в определение языка, чтобы сделать его более полным, и разработчик должен понять, что они действительно должны быть в сканере?

Ответы [ 2 ]

3 голосов
/ 18 августа 2011

Многие распространенные инструменты генератора синтаксических анализаторов, такие как ANTLR, Lex / YACC, разделяют синтаксический анализ на две фазы: во-первых, входная строка маркируется.Во-вторых, токены объединяются в производственные процессы для создания конкретного синтаксического дерева.

Однако существуют альтернативные методы, которые не требуют токенизации: проверьте возврат парсеры рекурсивного спуска .Для такого синтаксического анализатора токены определяются аналогично не токенам. pyparsing является генератором парсера для таких парсеров.

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

Согласно "The Definitive ANTLR Reference" (Terence Parr),

Единственное различие между [лексерами и парсерами] состоит в том, что парсер распознает грамматическую структуру впоток токенов, в то время как лексер распознает структуру в потоке символов.

1 голос
/ 26 августа 2011

Синтаксис грамматики должен быть полным, чтобы быть точным, поэтому, конечно, он включает подробности относительно точного формата идентификаторов и написания операторов.

Да, инженер компилятора решает, но в целом это довольно очевидно. Вы хотите, чтобы лексер эффективно обрабатывал все детали на уровне персонажа.

Есть более длинный ответ на Это работа Лексера для анализа чисел и строк?

...