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