func parse(src string, t *testing.T) *ast.Grammar { scanner := new(scanner.Scanner) scanner.Init([]byte(src), token.FRONTENDTokens) parser := parser.NewParser(parser.ActionTable, parser.GotoTable, parser.ProductionsTable, token.FRONTENDTokens) g, err := parser.Parse(scanner) if err != nil { t.Fatal(fmt.Sprintf("Parse error: %s\n", err)) return nil } return g.(*ast.Grammar) }
func main() { flag.Usage = usage if cfg1, err := config.New(); err != nil { fmt.Printf("Error reading configuration: %s\n", err) flag.Usage() } else { cfg = cfg1 } if cfg.Verbose() { cfg.PrintParams() } if cfg.Help() { flag.Usage() } // if *profile { // startProfiler() // defer pprof.StopCPUProfile() // } scanner := &scanner.Scanner{} srcBuffer, err := ioutil.ReadFile(cfg.SourceFile()) if err != nil { fmt.Println(err) os.Exit(1) } scanner.Init(srcBuffer, token.FRONTENDTokens) parser := parser.NewParser(parser.ActionTable, parser.GotoTable, parser.ProductionsTable, token.FRONTENDTokens) grammar, err := parser.Parse(scanner) if err != nil { fmt.Printf("Parse error: %s\n", err) os.Exit(1) } g := grammar.(*ast.Grammar) gSymbols := symbols.NewSymbols(g) if cfg.Verbose() { writeTerminals(gSymbols, cfg) } var tokenMap *outToken.TokenMap gSymbols.Add(g.LexPart.TokenIds()...) g.LexPart.UpdateStringLitTokens(gSymbols.ListStringLitSymbols()) lexSets := lexItems.GetItemSets(g.LexPart) if cfg.Verbose() { io.WriteFileString(path.Join(cfg.OutDir(), "lexer_sets.txt"), lexSets.String()) } tokenMap = outToken.NewTokenMap(gSymbols.ListTerminals()) if !cfg.NoLexer() { genLexer.Gen(cfg.Package(), cfg.OutDir(), g.LexPart.Header.SDTLit, lexSets, tokenMap, cfg) } if g.SyntaxPart != nil { firstSets := first.GetFirstSets(g, gSymbols) if cfg.Verbose() { io.WriteFileString(path.Join(cfg.OutDir(), "first.txt"), firstSets.String()) } lr1Sets := lr1Items.GetItemSets(g, gSymbols, firstSets) if cfg.Verbose() { io.WriteFileString(path.Join(cfg.OutDir(), "LR1_sets.txt"), lr1Sets.String()) } conflicts := genParser.Gen(cfg.Package(), cfg.OutDir(), g.SyntaxPart.Header.SDTLit, g.SyntaxPart.ProdList, gSymbols, lr1Sets, tokenMap, cfg) handleConflicts(conflicts, lr1Sets.Size(), cfg, g.SyntaxPart.ProdList) } genToken.Gen(cfg.Package(), cfg.OutDir(), tokenMap) genUtil.Gen(cfg.OutDir()) }