Лексеры и парсеры хороши для компьютерной интерпретации всего, что является контекстно-свободным языком , но не обычным языком .
В более практическом смысле этоозначает, что они хороши для интерпретации всего, что имеет определенную структуру , но выходит за пределы возможностей (или труднее сделать) регулярного выражения.
Например, это трудно , если нет невозможно написать регулярное выражение, которое определит, является ли данный документ допустимым HTML (из-за таких вещей, как вложение тегов, escape-символы, обязательные атрибуты и так далее).С другой стороны, (сравнительно) тривиально написать синтаксический анализатор для HTML.
Аналогично, вы, вероятно, не захотите даже пытаться написать регулярное выражение для определения порядка операций в математическом выражении.С другой стороны, парсер может сделать это легко.
Что касается вашего вопроса об отдельных лексерах или парсерах:
Ни то, ни другое не является "необходимым" или вообще.
Например, у человека могут быть читаемые человеком слова, которые переводятся непосредственно в машинные коды операций, которые будут встраиваться непосредственно в машинный код (по сути, это будет очень простой «язык ассемблера»).Это не потребует синтаксического анализатора.
Можно также просто писать программы способом, который уже был выражен в машиночитаемых отдельных символах и, таким образом, легко разбирается машиной - например, выражениями булевой алгебры, которые использовали толькосимволы 0
, 1
, &
, |
, ~
, (
и )
.Для этого не требуется лексер.
Или вы можете обойтись без них - например, Brainfuck не требует ни лексизма, ни синтаксического анализа, потому что это просто набор упорядоченных инструкций;интерпретатор просто отображает символы на то, что нужно сделать.Для машинных кодов операций аналогичным образом также не требуется.
В основном лексеры и парсеры написаны для того, чтобы сделать вещи приятнее и проще . приятнее не нужно писать все в отдельных однозначных глифах. проще иметь возможность записывать сложные выражения любым удобным способом (скажем, в скобках (3+4)*2
), чем заставлять себя писать их так, как работают машины (скажем, * 1048)* RPN : 3 4 + 2 *
).