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 <- !.