github.com/cilki/sh@v2.6.4+incompatible/syntax/example_test.go (about) 1 // Copyright (c) 2016, Daniel Martà <mvdan@mvdan.cc> 2 // See LICENSE for licensing information 3 4 package syntax_test 5 6 import ( 7 "fmt" 8 "os" 9 "regexp" 10 "strings" 11 12 "mvdan.cc/sh/syntax" 13 ) 14 15 func Example() { 16 r := strings.NewReader("{ foo; bar; }") 17 f, err := syntax.NewParser().Parse(r, "") 18 if err != nil { 19 return 20 } 21 syntax.NewPrinter().Print(os.Stdout, f) 22 // Output: 23 // { 24 // foo 25 // bar 26 // } 27 } 28 29 func ExampleWord() { 30 r := strings.NewReader("echo foo${bar}'baz'") 31 f, err := syntax.NewParser().Parse(r, "") 32 if err != nil { 33 return 34 } 35 36 printer := syntax.NewPrinter() 37 args := f.Stmts[0].Cmd.(*syntax.CallExpr).Args 38 for i, word := range args { 39 fmt.Printf("Word number %d:\n", i) 40 for _, part := range word.Parts { 41 fmt.Printf("%-20T - ", part) 42 printer.Print(os.Stdout, part) 43 fmt.Println() 44 } 45 fmt.Println() 46 } 47 48 // Output: 49 // Word number 0: 50 // *syntax.Lit - echo 51 // 52 // Word number 1: 53 // *syntax.Lit - foo 54 // *syntax.ParamExp - ${bar} 55 // *syntax.SglQuoted - 'baz' 56 } 57 58 func ExampleCommand() { 59 r := strings.NewReader("echo foo; if x; then y; fi; foo | bar") 60 f, err := syntax.NewParser().Parse(r, "") 61 if err != nil { 62 return 63 } 64 65 printer := syntax.NewPrinter() 66 for i, stmt := range f.Stmts { 67 fmt.Printf("Cmd %d: %-20T - ", i, stmt.Cmd) 68 printer.Print(os.Stdout, stmt.Cmd) 69 fmt.Println() 70 } 71 72 // Output: 73 // Cmd 0: *syntax.CallExpr - echo foo 74 // Cmd 1: *syntax.IfClause - if x; then y; fi 75 // Cmd 2: *syntax.BinaryCmd - foo | bar 76 } 77 78 func ExampleNewParser_options() { 79 src := "for ((i = 0; i < 5; i++)); do echo $i >f; done" 80 81 // LangBash is the default 82 r := strings.NewReader(src) 83 f, err := syntax.NewParser().Parse(r, "") 84 fmt.Println(err) 85 86 // Parser errors with LangPOSIX 87 r = strings.NewReader(src) 88 _, err = syntax.NewParser(syntax.Variant(syntax.LangPOSIX)).Parse(r, "") 89 fmt.Println(err) 90 91 syntax.NewPrinter().Print(os.Stdout, f) 92 syntax.NewPrinter(syntax.SpaceRedirects).Print(os.Stdout, f) 93 94 // Output: 95 // <nil> 96 // 1:5: c-style fors are a bash feature 97 // for ((i = 0; i < 5; i++)); do echo $i >f; done 98 // for ((i = 0; i < 5; i++)); do echo $i > f; done 99 } 100 101 func ExampleTranslatePattern() { 102 wildcard := "foo?bar*" 103 fmt.Println(wildcard) 104 105 expr, err := syntax.TranslatePattern(wildcard, true) 106 if err != nil { 107 return 108 } 109 fmt.Println(expr) 110 111 rx := regexp.MustCompile(expr) 112 fmt.Println(rx.MatchString("foo bar baz")) 113 fmt.Println(rx.MatchString("foobarbaz")) 114 // Output: 115 // foo?bar* 116 // foo.bar.* 117 // true 118 // false 119 } 120 121 func ExampleQuotePattern() { 122 wildcard := "foo?bar*" 123 fmt.Println(wildcard) 124 125 quoted := syntax.QuotePattern(wildcard) 126 fmt.Println(quoted) 127 128 expr, err := syntax.TranslatePattern(quoted, true) 129 if err != nil { 130 return 131 } 132 133 rx := regexp.MustCompile(expr) 134 fmt.Println(rx.MatchString("foo bar baz")) 135 fmt.Println(rx.MatchString("foo?bar*")) 136 // Output: 137 // foo?bar* 138 // foo\?bar\* 139 // false 140 // true 141 } 142 143 func ExampleWalk() { 144 in := strings.NewReader(`echo $foo "and $bar"`) 145 f, err := syntax.NewParser().Parse(in, "") 146 if err != nil { 147 return 148 } 149 syntax.Walk(f, func(node syntax.Node) bool { 150 switch x := node.(type) { 151 case *syntax.ParamExp: 152 x.Param.Value = strings.ToUpper(x.Param.Value) 153 } 154 return true 155 }) 156 syntax.NewPrinter().Print(os.Stdout, f) 157 // Output: echo $FOO "and $BAR" 158 } 159 160 func ExampleDebugPrint() { 161 in := strings.NewReader(`echo 'foo'`) 162 f, err := syntax.NewParser().Parse(in, "") 163 if err != nil { 164 return 165 } 166 syntax.DebugPrint(os.Stdout, f) 167 // Output: 168 // *syntax.File { 169 // . Name: "" 170 // . StmtList: syntax.StmtList { 171 // . . Stmts: []*syntax.Stmt (len = 1) { 172 // . . . 0: *syntax.Stmt { 173 // . . . . Comments: []syntax.Comment (len = 0) {} 174 // . . . . Cmd: *syntax.CallExpr { 175 // . . . . . Assigns: []*syntax.Assign (len = 0) {} 176 // . . . . . Args: []*syntax.Word (len = 2) { 177 // . . . . . . 0: *syntax.Word { 178 // . . . . . . . Parts: []syntax.WordPart (len = 1) { 179 // . . . . . . . . 0: *syntax.Lit { 180 // . . . . . . . . . ValuePos: 1:1 181 // . . . . . . . . . ValueEnd: 1:5 182 // . . . . . . . . . Value: "echo" 183 // . . . . . . . . } 184 // . . . . . . . } 185 // . . . . . . } 186 // . . . . . . 1: *syntax.Word { 187 // . . . . . . . Parts: []syntax.WordPart (len = 1) { 188 // . . . . . . . . 0: *syntax.SglQuoted { 189 // . . . . . . . . . Left: 1:6 190 // . . . . . . . . . Right: 1:10 191 // . . . . . . . . . Dollar: false 192 // . . . . . . . . . Value: "foo" 193 // . . . . . . . . } 194 // . . . . . . . } 195 // . . . . . . } 196 // . . . . . } 197 // . . . . } 198 // . . . . Position: 1:1 199 // . . . . Semicolon: 0:0 200 // . . . . Negated: false 201 // . . . . Background: false 202 // . . . . Coprocess: false 203 // . . . . Redirs: []*syntax.Redirect (len = 0) {} 204 // . . . } 205 // . . } 206 // . . Last: []syntax.Comment (len = 0) {} 207 // . } 208 // } 209 }