Использование написания Lexers и парсеров, кроме как для компиляторов? - PullRequest
1 голос
/ 11 сентября 2011

Какие проблемы, кроме написания компиляторов, можно решить с помощью Lexers и Parsers?

Каковы преимущества / недостатки использования Lexers и парсеров по сравнению с простым написанием операторов регулярных выражений на языке программирования.

Есть ли ситуации, когда используется только Lexer или только парсер?

PS: Точные примеры сравнения были бы хорошими

Ответы [ 2 ]

2 голосов
/ 11 сентября 2011

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

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

Например, это трудно , если нет невозможно написать регулярное выражение, которое определит, является ли данный документ допустимым HTML (из-за таких вещей, как вложение тегов, escape-символы, обязательные атрибуты и так далее).С другой стороны, (сравнительно) тривиально написать синтаксический анализатор для HTML.

Аналогично, вы, вероятно, не захотите даже пытаться написать регулярное выражение для определения порядка операций в математическом выражении.С другой стороны, парсер может сделать это легко.


Что касается вашего вопроса об отдельных лексерах или парсерах:

Ни то, ни другое не является "необходимым" или вообще.

Например, у человека могут быть читаемые человеком слова, которые переводятся непосредственно в машинные коды операций, которые будут встраиваться непосредственно в машинный код (по сути, это будет очень простой «язык ассемблера»).Это не потребует синтаксического анализатора.

Можно также просто писать программы способом, который уже был выражен в машиночитаемых отдельных символах и, таким образом, легко разбирается машиной - например, выражениями булевой алгебры, которые использовали толькосимволы 0, 1, &, |, ~, ( и ).Для этого не требуется лексер.

Или вы можете обойтись без них - например, Brainfuck не требует ни лексизма, ни синтаксического анализа, потому что это просто набор упорядоченных инструкций;интерпретатор просто отображает символы на то, что нужно сделать.Для машинных кодов операций аналогичным образом также не требуется.

В основном лексеры и парсеры написаны для того, чтобы сделать вещи приятнее и проще . приятнее не нужно писать все в отдельных однозначных глифах. проще иметь возможность записывать сложные выражения любым удобным способом (скажем, в скобках (3+4)*2), чем заставлять себя писать их так, как работают машины (скажем, * 1048)* RPN : 3 4 + 2 *).

0 голосов
/ 11 сентября 2011

Известный пример, в котором синтаксический анализ более приспособлен, чем регулярные выражения (поскольку объектом обработки является, по сути, нерегулярный контекстно-свободный язык ), это X? (HT)? ML-манипуляция.См. известный пост в блоге Джеффа Этвуда на тему , полученный из известного ответа на этом сайте .

...