Through Google has tool about yacc named goyacc, But it generate go code can not debug! see the issue
golang/vscode-go#1674 (comment)
I tried to modify the codes, It is not good readable, and I have no patient to do it, So I write a YaccGo
YaccGo is an understandable and debugable Yacc in Go. . It is written in Go and generates parsers written in Go ,typescript, rust ...
clone the code
make all
# generate the typescript parser code
bin/yaccgo generate typescript examples/exprts.y expts.ts
at your y
file You should do as follower
more in manual
After generate the parse code, modify the var IsTrace bool = false
to var IsTrace bool = true
, then you can see the trace of the parser. feature completed for go, other are WIP.
for example:
bin/yaccgo generate go examples/ladd.y out/ladd.go
then you modify the ladd.go file, change code var IsTrace bool = false
to var IsTrace bool = true
, then
go run out/ladd.go
You can see trace information
look ahead NUM, use Reduce:PROG -> , go to state 1
Shift PROG, push state 1
Shift NUM, push state 3
look ahead PLUS, use Reduce:E -> NUM , go to state 2
Shift E, push state 2
Shift PLUS, push state 5
Shift NUM, push state 3
look ahead NL, use Reduce:E -> NUM , go to state 6
Shift E, push state 6
look ahead NL, use Reduce:E -> E PLUS E , go to state 2
Shift E, push state 2
Shift NL, push state 4
3
look ahead $, use Reduce:PROG -> PROG E NL , go to state 1
Shift PROG, push state 1
0
if you want build several parser in one app, you should use generate parser with context. Now it is just supported in Go
add -o
option in generate command, for example:
bin/yaccgo generate go -o examples/e.y out/e.go
then, you should make context before using the parser, for example like this:
func main() {
c := MakeParserContext()
v := c.Parser("nnn")
fmt.Println(v)
}
If you want to debug the parser visually, you can use yaccgo debuger in browser.
./bin/yaccgo generate go --httpdebug=true examples/exprhttp.y out/expr.go
go run out/expr.go
LALR1 Algorithm Base on
https://hassan-ait-kaci.net/pdf/others/p615-deremer.pdf
Lexer inspired from
https://www.youtube.com/watch?v=HxaD_trXwRE
- support language:
-
go
-
typescript
-
rust
-
DotGraph
surpose your machine has got
dot
, or you can install it from https://graphviz.org/download/if you want to see the LALR DFA(deterministic finite automata) diagram. use the
-g
or--dotg=
for example:
bin/yaccgo generate go -g./expr.png -o ./examples/exprobj.y ./out/exprobj.go
you can see the diagram as follow:
see wiki and add your own project to it
Welcome to contributing, We appreciate your help! please make sure
staticcheck
no error- codes should has test
2022.5.30
- Optimize the packtable use action default values and goto default values
- use the template to generate the Code
- reserve the old codes but it will deprecate them in future 2022.9.22
- add the oop code generator 2022.11.4
- support dot graphviz