bread-n-butter
TS first
examplesが型駆動な感じが良いmrsekut.icon
めちゃくちゃ良い
Docsが親切
examplesが豊富
型が厳格
APIのDXが高い
Parser Functions
bnb.text(string)
bnb.match(regexp)
正規表現
bnb.all(...parsers)
bnb.choice(...parsers)
<|>
bnb.lazy(callback)
再帰が必要になったら
bnb.ok(value)
bnb.fail(expected)
Parser Methods
parser.parse(input)
parser.tryParse(input)
parser.and(nextParser)
両方試して、結果を配列として返す
parser.next(nextParser)
両方試して、あとの方の結果のみを返す
parser.chain(callback)
parser.or(otherParser)
parser.skip(nextParser)
parser.wrap(beforeParser, afterParser)
parser.trim(trimParser)
parser.repeat(min = 0, max = Infinity)
many
parser.sepBy(sepParser, min = 0, max = Infinity)
parser.thru(callback)
new bnb.Parser(action)
parser.map(callback)
parser.node(name)
parser.desc(expected)
エラーメッセージ
parser.action
Built-in Parsers
bnb.eof
bnb.location
anyOf的なやつ
code:ts
const indents = bnb
.match(/\s/)
.repeat()
.map(r => r.length); // r :: string[]
const indents = bnb
.text(' ')
.or(bnb.text(' '))
.or(bnb.text('\t'))
.or(bnb.text('\n'))
.repeat()
.map(r => r.length); // r :: (" " | " " | "\t" | "\n")[]
正規表現でも、orの組み合わせでも書けるが、
前者のほうが簡潔
後者のほうが型の表現力が上がる