func Compile(rules *ast.Rules, tokens Tokens) (eval *exec.Exec, rootToken int, err error) { tab := table.New(rules.GetTransitions(), rules.GetIfExprs()) catcher := funcs.NewCatcher(false) link, err := link.NewLink(rules, tokens, tab, catcher) if err != nil { return nil, 0, err } rootToken, err = tokens.GetTokenId(rules.GetRoot().GetPackage() + "." + rules.GetRoot().GetMessage()) if err != nil { return nil, 0, err } startState, err := findStartState(rules.GetRoot(), rules.GetInits(), tab) if err != nil { return nil, 0, err } acceptState, err := tab.NameToState("accept") if err != nil { return nil, 0, err } eval = exec.NewExec(tab, link, catcher, startState, acceptState) return eval, rootToken, nil }