лексический и синтаксический разбор?
Очень часто разбор текста и построение из него дерева разбора (parse tree) удобно разбить на две фазы. В первой фазе используется регулярная грамматика (грамматика регулярных выражений), во второй фазе - контекстно-свободная. Это, в принципе, не обязательно, но крайне удобно и быстро.
То есть, в первой фазе текст пропускается через некоторую программу оперирующую исключительно регулярными выражениями, она читает текст программы посимвольно (UTF8 или ASCII символы), составляя из этих символов слова (так называемые tokens). Поскольку грамматика регулярная, дерево вырождено, и, таким образом, поток символов ASCII превращается в поток token'ов. С формальной точки зрения и то, и другое - _символы_, но разных языков.
Во второй фазе поток token'ов разбирается с помощью контекстно-свободной грамматики, превращаясь в нормальное дерево разбора.
Первая фаза называется лексическим разбором, а вторая - синтаксическим или грамматическим разбором. Исторически для этих двух фаз часто используются две разные программы с разными языками описания грамматик. Например связка *lex/yacc* или *Alex/Happy*. Но есть и программы, объединяющие в себе обе фазы с единым конфигурационным файлом, например *antlr4* или *BNFC*.
Лексер не обязательно регулярный.
Я не спорю. Там везде как-правило.
И можно конкретный пример нерегулярного лексера?
Комментарии в паскале
Доллар-строки в PostgreSQL: $mystring$this is an actual string$mystring$.
Обсуждают сегодня