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