aboutsummaryrefslogtreecommitdiff
path: root/compiler/compiler.go
blob: 3ae647e3cc8748f3c8ed4c4c691280c9a1d1b550 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package compiler

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 &spec.CompiledLexSpec{
		Kinds: kinds,
		DFA:   tranTab,
	}, nil
}