packages feed

zeolite-lang-0.9.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{ }
  }
}