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  }