- 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
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
No packages published
Uh oh!
There was an error while loading.Please reload this page.