packages feed

zeolite-lang-0.6.0.0: example/parser/test-data.0rx

$TestsOnly$

define TestData {
  @category Parser<any> whitespace <- SequenceOfParser$create(" \n\t",1,0)

  @category Parser<String> sentence        <- SentenceParser$create()
  @category Parser<String> token           <- SequenceOfParser$create("ABCDEFGHIJKLMNOPQRSTUVWXYZ_",1,0)
  @category Parser<String> sentenceOrToken <- sentence `Parse$or<String>` token `Parse$left<String>` whitespace

  @category Parser<Bool> acronym           <- StringParser$create("acronym")  `Parse$right<Bool>` Parse$const<Bool>(true)
  @category Parser<Bool> aardvark          <- StringParser$create("aardvark") `Parse$right<Bool>` Parse$const<Bool>(false)
  @category Parser<Bool> acronymOrAardvark <- `Parse$try<Bool>` acronym `Parse$or<Bool>` aardvark `Parse$left<Bool>` whitespace

  @category Parser<any> fileStart      <- StringParser$create("file_start")   `Parse$left<any>` whitespace
  @category Parser<any> fileEnd        <- StringParser$create("file_end")     `Parse$left<any>` whitespace
  @category Parser<any> nameTag        <- StringParser$create("name:")        `Parse$left<any>` whitespace
  @category Parser<any> descriptionTag <- StringParser$create("description:") `Parse$left<any>` whitespace
  @category Parser<any> aWordTag       <- StringParser$create("a_word:")      `Parse$left<any>` whitespace

  @value String name
  @value String description
  @value Bool   boolean

  parseFrom (data) {
    ParseState<any> state <- ParseState$$new(data)
    state                              <- state.run<any>(fileStart)
    state                              <- state.run<any>(nameTag)
    state, ErrorOr<String> name        <- state.runAndGet<String>(sentenceOrToken)
    state                              <- state.run<any>(descriptionTag)
    state, ErrorOr<String> description <- state.runAndGet<String>(sentenceOrToken)
    state                              <- state.run<any>(aWordTag)
    state, ErrorOr<Bool> boolean       <- state.runAndGet<Bool>(acronymOrAardvark)
    state                              <- state.run<any>(fileEnd)

    if (state.hasAnyError()) {
      return ErrorOr$$error(state.getError())
    } elif (!state.atEof()) {
      return ErrorOr$$error("Parsing did not consume all of the data")
    } else {
      return ErrorOr$$value<TestData>(TestData{ name.getValue(),
                                                description.getValue(),
                                                boolean.getValue() })
    }
  }

  getName () {
    return name
  }

  getDescription () {
    return description
  }

  getBoolean () {
    return boolean
  }
}

concrete SentenceParser {
  @type create () -> (Parser<String>)
}

define SentenceParser {
  refines Parser<String>

  @category String sentenceChars <- "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
                                    "abcdefghijklmnopqrstuvwxyz" +
                                    "., !?-"
  @category Parser<String> string <- SequenceOfParser$create(sentenceChars,0,0)

  run (contextOld) {
    if (contextOld.hasAnyError()) {
      return contextOld.convertError<String>()
    }
    ParseContext<any> context <- contextOld
    context                       <- context.run<any>(CharParser$create('"'))
    context, ErrorOr<String> text <- context.runAndGet<String>(string)
    context                       <- context.run<any>(CharParser$create('"'))
    return context.setValue<String>(text)
  }

  create () {
    return SentenceParser{ }
  }
}