github.com/HashDataInc/packer@v1.3.2/common/bootcommand/boot_command.pigeon (about) 1 { 2 package bootcommand 3 4 } 5 6 Input <- expr:Expr EOF { 7 return expr, nil 8 } 9 10 Expr <- l:( Wait / CharToggle / Special / Literal)+ { 11 return l, nil 12 } 13 14 Wait = ExprStart "wait" duration:( Duration / Integer )? ExprEnd { 15 var d time.Duration 16 switch t := duration.(type) { 17 case time.Duration: 18 d = t 19 case int64: 20 d = time.Duration(t) * time.Second 21 default: 22 d = time.Second 23 } 24 return &waitExpression{d}, nil 25 } 26 27 CharToggle = ExprStart lit:(Literal) t:(On / Off) ExprEnd { 28 return &literal{lit.(*literal).s, t.(KeyAction)}, nil 29 } 30 31 Special = ExprStart s:(SpecialKey) t:(On / Off)? ExprEnd { 32 l := strings.ToLower(string(s.([]byte))) 33 if t == nil { 34 return &specialExpression{l, KeyPress}, nil 35 } 36 return &specialExpression{l, t.(KeyAction)}, nil 37 } 38 39 Number = '-'? Integer ( '.' Digit+ )? { 40 return string(c.text), nil 41 } 42 43 Integer = '0' / NonZeroDigit Digit* { 44 return strconv.ParseInt(string(c.text), 10, 64) 45 } 46 47 Duration = ( Number TimeUnit )+ { 48 return time.ParseDuration(string(c.text)) 49 } 50 51 On = "on"i { 52 return KeyOn, nil 53 } 54 55 Off = "off"i { 56 return KeyOff, nil 57 } 58 59 Literal = . { 60 r, _ := utf8.DecodeRune(c.text) 61 return &literal{r, KeyPress}, nil 62 } 63 64 ExprEnd = ">" 65 ExprStart = "<" 66 SpecialKey = "bs"i / "del"i / "enter"i / "esc"i / "f10"i / "f11"i / "f12"i 67 / "f1"i / "f2"i / "f3"i / "f4"i / "f5"i / "f6"i / "f7"i / "f8"i / "f9"i 68 / "return"i / "tab"i / "up"i / "down"i / "spacebar"i / "insert"i / "home"i 69 / "end"i / "pageUp"i / "pageDown"i / "leftAlt"i / "leftCtrl"i / "leftShift"i 70 / "rightAlt"i / "rightCtrl"i / "rightShift"i / "leftSuper"i / "rightSuper"i 71 / "left"i / "right"i 72 73 NonZeroDigit = [1-9] 74 Digit = [0-9] 75 TimeUnit = ("ns" / "us" / "µs" / "ms" / "s" / "m" / "h") 76 77 _ "whitespace" <- [ \n\t\r]* 78 79 EOF <- !.