- Notifications
You must be signed in to change notification settings - Fork1
A parser combinator library for Go.
License
NotificationsYou must be signed in to change notification settings
shellyln/takenoco
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Parser Combinator Library for Go.
A framework for making easy use of parser combinators and production rules.
- CSV parser
- Formula parser
- Formula to RPN converter
- Loose JSON + TOML parsers
- Dust - toy scripting language
- OpenSOQL parser
package csvimport ("errors""strconv" ."github.com/shellyln/takenoco/base" ."github.com/shellyln/takenoco/string")var (// Comma and line break characterscellBreakCharacters []stringdocumentParserParserFn)funcinit() {cellBreakCharacters=make([]string,0,len(LineBreakCharacters)+1)cellBreakCharacters=append(cellBreakCharacters,",")cellBreakCharacters=append(cellBreakCharacters,LineBreakCharacters...)documentParser=document()}// Remove the resulting AST.funcerase(fnParserFn)ParserFn {returnTrans(fn,Erase)}// Whitespacesfuncsp()ParserFn {returnerase(ZeroOrMoreTimes(WhitespaceNoLineBreak()))}funcquotedCell()ParserFn {returnTrans(OneOrMoreTimes(FlatGroup(sp(),erase(Seq("\"")),ZeroOrMoreTimes(First(erase(Seq("\"\"")),CharClassN("\""), ), ),First(erase(Seq("\"")),FlatGroup(End(),Error("Unexpected EOF")), ),sp(), ), ),Concat, )}funccell()ParserFn {returnTrans(ZeroOrMoreTimes(CharClassN(cellBreakCharacters...)),Trim, )}// Convert AST to array data. (line)funclineTransform(_ParserContext,astsAstSlice) (AstSlice,error) {w:=make([]string,len(asts))length:=len(asts)fori:=0;i<length;i++ {w[i]=asts[i].Value.(string) }returnAstSlice{{ClassName:"*Line",Type:AstType_Any,Value:w, }},nil}funcline()ParserFn {returnTrans(FlatGroup(ZeroOrMoreTimes(First(quotedCell(),cell()),erase(Seq(",")), ),First(quotedCell(),cell()), ),lineTransform, )}// Convert AST to array data. (Entire document)funcdocumentTransform(_ParserContext,astsAstSlice) (AstSlice,error) {length:=len(asts)w:=make([][]string,length)fori:=0;i<length;i++ {w[i]=asts[i].Value.([]string) }fori:=length-1;i>=0;i-- {iflen(w[i])==0||len(w[i])==1&&w[i][0]=="" {w=w[:i] }else {break } }returnAstSlice{{ClassName:"*Document",Type:AstType_Any,Value:w, }},nil}funcdocument()ParserFn {returnTrans(FlatGroup(ZeroOrMoreTimes(line(),erase(OneOrMoreTimes(LineBreak())), ),line(),End(), ),documentTransform, )}funcParse(sstring) ([][]string,error) {out,err:=documentParser(*NewStringParserContext(s))iferr!=nil {returnnil,err }else {ifout.MatchStatus==MatchStatus_Matched {returnout.AstStack[0].Value.([][]string),nil }else {returnnil,errors.New("Parse failed at "+strconv.Itoa(out.SourcePosition.Position)) } }}
package mainimport ("fmt""os" csv"github.com/shellyln/takenoco/_examples/csv")funcmain() {x,err:=csv.Parse("0,1,2,3,4,5,6,7,8,9\n0,1,2,3,4,5,6,7,8,9")iferr!=nil {fmt.Fprintln(os.Stderr,err)os.Exit(-1) }fmt.Println(x)y:=csv.ToCsv(x)fmt.Println(y)os.Exit(0)}
choco install make# or# scoop install make
make
make wasm
scoop install tinygoscoop install binaryen
- https://scoop.sh/
- https://tinygo.org/getting-started/install/windows/
- tinygo-org/tinygo#2601
- https://github.com/WebAssembly/binaryen
make tinywasm
go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow@latestgo install honnef.co/go/tools/cmd/staticcheck@latest
MIT
Copyright (c) 2021 Shellyl_N and Authors.
About
A parser combinator library for Go.
Topics
Resources
License
Stars
Watchers
Forks
Packages0
No packages published