func main() { // get command line options nways := 1 if len(os.Args) == 3 { nways, _ = strconv.Atoi(os.Args[2]) } if len(os.Args) < 2 || len(os.Args) > 3 || nways < 1 { log.Fatal("usage: rxtime exprfile [n]") } filename := os.Args[1] // load expressions from file exprs := rx.LoadExpressions(filename, nil) nexprs := len(exprs) if nways < 1 || nways > nexprs { log.Fatal(fmt.Sprintf( "cannot combine %d expressions(s) in %d way(s)", nexprs, nways)) } // record individual complexity scores and make augmented parse trees cx := make([]int, nexprs) for i, t := range exprs { cx[i] = rx.ComplexityScore(t.Tree) t.Tree = rx.Augment(t.Tree, i) } // initialize index list for first combination {0,1,2...} xlist := make([]int, nways) for i := range xlist { xlist[i] = i } // try all possible n-way combinations by varying the index list tlist := make([]rx.Node, nways) for xlist != nil { for i, x := range xlist { tlist[i] = exprs[x].Tree } _ = rxsys.Interval() // reset timer dfa1 := rx.MultiDFA(tlist) // make DFA t1 := rxsys.Interval().Seconds() // measure time dfa2 := dfa1.Minimize() // minimize DFA t2 := rxsys.Interval().Seconds() // measure time fmt.Printf("%6d %6d %8.3f %8.3f", len(dfa1.Dstates), len(dfa2.Dstates), t1, t2) if nways == 1 { fmt.Printf(" %6d", cx[xlist[0]]) } fmt.Print(" {") for _, x := range xlist { fmt.Printf(" %d", x) } fmt.Print(" }\n") xlist = advance(xlist, nexprs) // get next combination } }
// load slurps up expressions, returning list and augmented parse tree list func load() ([]*rx.RegExParsed, []rx.Node) { exprs := make([]*rx.RegExParsed, 0) // expression structure list trees := make([]rx.Node, 0) // augmented parse tree list rx.LoadFromScanner(input, func(l *rx.RegExParsed) { echo(l, len(exprs)) if l.Tree != nil { // if a real expression image := fmt.Sprintf("%s", l.Tree) cx := rx.ComplexityScore(l.Tree) augtree := rx.Augment(l.Tree, len(trees)) trees = append(trees, augtree) exprs = append(exprs, l) if *opt['i'] { individual(l, cx, len(exprs), image, augtree) } } }) babble("%d expression(s) loaded\n", rx.InputRegExCount) if rx.InputErrorCount != 0 && (!errsilent || verbose) { fmt.Printf("(%d expression(s) rejected)\n", rx.InputErrorCount) } return exprs, trees }