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{ }
}
}