diff options
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/compiler.go | 26 | ||||
-rw-r--r-- | compiler/dfa.go | 12 |
2 files changed, 27 insertions, 11 deletions
diff --git a/compiler/compiler.go b/compiler/compiler.go index 153ad77..3ae647e 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -1,9 +1,29 @@ package compiler -func Compile(regexps map[int][]byte) (*DFA, error) { - root, symTab, err := parse(regexps) +import "github.com/nihei9/maleeni/spec" + +func Compile(lexspec *spec.LexSpec) (*spec.CompiledLexSpec, error) { + var kinds []string + var patterns map[int][]byte + { + kinds = append(kinds, "") + patterns = map[int][]byte{} + for i, e := range lexspec.Entries { + kinds = append(kinds, e.Kind) + patterns[i+1] = []byte(e.Pattern) + } + } + root, symTab, err := parse(patterns) + if err != nil { + return nil, err + } + dfa := genDFA(root, symTab) + tranTab, err := genTransitionTable(dfa) if err != nil { return nil, err } - return genDFA(root, symTab), nil + return &spec.CompiledLexSpec{ + Kinds: kinds, + DFA: tranTab, + }, nil } diff --git a/compiler/dfa.go b/compiler/dfa.go index fec93ce..b07954f 100644 --- a/compiler/dfa.go +++ b/compiler/dfa.go @@ -2,6 +2,8 @@ package compiler import ( "sort" + + "github.com/nihei9/maleeni/spec" ) type DFA struct { @@ -99,13 +101,7 @@ func genDFA(root astNode, symTab *symbolTable) *DFA { } } -type TransitionTable struct { - InitialState int `json:"initial_state"` - AcceptingStates map[int]int `json:"accepting_states"` - Transition [][]int `json:"transition"` -} - -func GenTransitionTable(dfa *DFA) (*TransitionTable, error) { +func genTransitionTable(dfa *DFA) (*spec.TransitionTable, error) { state2Num := map[string]int{} for i, s := range dfa.States { state2Num[s] = i + 1 @@ -125,7 +121,7 @@ func GenTransitionTable(dfa *DFA) (*TransitionTable, error) { tran[state2Num[s]] = entry } - return &TransitionTable{ + return &spec.TransitionTable{ InitialState: state2Num[dfa.InitialState], AcceptingStates: acc, Transition: tran, |