diff options
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/maleeni/lex.go | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/cmd/maleeni/lex.go b/cmd/maleeni/lex.go index 7bc7126..37d7d71 100644 --- a/cmd/maleeni/lex.go +++ b/cmd/maleeni/lex.go @@ -67,12 +67,14 @@ func runLex(cmd *cobra.Command, args []string) (retErr error) { defer f.Close() w = f } + + tok2JSON := genTokenJSONMarshaler(clspec) for { tok, err := lex.Next() if err != nil { return err } - data, err := json.Marshal(tok) + data, err := tok2JSON(tok) if err != nil { return fmt.Errorf("failed to marshal a token; token: %v, error: %v\n", tok, err) } @@ -104,3 +106,31 @@ func readCompiledLexSpec(path string) (*spec.CompiledLexSpec, error) { } return clspec, nil } + +func genTokenJSONMarshaler(clspec *spec.CompiledLexSpec) func(tok *driver.Token) ([]byte, error) { + return func(tok *driver.Token) ([]byte, error) { + return json.Marshal(struct { + ModeID int `json:"mode_id"` + ModeName string `json:"mode_name"` + KindID int `json:"kind_id"` + ModeKindID int `json:"mode_kind_id"` + KindName string `json:"kind_name"` + Row int `json:"row"` + Col int `json:"col"` + Lexeme string `json:"lexeme"` + EOF bool `json:"eof"` + Invalid bool `json:"invalid"` + }{ + ModeID: tok.ModeID.Int(), + ModeName: clspec.ModeNames[tok.ModeID].String(), + KindID: tok.KindID.Int(), + ModeKindID: tok.ModeKindID.Int(), + KindName: clspec.KindNames[tok.KindID].String(), + Row: tok.Row, + Col: tok.Col, + Lexeme: string(tok.Lexeme), + EOF: tok.EOF, + Invalid: tok.Invalid, + }) + } +} |