diff options
author | Ryo Nihei <nihei.dev@gmail.com> | 2021-04-08 00:36:22 +0900 |
---|---|---|
committer | Ryo Nihei <nihei.dev@gmail.com> | 2021-04-08 00:36:22 +0900 |
commit | 91b93662e8ec8a92d763fad74da56b360bba2660 (patch) | |
tree | 231e3728a0b682d9376bbe84c7a7a6ce55ff4177 /compiler/compiler.go | |
parent | Print the result of the lex command in JSON format (diff) | |
download | tre-91b93662e8ec8a92d763fad74da56b360bba2660.tar.gz tre-91b93662e8ec8a92d763fad74da56b360bba2660.tar.xz |
Add logging to compile command
compile command writes logs out to the maleeni-compile.log file.
When you use compiler.Compile(), you can choose whether the lexer writes logs or not.
Diffstat (limited to 'compiler/compiler.go')
-rw-r--r-- | compiler/compiler.go | 80 |
1 files changed, 71 insertions, 9 deletions
diff --git a/compiler/compiler.go b/compiler/compiler.go index 3ae647e..02cda43 100644 --- a/compiler/compiler.go +++ b/compiler/compiler.go @@ -1,8 +1,41 @@ package compiler -import "github.com/nihei9/maleeni/spec" +import ( + "io" + "strings" + + "github.com/nihei9/maleeni/log" + "github.com/nihei9/maleeni/spec" +) + +type compilerOption func(c *compilerConfig) error + +func EnableLogging(w io.Writer) compilerOption { + return func(c *compilerConfig) error { + logger, err := log.NewLogger(w) + if err != nil { + return err + } + c.logger = logger + return nil + } +} + +type compilerConfig struct { + logger log.Logger +} + +func Compile(lexspec *spec.LexSpec, opts ...compilerOption) (*spec.CompiledLexSpec, error) { + config := &compilerConfig{ + logger: log.NewNopLogger(), + } + for _, opt := range opts { + err := opt(config) + if err != nil { + return nil, err + } + } -func Compile(lexspec *spec.LexSpec) (*spec.CompiledLexSpec, error) { var kinds []string var patterns map[int][]byte { @@ -12,16 +45,45 @@ func Compile(lexspec *spec.LexSpec) (*spec.CompiledLexSpec, error) { kinds = append(kinds, e.Kind) patterns[i+1] = []byte(e.Pattern) } + + config.logger.Log("Patterns:") + for i, p := range patterns { + config.logger.Log(" #%v %v", i, string(p)) + } } - root, symTab, err := parse(patterns) - if err != nil { - return nil, err + + var root astNode + var symTab *symbolTable + { + var err error + root, symTab, err = parse(patterns) + if err != nil { + return nil, err + } + + var b strings.Builder + printAST(&b, root, "", "", false) + config.logger.Log("AST:\n%v", b.String()) } - dfa := genDFA(root, symTab) - tranTab, err := genTransitionTable(dfa) - if err != nil { - return nil, err + + var tranTab *spec.TransitionTable + { + dfa := genDFA(root, symTab) + var err error + tranTab, err = genTransitionTable(dfa) + if err != nil { + return nil, err + } + + config.logger.Log(`DFA: + States: %v states + Initial State: %v`, len(tranTab.Transition), tranTab.InitialState) + config.logger.Log(" Accepting States:") + for state, symbol := range tranTab.AcceptingStates { + config.logger.Log(" %v: %v", state, symbol) + } } + return &spec.CompiledLexSpec{ Kinds: kinds, DFA: tranTab, |