Задача: создать свой компилятор для вымышленного dsl-языка,
состоящего из блоков с отступами, аналогично языкам, таким как Python. В качестве лексического анализатора используется библиотека,
которая ранее являлась частью языка Скала - parser combinators
.
Пример парсинга файла to.parse
(придуманный dsl):
read input name, country
switch:
country == "PT" ->
call service "A"
exit
otherwise ->
call service "B"
switch:
name == "unknown" ->
exit
otherwise ->
call service "C"
exit
В код следующего вида:
AndThen(
ReadInput(List(name, country)),
Choice(List(
IfThen(
Equals(country, PT),
AndThen(CallService(A), Exit)
),
OtherwiseThen(
AndThen(
CallService(B),
Choice(List(
IfThen(Equals(name, unknown), Exit),
OtherwiseThen(AndThen(CallService(C), Exit))
))
)
)
))
)
Parser combinator - это просто функция, которая принимает парсеры в качестве входных данных и возвращает новый синтаксический анализатор в качестве вывода, аналогично тому, как функции более высокого порядка полагаются на вызов других функций, которые передаются в качестве входных данных для создания новой функции в качестве вывода.
В качестве примера, предположим, что у нас есть парсер int
, который распознает целочисленные литералы
и парсер plus
, который распознает символ «+».
Следовательно, мы можем создать парсер,
который распознает последовательность int plus int
как целочисленное дополнение.
Стандартная библиотека Scala включает в себя реализацию комбинаторов парсеров, которая размещается по адресу: github.com/scala/scala-parser-combinators
Чтобы использовать его, вам просто потребуется следующая зависимость в вашем build.sbt
:
«org.scala-lang.modules» %% »scala-parser-combinators«% »1.1.1"
НАВИГАЦИЯ: