v1.1.1
for AiScript v0.12.x (>= v0.12.1)
original implementation:
https://github.com/marihachi/terrario
Generates a parser that consumes the specified string.
let parser = str("abc")
Generates a parser that applies parsers in sequence.
let parser = seq([
str("abc"),
str("123"),
])
Generates a parser that tries to match one of the parsers. The parsers are used in order of precedence.
let parser = alt([
str("abc"),
str("123"),
])
Generates a parser that performs the Positive lookahead.
let parser = seq([
matched(str("a")),
char.many(1),
])
Generates a parser that performs the Negative lookahead.
let parser = seq([
notMatched(str("a")),
char.many(1),
])
A parser that consumes any single character.
let parser = char.many(1)
We can define some syntax rules to build a language.
let lang = createLanguage({
root: @(r) {
alt([
r.nest,
r.word,
]).many(0)
}
nest: @(r) {
seq([
str("("),
r.root,
str(")"),
])
}
word: @(r) {
str("abc")
}
})
lang.root.parse("abc(abc)")
Parses with the parser.
let parser = str("abc")
let result = parser.parse("abc")
<: Json:stringify(result)
// => {"success":true,"value":"abc","index":3}
Maps the parsed results using the specified function.
let parser = str("123").map(@(x) { x.to_num() })
let parser = seq([
str("#"),
str("123"),
]).map(@(x) { x[1] })
The parser maps the consumed portion as a string.
let parser = seq([
str("abc"),
str("123"),
]).text()
Repeatedly applies the parser. The argument min specifies the minimum number of times it will be applied.
let parser = str("123").many(1)
Make the parser consumption optional.
let parser = seq([
str("-").option(),
str("1"),
])