Как анализировать строку без регулярных выражений

в настоящее время я пытаюсь создать компонент программного обеспечения, который смог бы интерпретировать динамические строки, такие как:

%TO_LOWER%(%DELETE_WHITESPACES%("A SAMPLE TEXT"))

что приведет к этой строке:

asampletext

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

мои вопросы:

  • является ли lexing / parsing лучше, чем regexp для такого цель, или я должен просто пойти с regexp и забыть об этом?
  • такая библиотека уже существует в Java?
  • знаете ли вы какой-либо учебник, показывающий некоторые примеры алгоритмов синтаксического анализа/лексики?

спасибо!

3 ответов


является ли lexing / parsing лучше, чем regexp для такой цели, или я должен просто пойти с regexp и забыть об этом?

Regexes не может выразить рекурсивную грамматику, и ваш синтаксис, по-видимому, требует рекурсивной грамматики. Если это так, то regexes просто не решит проблему.

такая библиотека уже существует в Java?

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

знаете ли вы какой-либо учебник, показывающий некоторые примеры алгоритмов синтаксического анализа/лексики?

оба Antlr и Javacc имеют обширный учебный материал и примеры.


вы можете попробовать использовать Scala на JVM. это делает его очень легко создать DSLs.


когда вы не привязаны только к Java, вы можете использовать синтаксический анализатор PEG другого языка или Rebol (у него есть "диалект", который эквивалентен PEG ) - или вернуться к значку или Unicon или теперь даже значок объекта на code.google.com/p/objecticon

Это был печальный момент, когда я понял, что язык веб-контента MIT Curl (www.curl.com) выбрал regexp для пользователей, хотя Curl имеет макросы и предлагает доступ к AST.

общие темы : выражение парсер грамматики (ПЭГ) и вообще разбор packrat.

Perl use завещал нам PCRE, так что мы можем сделать, но избежать этого, когда это не нужно ( есть antlr и Зубр ... и, без сомнения, у них тоже есть свое место, где они легко помещаются )

Примечание: Rebol, Icon и Curl-это языки, основанные на выражении (Icon имеет ограниченное отслеживание).

другие варианты вне-а-пути включают Оз и ртуть (последняя может вывести наружу Эрланг )

Я не использую pyPEG потому что я ограничен на Python 2.6.6; python parse Lepl больше не поддерживается - но будет установлен для 2.6

параметры парсинга в Python включают YAPPS на http://theory.stanford.edu/~amitp/yapps/ и ряд других; Примечание: когда pyparsing не удалось установить в какой-либо Python-ОКР по

и для Scala / Java есть этот проект PEG:https://github.com/sirthias/parboiled/wiki

вы можете найти Java equiv для привязки и ноги в http://piumarta.com/software/peg/

CiteSeer имеет статью Ральфа Бекета о разборе packrat и Mercury (google для PEG parse mercury site:psu.edu)

существует также серия из 3 сообщений в блоге AdventuresInMercury.