Приближение разбора текста в Scala - PullRequest
2 голосов
/ 18 ноября 2009

Я делаю приложение, которое будет анализировать команды в Scala. Примером команды будет:

todo get milk for friday

Таким образом, план состоит в том, чтобы довольно умный синтаксический анализатор разбил строку и распознал командную часть и тот факт, что в строке есть ссылка на время.

В общем, мне нужно сделать токенайзер в Scala. Поэтому мне интересно, какие у меня есть варианты для этого. Я знаком с регулярными выражениями, но я планирую также сделать функцию поиска, подобную SQL:

search todo for today with tags shopping

И я чувствую, что регулярные выражения будут негибкими, реализуя команды с большим количеством вариаций. Это заставляет меня задуматься о реализации какой-то грамматики.

Какие у меня варианты в этом отношении в Scala?

Ответы [ 3 ]

9 голосов
/ 18 ноября 2009

Вы хотите найти "комбинаторы парсера". У меня есть запись в блоге, использующая этот подход (http://cleverlytitled.blogspot.com/2009/04/shunting-yard-algorithm.html),, но я думаю, что лучшая ссылка - это серия публикаций Стефана Цигера (http://szeiger.de/blog/2008/07/27/formal-language-processing-in-scala-part-1/)

)
2 голосов
/ 18 ноября 2009

Вот слайды из презентации, которую я сделал в сентябре 2009 года о комбинаторах парсера Scala. (http://sites.google.com/site/compulsiontocode/files/lambdalounge/ImplementingExternalDSLsUsingScalaParserCombinators.ppt) Продемонстрирована реализация простого языка, похожего на логотип. Он может дать некоторые идеи.

1 голос
/ 19 ноября 2009

Scala имеет библиотеку синтаксического анализатора (scala.util.parsing.combinator), которая позволяет писать синтаксический анализатор непосредственно из его спецификации EBNF . Если у вас есть EBNF для вашего языка, вам будет легко написать анализатор Scala. Если нет, то лучше сначала попытаться определить свой язык формально.

...