@@ -4,65 +4,87 @@ import (
4
4
"fmt"
5
5
"os"
6
6
7
- "github.com/spf13/cobra"
8
-
9
7
"alon.kr/x/usm/lex"
10
8
"alon.kr/x/usm/parse"
11
9
"alon.kr/x/usm/source"
10
+ "github.com/spf13/cobra"
12
11
)
13
12
13
+ func setInputSource (cmd * cobra.Command , args []string ) error {
14
+ if len (args ) > 0 {
15
+ file , err := os .Open (args [0 ])
16
+ if err != nil {
17
+ return fmt .Errorf ("error opening file: %v" , err )
18
+ }
19
+ cmd .SetIn (file )
20
+ }
21
+ return nil
22
+ }
23
+
24
+ func lexCommand (cmd * cobra.Command , args []string ) {
25
+ view , err := source .ReadSource (cmd .InOrStdin ())
26
+ if err != nil {
27
+ fmt .Printf ("Error reading source: %v\n " , err )
28
+ os .Exit (1 )
29
+ }
30
+
31
+ tokens , err := lex .NewTokenizer ().Tokenize (view )
32
+ if err != nil {
33
+ fmt .Printf ("Error tokenizing: %v\n " , err )
34
+ os .Exit (1 )
35
+ }
36
+
37
+ _ , ctx := view .Detach ()
38
+ for _ , tkn := range tokens {
39
+ fmt .Printf ("%s " , tkn .String (ctx ))
40
+ if tkn .Type == lex .SeparatorToken {
41
+ fmt .Println ()
42
+ }
43
+ }
44
+ }
45
+
46
+ func fmtCommand (cmd * cobra.Command , args []string ) {
47
+ view , err := source .ReadSource (cmd .InOrStdin ())
48
+ if err != nil {
49
+ fmt .Printf ("Error reading source: %v\n " , err )
50
+ os .Exit (1 )
51
+ }
52
+
53
+ tokens , err := lex .NewTokenizer ().Tokenize (view )
54
+ if err != nil {
55
+ fmt .Printf ("Error tokenizing: %v\n " , err )
56
+ os .Exit (1 )
57
+ }
58
+
59
+ tknView := parse .NewTokenView (tokens )
60
+ file , perr := parse .NewFileParser ().Parse (& tknView )
61
+ if perr == nil {
62
+ fmt .Print (file .String (view .Ctx ()))
63
+ } else {
64
+ fmt .Println (perr .Error (view .Ctx ()))
65
+ }
66
+ }
67
+
14
68
func main () {
15
69
rootCmd := & cobra.Command {
16
70
Use : "usm" ,
17
- Short : " One Universal assembly language to rule them all." ,
71
+ Short : "One Universal assembly language to rule them all." ,
18
72
}
19
73
20
74
lexCmd := & cobra.Command {
21
- Use : "lex" ,
22
- Short : "Lex the source code" ,
23
- Run : func (cmd * cobra.Command , args []string ) {
24
- view , err := source .ReadSource (os .Stdin )
25
- if err != nil {
26
- panic (err )
27
- }
28
-
29
- tokens , err := lex .NewTokenizer ().Tokenize (view )
30
- if err != nil {
31
- panic (err )
32
- }
33
-
34
- _ , ctx := view .Detach ()
35
- for _ , tkn := range tokens {
36
- fmt .Printf ("%s " , tkn .String (ctx ))
37
- if tkn .Type == lex .SeparatorToken {
38
- fmt .Println ()
39
- }
40
- }
41
- },
75
+ Use : "lex [file]" ,
76
+ Short : "Lex the source code" ,
77
+ Args : cobra .MaximumNArgs (1 ),
78
+ PreRunE : setInputSource ,
79
+ Run : lexCommand ,
42
80
}
43
81
44
82
fmtCmd := & cobra.Command {
45
- Use : "fmt" ,
46
- Short : "Format the source code" ,
47
- Run : func (cmd * cobra.Command , args []string ) {
48
- view , err := source .ReadSource (os .Stdin )
49
- if err != nil {
50
- panic (err )
51
- }
52
-
53
- tokens , err := lex .NewTokenizer ().Tokenize (view )
54
- if err != nil {
55
- panic (err )
56
- }
57
-
58
- tknView := parse .NewTokenView (tokens )
59
- file , perr := parse .NewFileParser ().Parse (& tknView )
60
- if perr == nil {
61
- fmt .Print (file .String (view .Ctx ()))
62
- } else {
63
- fmt .Println (perr .Error (view .Ctx ()))
64
- }
65
- },
83
+ Use : "fmt [file]" ,
84
+ Short : "Format the source code" ,
85
+ Args : cobra .MaximumNArgs (1 ),
86
+ PreRunE : setInputSource ,
87
+ Run : fmtCommand ,
66
88
}
67
89
68
90
rootCmd .AddCommand (lexCmd )
0 commit comments