packages feed

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

$TestsOnly$

define TestData {
  @value String name
  @value String description
  @value Bool   boolean

  parseFrom (data) {
    return TestDataParser$create() `ParseState$$consumeAll<?>` data
  }

  create (name,description,boolean) {
    return TestData{ name, description, boolean }
  }

  getName () {
    return name
  }

  getDescription () {
    return description
  }

  getBoolean () {
    return boolean
  }
}

concrete TestDataParser {
  @type create () -> (Parser<TestData>)
}

define TestDataParser {
  refines Parser<TestData>

  @category Parser<any> whitespace <- SequenceOfParser$create(" \n\t",1,0) `Parse$or<?>` Parse$error("Expected whitespace")

  @category String sentenceChars <- "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
                                    "abcdefghijklmnopqrstuvwxyz" +
                                    "., !?-"
  @category Parser<String> sentence <- SequenceOfParser$create(sentenceChars,0,0)
  @category Parser<any>    quote    <- CharParser$create('"')

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

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

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

  run (contextOld) {
    ParseContext<any> context <- contextOld
    context                              <- context.run<?>(fileStart)
    context                              <- context.run<?>(nameTag)
    context, ErrorOr<String> name        <- context.runAndGet<?>(sentenceOrToken)
    context                              <- context.run<?>(descriptionTag)
    context, ErrorOr<String> description <- context.runAndGet<?>(sentenceOrToken)
    context                              <- context.run<?>(aWordTag)
    context, ErrorOr<Bool> boolean       <- context.runAndGet<?>(acronymOrAardvark)
    context                              <- context.run<?>(fileEnd)

    if (context.hasAnyError()) {
      return context.convertError()
    } else {
      return context.setValue<?>(
        ErrorOr$$value<?>(TestData$create(name.getValue(),
                                          description.getValue(),
                                          boolean.getValue())))
    }
  }

  create ()  {
    return TestDataParser{ }
  }
}