Skip to content
This repository has been archived by the owner on May 4, 2021. It is now read-only.
/ LexerParser Public archive

Лексический парсер на примере создания собственного dsl языка с использованием Scala Parser Combinators

Notifications You must be signed in to change notification settings

steklopod/LexerParser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Создание собственного компилятора для вымышленного dsl языка

Задача: создать свой компилятор для вымышленного 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"

НАВИГАЦИЯ:

About

Лексический парсер на примере создания собственного dsl языка с использованием Scala Parser Combinators

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages