diff options
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/compiler.go | 53 | ||||
-rw-r--r-- | compiler/dfa.go | 16 |
2 files changed, 60 insertions, 9 deletions
diff --git a/compiler/compiler.go b/compiler/compiler.go index 6f878c5..ffe0511 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -5,6 +5,7 @@ import ( "io" "strings" + "github.com/nihei9/maleeni/compressor" "github.com/nihei9/maleeni/log" "github.com/nihei9/maleeni/spec" ) @@ -160,14 +161,19 @@ func compile(entries []*spec.LexEntry, modeNums map[spec.LexModeName]spec.LexMod } config.logger.Log(`DFA: - States: %v states - Initial State: %v`, len(tranTab.Transition), tranTab.InitialState) + States: %v states (%v entries) + Initial State: %v`, tranTab.RowCount, tranTab.RowCount*tranTab.ColCount, tranTab.InitialState) config.logger.Log(" Accepting States:") for state, symbol := range tranTab.AcceptingStates { config.logger.Log(" %v: %v", state, symbol) } } + tranTab, err := compressTransitionTable(tranTab) + if err != nil { + return nil, err + } + return &spec.CompiledLexModeSpec{ Kinds: kinds, Push: push, @@ -175,3 +181,46 @@ func compile(entries []*spec.LexEntry, modeNums map[spec.LexModeName]spec.LexMod DFA: tranTab, }, nil } + +func compressTransitionTable(tranTab *spec.TransitionTable) (*spec.TransitionTable, error) { + ueTab := compressor.NewUniqueEntriesTable() + { + orig, err := compressor.NewOriginalTable(tranTab.UncompressedTransition, tranTab.ColCount) + if err != nil { + return nil, err + } + err = ueTab.Compress(orig) + if err != nil { + return nil, err + } + } + + rdTab := compressor.NewRowDisplacementTable(0) + { + orig, err := compressor.NewOriginalTable(ueTab.UniqueEntries, ueTab.OriginalColCount) + if err != nil { + return nil, err + } + err = rdTab.Compress(orig) + if err != nil { + return nil, err + } + } + + tranTab.Transition = &spec.UniqueEntriesTable{ + UniqueEntries: &spec.RowDisplacementTable{ + OriginalRowCount: rdTab.OriginalRowCount, + OriginalColCount: rdTab.OriginalColCount, + EmptyValue: rdTab.EmptyValue, + Entries: rdTab.Entries, + Bounds: rdTab.Bounds, + RowDisplacement: rdTab.RowDisplacement, + }, + RowNums: ueTab.RowNums, + OriginalRowCount: ueTab.OriginalRowCount, + OriginalColCount: ueTab.OriginalColCount, + } + tranTab.UncompressedTransition = nil + + return tranTab, nil +} diff --git a/compiler/dfa.go b/compiler/dfa.go index 049ff3e..de2c451 100644 --- a/compiler/dfa.go +++ b/compiler/dfa.go @@ -112,18 +112,20 @@ func genTransitionTable(dfa *DFA) (*spec.TransitionTable, error) { acc[state2Num[s]] = id } - tran := make([][]int, len(dfa.States)+1) + rowCount := len(dfa.States) + 1 + colCount := 256 + tran := make([]int, rowCount*colCount) for s, tab := range dfa.TransitionTable { - entry := make([]int, 256) for v, to := range tab { - entry[v] = state2Num[to] + tran[state2Num[s]*256+v] = state2Num[to] } - tran[state2Num[s]] = entry } return &spec.TransitionTable{ - InitialState: state2Num[dfa.InitialState], - AcceptingStates: acc, - Transition: tran, + InitialState: state2Num[dfa.InitialState], + AcceptingStates: acc, + UncompressedTransition: tran, + RowCount: rowCount, + ColCount: colCount, }, nil } |