Как анализировать строку без регулярных выражений
в настоящее время я пытаюсь создать компонент программного обеспечения, который смог бы интерпретировать динамические строки, такие как:
%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.