func handleConflicts(conflicts map[int]lr1Items.RowConflicts, numSets int, cfg config.Config, prods ast.SyntaxProdList) { if len(conflicts) <= 0 { return } switch { case !cfg.AutoResolveLRConf(): fmt.Printf("Error: %d LR-1 conflicts\n", len(conflicts)) io.WriteFileString(path.Join(cfg.OutDir(), "LR1_conflicts.txt"), conflictString(conflicts, numSets, prods)) os.Exit(1) case cfg.Verbose(): fmt.Printf("%d LR-1 conflicts \n", len(conflicts)) io.WriteFileString(path.Join(cfg.OutDir(), "LR1_conflicts.txt"), conflictString(conflicts, numSets, prods)) } }
func GenLitConv(outDir string) { io.WriteFileString(path.Join(outDir, "util", "litconv.go"), litConvSrc) }
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()) }
func GenRune(outDir string) { io.WriteFileString(path.Join(outDir, "util", "rune.go"), runeSrc) }
func GenAction(outDir string) { io.WriteFileString(path.Join(outDir, "parser", "action.go"), actionSrc) }