Beispiel #1
0
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())
}
Beispiel #2
0
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())
}
Beispiel #3
0
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())
}
Beispiel #4
0
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())
}
Beispiel #5
0
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())
}
Beispiel #6
0
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())
}
Beispiel #7
0
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())
}
Beispiel #8
0
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
}
Beispiel #9
0
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())
}
Beispiel #10
0
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())
}
Beispiel #11
0
func genTransitionTable(pkg, outDir, header string, itemSets *items.ItemSets) {
	fname := path.Join(outDir, "lexer", "transitiontable.go")
	io.WriteFile(fname, getTransitionTable(itemSets, header))
}