func writeTerminals(gSymbols *symbols.Symbols, cfg config.Config) { buf := new(bytes.Buffer) for _, t := range gSymbols.ListTerminals() { fmt.Fprintf(buf, "%s\n", t) } io.WriteFile(path.Join(cfg.OutDir(), "terminals.txt"), buf.Bytes()) }
func GenGotoTable(outDir string, itemSets *items.ItemSets, sym *symbols.Symbols) { tmpl, err := template.New("parser goto table").Parse(gotoTableSrc) if err != nil { panic(err) } wr := new(bytes.Buffer) tmpl.Execute(wr, getGotoTableData(itemSets, sym)) io.WriteFile(path.Join(outDir, "parser", "gototable.go"), wr.Bytes()) }
func GenParser(pkg, outDir string, prods ast.SyntaxProdList, itemSets *items.ItemSets, symbols *symbols.Symbols, cfg config.Config) { tmpl, err := template.New("parser").Parse(parserSrc) if err != nil { panic(err) } wr := new(bytes.Buffer) tmpl.Execute(wr, getParserData(pkg, prods, itemSets, symbols, cfg)) io.WriteFile(path.Join(outDir, "parser", "parser.go"), wr.Bytes()) }
func GenErrors(pkg, outDir string) { tmpl, err := template.New("parser errors").Parse(errorsSrc) if err != nil { panic(err) } wr := new(bytes.Buffer) tmpl.Execute(wr, path.Join(pkg, "token")) io.WriteFile(path.Join(outDir, "errors", "errors.go"), wr.Bytes()) }
func genActionTable(pkg, outDir string, itemsets *items.ItemSets, tokMap *token.TokenMap) { fname := path.Join(outDir, "lexer", "acttab.go") tmpl, err := template.New("action table").Parse(actionTableSrc) if err != nil { panic(err) } wr := new(bytes.Buffer) tmpl.Execute(wr, getActTab(pkg, itemsets, tokMap)) io.WriteFile(fname, wr.Bytes()) }
func GenToken(pkg, outdir string, tokMap *token.TokenMap) { tokenPath := path.Join(outdir, "token", "token.go") tmpl, err := template.New("token").Parse(TokenMapSrc) if err != nil { panic(err) } buf := new(bytes.Buffer) err = tmpl.Execute(buf, TokenData{TypMap: tokMap.TypeMap, IdMap: typeMap(tokMap)}) io.WriteFile(tokenPath, buf.Bytes()) }
func genAsciiTable(outDir string, symbols *symbols.Symbols) { tmpl, err := template.New("ascii table").Parse(asciiTabSrc) if err != nil { panic(err) } w := new(bytes.Buffer) if err = tmpl.Execute(w, getAsciiTab(symbols)); err != nil { panic(err) } io.WriteFile(path.Join(outDir, "lexer", "asciitable.go"), w.Bytes()) }
func GenActionTable(outDir string, prods ast.SyntaxProdList, itemSets *items.ItemSets, tokMap *token.TokenMap) map[int]items.RowConflicts { tmpl, err := template.New("parser action table").Parse(actionTableSrc) if err != nil { panic(err) } wr := new(bytes.Buffer) data, conflicts := getActionTableData(prods, itemSets, tokMap) tmpl.Execute(wr, data) io.WriteFile(path.Join(outDir, "parser", "actiontable.go"), wr.Bytes()) return conflicts }
func genLexer(pkg, outDir string, itemsets *items.ItemSets, cfg config.Config) { tmpl, err := template.New("lexer").Parse(lexerSrc) if err != nil { panic(err) } buf := new(bytes.Buffer) err = tmpl.Execute(buf, getLexerData(pkg, outDir, itemsets, cfg)) if err != nil { panic(err) } io.WriteFile(path.Join(outDir, "lexer", "lexer.go"), buf.Bytes()) }
func GenProductionsTable(pkg, outDir, header string, prods ast.SyntaxProdList, symbols *symbols.Symbols, itemsets *items.ItemSets, tokMap *token.TokenMap) { fname := path.Join(outDir, "parser", "productionstable.go") tmpl, err := template.New("parser productions table").Parse(prodsTabSrc) if err != nil { panic(err) } wr := new(bytes.Buffer) tmpl.Execute(wr, getProdsTab(header, prods, symbols, itemsets, tokMap)) io.WriteFile(fname, wr.Bytes()) }
func genTransitionTable(pkg, outDir, header string, itemSets *items.ItemSets) { fname := path.Join(outDir, "lexer", "transitiontable.go") io.WriteFile(fname, getTransitionTable(itemSets, header)) }