arm/armspec: remove unfinished code
This was the start of something but never completed.
It's in the history if we need it.
Change-Id: I059e0822c33fe78df3bb988a155a8bcdca677ada
Reviewed-on: https://go-review.googlesource.com/13973
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/arm/armspec/code.go b/arm/armspec/code.go
deleted file mode 100644
index 5269d21..0000000
--- a/arm/armspec/code.go
+++ /dev/null
@@ -1,985 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "bytes"
- "fmt"
- "reflect"
- "strconv"
- "strings"
-)
-
-var errSeeOther = fmt.Errorf("see other")
-var errStop = fmt.Errorf("stop")
-var errUndefined = fmt.Errorf("undefined")
-
-type StmtOp int
-
-const (
- _ StmtOp = iota
- Assign // 1
- Return
- Undefined
- Unpredictable
- See
- ImplDefined
- SubarchDefined
- If
- Repeat
- While // 10
- For
- Case
- Enum
- Block
- StmtExpr
- Fndef
- Assert
-)
-
-type Stmt struct {
- Op StmtOp
- X, Y, Z *Expr
- List []*Expr
- Text string
- Body *Stmt
- Else *Stmt
- When []*When
- ElseIf []*ElseIf
- Block []*Stmt
- Type *Type
-}
-
-type When struct {
- Cond []*Expr
- Body *Stmt
-}
-
-type ElseIf struct {
- Cond *Expr
- Body *Stmt
-}
-
-type ExprOp int
-
-const (
- _ ExprOp = iota
- Blank // 1
- Const
- Name
- Decl
- Unknown
- Call
- ExprTuple
- Eq
- NotEq
- LtEq // 10
- Lt
- GtEq
- Gt
- BitIndex
- IfElse
- Not
- AndAnd
- OrOr
- Eor
- Colon // 20
- And
- Or
- Plus
- Minus
- Add
- Sub
- Mul
- Div
- BigDIV
- BigMOD // 30
- BigAND
- BigOR
- BigEOR
- TwoPow
- Lsh
- Rsh
- Index
- Dot
-)
-
-type Expr struct {
- Op ExprOp
- Text string
- X, Y, Z *Expr
- List []*Expr
- Type *Type
-}
-
-type TypeOp int
-
-const (
- _ TypeOp = iota
- BoolType
- BitType
- IntegerType
- NamedType
- TupleType
-)
-
-type Type struct {
- Op TypeOp
- List []*Type
- N int
- NX *Expr
- Text string
-}
-
-type Exec struct {
- Vars map[string]Value
-}
-
-type Inconsistent struct {
-}
-
-func (Inconsistent) String() string {
- return "INCONSISTENT"
-}
-
-type Bits struct {
- N int
- Val uint32
- DontCare uint32
-}
-
-func (b Bits) String() string {
- var buf bytes.Buffer
- fmt.Fprintf(&buf, "`")
- for i := b.N - 1; i >= 0; i-- {
- if (b.DontCare>>uint(i))&1 != 0 {
- fmt.Fprintf(&buf, "x")
- } else if (b.Val>>uint(i))&1 != 0 {
- fmt.Fprintf(&buf, "1")
- } else {
- fmt.Fprintf(&buf, "0")
- }
- }
- fmt.Fprintf(&buf, "'")
- return buf.String()
-}
-
-func (b Bits) Eq(v Value) bool {
- c := v.(Bits)
- if b.N != c.N {
- panic(fmt.Errorf("compare of mismatched bit lengths %v and %v", b, c))
- }
- return b.Val&^c.DontCare == c.Val
-}
-
-func (b Bits) Lt(v Value) bool {
- panic("less than on bits")
-}
-
-func (b Bits) Gt(v Value) bool {
- panic("greater than on bits")
-}
-
-func isValid(inst *Inst, w uint32) bool {
- var ctxt Exec
- ctxt.Vars = make(map[string]Value)
- off := 0
- for _, b := range strings.Split(inst.Bits, "|") {
- wid := 1
- if i := strings.Index(b, ":"); i >= 0 {
- wid, _ = strconv.Atoi(b[i+1:])
- b = b[:i]
- }
- switch b {
- case "1", "(1)":
- if (w>>uint(31-off))&1 != 1 {
- return false
- }
- case "0", "(0)":
- if (w>>uint(31-off))&1 != 0 {
- return false
- }
- default:
- bits := Bits{N: wid, Val: (w >> uint(32-off-wid)) & (1<<uint(wid) - 1)}
- // fmt.Print(b, " ", bits)
- if old, ok := ctxt.Vars[b]; ok && old != bits {
- ctxt.Define(b, Inconsistent{})
- }
- ctxt.Define(b, bits)
- }
- off += wid
- }
- // fmt.Println()
-
- for _, stmt := range inst.Prog {
- err := ctxt.stmt(stmt)
- if err != nil {
- if err == errSeeOther || err == errUndefined {
- return false
- }
- if err == errStop {
- break
- }
- panic(err)
- }
- }
- return true
-}
-
-func (ctxt *Exec) Define(name string, value Value) {
- ctxt.Vars[name] = value
-}
-
-func (ctxt *Exec) Assign(name string, value Value) error {
- ctxt.Vars[name] = value
- return nil
-}
-
-/*
-
-var global = map[string]Value{
- "ConditionPassed": _ConditionPassed,
- "UInt": _UInt,
- "SInt": _SInt,
-}
-
-type Defn struct {
- Name string
- Value Value
- Next *Defn
-}
-
-func (ctxt *Exec) Assign(name string, value Value) error {
- for d := ctxt.Scope; d != nil; d = d.Next {
- if d.Name == name {
- d.Value = value
- return nil
- }
- }
- ctxt.Define(name, value)
- return nil
-}
-
-func _ConditionPassed(ctxt *Exec, args []Value) (Value, error) {
- return Bool(true), nil
-}
-*/
-
-type Int int64
-
-func (x Int) String() string {
- return fmt.Sprint(int64(x))
-}
-
-func (x Int) Eq(y Value) bool { return x == y }
-func (x Int) Lt(y Value) bool { return x < y.(Int) }
-func (x Int) Gt(y Value) bool { return x > y.(Int) }
-
-func (x Int) Add(y Value) Value { return x + y.(Int) }
-func (x Int) Sub(y Value) Value { return x - y.(Int) }
-func (x Int) Mul(y Value) Value { return x * y.(Int) }
-
-func (x Int) Lsh(y Value) Value { return x << uint(y.(Int)) }
-func (x Int) Rsh(y Value) Value { return x >> uint(y.(Int)) }
-func (x Int) DIV(y Value) Value { return x / y.(Int) }
-
-func _UInt(_ *Exec, args []Value) (Value, error) {
- if len(args) != 1 {
- return nil, fmt.Errorf("UInt takes a single argument")
- }
- b, ok := args[0].(Bits)
- if !ok {
- return nil, fmt.Errorf("UInt takes a Bits, not %T", args[0])
- }
- if b.N > 63 {
- return nil, fmt.Errorf("UInt cannot handle %d-bit Bits", b.N)
- }
- return Int(b.Val), nil
-}
-
-func _SInt(_ *Exec, args []Value) (Value, error) {
- if len(args) != 1 {
- return nil, fmt.Errorf("SInt takes a single argument")
- }
- b, ok := args[0].(Bits)
- if !ok {
- return nil, fmt.Errorf("SInt takes a Bits, not %T", args[0])
- }
- if b.N > 64 {
- return nil, fmt.Errorf("SInt cannot handle %d-bit Bits", b.N)
- }
- return Int(int64(b.Val) << uint(64-b.N) >> uint(64-b.N)), nil
-}
-
-/*
-
-func (ctxt *Exec) Run(prog []*Stmt) error {
- for _, stmt := range prog {
- if err := ctxt.stmt(stmt); err != nil {
- return err
- }
- }
- return nil
-}
-
-*/
-
-func (ctxt *Exec) stmt(stmt *Stmt) error {
- switch stmt.Op {
- case If:
- v, err := toBool(ctxt.expr(stmt.X))
- if err != nil {
- return err
- }
- if v {
- return ctxt.stmt(stmt.Body)
- }
- for _, elseif := range stmt.ElseIf {
- v, err := toBool(ctxt.expr(elseif.Cond))
- if err != nil {
- return err
- }
- if v {
- return ctxt.stmt(elseif.Body)
- }
- }
- if stmt.Else == nil {
- return nil
- }
- return ctxt.stmt(stmt.Else)
-
- case Case:
- v, err := ctxt.expr(stmt.X)
- if err != nil {
- return err
- }
- vv, ok := v.(interface {
- Eq(Value) bool
- })
- if !ok {
- return fmt.Errorf("use of uncomparable value %T(%v) in case statement", v, v)
- }
- for _, when := range stmt.When {
- for _, cond := range when.Cond {
- w, err := ctxt.expr(cond)
- if err != nil {
- return err
- }
- if reflect.TypeOf(v) != reflect.TypeOf(w) {
- return fmt.Errorf("mistyped comparison of %T(%v) and %T(%v) in case statement", v, v, w, w)
- }
- if vv.Eq(w) {
- return ctxt.stmt(when.Body)
- }
- }
- }
- if stmt.Else == nil {
- return nil
- }
- return ctxt.stmt(stmt.Else)
-
- case Block:
- for _, x := range stmt.Block {
- if err := ctxt.stmt(x); err != nil {
- return err
- }
- }
- return nil
-
- case See:
- return errSeeOther
-
- case Undefined:
- return errUndefined
-
- case Unpredictable, ImplDefined, SubarchDefined:
- return errStop
-
- case StmtExpr:
- _, err := ctxt.expr(stmt.X)
- return err
-
- case Assign:
- v, err := ctxt.expr(stmt.Y)
- if err != nil {
- return err
- }
- if stmt.X.Op == ExprTuple {
- vv, ok := v.(Tuple)
- if !ok {
- return fmt.Errorf("assignment of non-tuple %T to tuple", v)
- }
- if len(stmt.X.List) != len(vv) {
- return fmt.Errorf("%d = %d in tuple assignment", len(stmt.X.List), len(vv))
- }
- for i, x := range stmt.X.List {
- if x.Op == Blank {
- continue
- }
- if x.Op != Name {
- return fmt.Errorf("cannot assign to expr op %d", x.Op)
- }
- if err := ctxt.Assign(x.Text, vv[i]); err != nil {
- return err
- }
- }
- return nil
- }
- x := stmt.X
- if x.Op != Name {
- return fmt.Errorf("cannot assign to expr op %d", x.Op)
- }
- return ctxt.Assign(x.Text, v)
- }
- return fmt.Errorf("unknown stmt op %d", stmt.Op)
-}
-
-func toBool(v Value, err error) (b Bool, xerr error) {
- if err != nil {
- return false, err
- }
- switch v := v.(type) {
- case Bool:
- return v, nil
- default:
- return false, fmt.Errorf("value of type %T used as bool", v)
- }
-}
-
-type Value interface {
- String() string
-}
-
-type Bool bool
-
-func (b Bool) Eq(v Value) bool { return b == v }
-
-func (b Bool) Not() Value { return !b }
-
-func (b Bool) String() string {
- if b {
- return "TRUE"
- }
- return "FALSE"
-}
-
-type Tuple []Value
-
-func (t Tuple) String() string {
- var buf bytes.Buffer
- fmt.Fprintf(&buf, "(")
- for i, v := range t {
- if i > 0 {
- fmt.Fprintf(&buf, ", ")
- }
- fmt.Fprintf(&buf, v.String())
- }
- fmt.Fprintf(&buf, ")")
- return buf.String()
-}
-
-func (ctxt *Exec) expr(x *Expr) (v Value, err error) {
- switch x.Op {
- case Call:
- fn, err := ctxt.name(x.Text)
- if err != nil {
- return nil, err
- }
- var list []Value
- for _, y := range x.List {
- v, err := ctxt.expr(y)
- if err != nil {
- return nil, err
- }
- list = append(list, v)
- }
- return ctxt.call(x.Text, fn, list)
-
- case ExprTuple:
- var list []Value
- for _, y := range x.List {
- v, err := ctxt.expr(y)
- if err != nil {
- return nil, err
- }
- list = append(list, v)
- }
- if len(list) == 1 {
- return list[0], nil
- }
- return Tuple(list), nil
-
- case AndAnd:
- v, err := toBool(ctxt.expr(x.X))
- if err != nil {
- return nil, err
- }
- if !v {
- return v, nil
- }
- return ctxt.expr(x.Y)
-
- case OrOr:
- v, err := toBool(ctxt.expr(x.X))
- if err != nil {
- return nil, err
- }
- if v {
- return v, nil
- }
- return ctxt.expr(x.Y)
-
- case Colon:
- v, err := ctxt.expr(x.X)
- if err != nil {
- return nil, err
- }
- y, err := ctxt.expr(x.Y)
- if err != nil {
- return nil, err
- }
- xb, ok := v.(Bits)
- yb, ok2 := y.(Bits)
- if !ok || !ok2 {
- return nil, fmt.Errorf("colon operator requires bit strings")
- }
- b := xb
- b.N += yb.N
- b.Val <<= uint(yb.N)
- b.DontCare <<= yb.DontCare
- return b, nil
-
- case Name:
- return ctxt.name(x.Text)
-
- case Const:
- if (strings.HasPrefix(x.Text, "‘") || strings.HasPrefix(x.Text, "’")) && strings.HasSuffix(x.Text, "’") {
- text := x.Text[len("‘") : len(x.Text)-len("’")]
- var b Bits
- b.N = len(text)
- for _, c := range text {
- b.Val <<= 1
- b.DontCare <<= 1
- if c == '1' {
- b.Val |= 1
- }
- if c == 'x' {
- b.DontCare |= 1
- }
- }
- return b, nil
- }
- n, err := strconv.Atoi(x.Text)
- if err == nil {
- return Int(n), nil
- }
- println("const", x.Text)
-
- case Not:
- l, err := ctxt.expr(x.X)
- if err != nil {
- return nil, err
- }
- switch x.Op {
- case Not:
- ll, ok := l.(interface {
- Not() Value
- })
- if !ok {
- return nil, fmt.Errorf("type %T does not support !", l)
- }
- return ll.Not(), nil
- }
-
- case Eq, NotEq, Lt, LtEq, Gt, GtEq, Add, Sub, Mul, Lsh, Rsh, BigDIV:
- l, err := ctxt.expr(x.X)
- if err != nil {
- return nil, err
- }
- r, err := ctxt.expr(x.Y)
- if err != nil {
- return nil, err
- }
- tl := reflect.TypeOf(l)
- tr := reflect.TypeOf(r)
- if tl != tr {
- return nil, fmt.Errorf("arithmetic (expr op %d) of %T(%v) with %T(%v)", x.Op, l, l, r, r)
- }
- switch x.Op {
- case Eq:
- ll, ok := l.(interface {
- Eq(Value) bool
- })
- if !ok {
- return nil, fmt.Errorf("type %T does not support ==", l)
- }
- return Bool(ll.Eq(r)), nil
- case NotEq:
- ll, ok := l.(interface {
- Eq(Value) bool
- })
- if !ok {
- return nil, fmt.Errorf("type %T does not support !=", l)
- }
- return Bool(!ll.Eq(r)), nil
- case Lt:
- ll, ok := l.(interface {
- Lt(Value) bool
- })
- if !ok {
- return nil, fmt.Errorf("type %T does not support <", l)
- }
- return Bool(ll.Lt(r)), nil
- case GtEq:
- ll, ok := l.(interface {
- Lt(Value) bool
- })
- if !ok {
- return nil, fmt.Errorf("type %T does not support >=", l)
- }
- return Bool(!ll.Lt(r)), nil
- case Gt:
- ll, ok := l.(interface {
- Gt(Value) bool
- })
- if !ok {
- return nil, fmt.Errorf("type %T does not support >", l)
- }
- return Bool(ll.Gt(r)), nil
- case LtEq:
- ll, ok := l.(interface {
- Gt(Value) bool
- })
- if !ok {
- return nil, fmt.Errorf("type %T does not support <=", l)
- }
- return Bool(!ll.Gt(r)), nil
- case Add:
- ll, ok := l.(interface {
- Add(Value) Value
- })
- if !ok {
- return nil, fmt.Errorf("type %T does not support +", l)
- }
- return ll.Add(r), nil
- case Sub:
- ll, ok := l.(interface {
- Sub(Value) Value
- })
- if !ok {
- return nil, fmt.Errorf("type %T does not support -", l)
- }
- return ll.Sub(r), nil
- case Mul:
- ll, ok := l.(interface {
- Mul(Value) Value
- })
- if !ok {
- return nil, fmt.Errorf("type %T does not support *", l)
- }
- return ll.Mul(r), nil
- case Lsh:
- ll, ok := l.(interface {
- Lsh(Value) Value
- })
- if !ok {
- return nil, fmt.Errorf("type %T does not support <<", l)
- }
- return ll.Lsh(r), nil
- case Rsh:
- ll, ok := l.(interface {
- Rsh(Value) Value
- })
- if !ok {
- return nil, fmt.Errorf("type %T does not support >>", l)
- }
- return ll.Rsh(r), nil
- case BigDIV:
- ll, ok := l.(interface {
- DIV(Value) Value
- })
- if !ok {
- return nil, fmt.Errorf("type %T does not support DIV", l)
- }
- return ll.DIV(r), nil
- }
-
- case BitIndex:
- l, err := ctxt.expr(x.X)
- if err != nil {
- return nil, err
- }
- b, ok := l.(Bits)
- if !ok {
- return nil, fmt.Errorf("bit index operator requires bitstring, not %T(%v)", l, l)
- }
- out := Bits{}
- for _, ix := range x.List {
- if ix.Op == Colon {
- r1, err := ctxt.expr(ix.X)
- if err != nil {
- return nil, err
- }
- r2, err := ctxt.expr(ix.Y)
- if err != nil {
- return nil, err
- }
- i1, ok := r1.(Int)
- i2, ok2 := r2.(Int)
- if !ok || !ok2 {
- return nil, fmt.Errorf("bit indexes must be int")
- }
- if i1 <= i2 {
- return nil, fmt.Errorf("inverted bit indexes %d:%d", i1, i2)
- }
- w := int(i1 + 1 - i2)
- out.N += w
- out.Val <<= uint(w)
- out.DontCare <<= uint(w)
- out.Val |= (b.Val >> uint(i2)) & (1<<uint(w) - 1)
- out.DontCare |= (b.DontCare >> uint(i2)) & (1<<uint(w) - 1)
- } else {
- r, err := ctxt.expr(ix)
- if err != nil {
- return nil, err
- }
- i, ok := r.(Int)
- if !ok {
- return nil, fmt.Errorf("bit index operator index must be int")
- }
- out.N++
- out.Val <<= 1
- out.DontCare <<= 1
- out.Val |= (b.Val >> uint(i)) & 1
- }
- }
- return out, nil
-
- case IfElse:
- v, err := toBool(ctxt.expr(x.X))
- if err != nil {
- return nil, err
- }
- if v {
- return ctxt.expr(x.Y)
- }
- return ctxt.expr(x.Z)
- }
- return nil, fmt.Errorf("unknown expr op %d", x.Op)
-}
-
-type Func struct {
- Name string
- F func(*Exec, []Value) (Value, error)
-}
-
-func (f Func) String() string {
- return f.Name
-}
-
-func (ctxt *Exec) call(name string, fn Value, args []Value) (Value, error) {
- switch fn := fn.(type) {
- case Func:
- return fn.F(ctxt, args)
- }
- return nil, fmt.Errorf("cannot call %s of type %T", name, fn)
-}
-
-var global = map[string]Value{
- "UInt": Func{"UInt", _UInt},
- "DecodeImmShift": Func{"DecodeImmShift", _DecodeImmShift},
- "ArchVersion": Func{"ArchVersion", _ArchVersion},
- "ZeroExtend": Func{"ZeroExtend", _ZeroExtend},
- "ARMExpandImm": Func{"ARMExpandImm", _ARMExpandImm},
- "Zeros": Func{"Zeros", _Zeros},
- "TRUE": Bool(true),
- "FALSE": Bool(false),
- "BitCount": Func{"BitCount", _BitCount},
- "Consistent": Func{"Consistent", _Consistent},
-}
-
-func _Consistent(ctxt *Exec, args []Value) (Value, error) {
- if len(args) != 1 {
- return nil, fmt.Errorf("BitCount requires one argument")
- }
- _, inconsistent := args[0].(Inconsistent)
- return Bool(!inconsistent), nil
-}
-
-func _BitCount(ctxt *Exec, args []Value) (Value, error) {
- if len(args) != 1 {
- return nil, fmt.Errorf("BitCount requires one argument")
- }
- b, ok1 := args[0].(Bits)
- if !ok1 {
- return nil, fmt.Errorf("BitCount requires bitstring argument")
- }
-
- n := 0
- for i := 0; i < b.N; i++ {
- if b.Val&(1<<uint(i)) != 0 {
- n++
- }
- }
- return Int(n), nil
-}
-
-func _ArchVersion(ctxt *Exec, args []Value) (Value, error) {
- return Int(7), nil
-}
-
-func _ZeroExtend(ctxt *Exec, args []Value) (Value, error) {
- if len(args) != 2 {
- return nil, fmt.Errorf("ZeroExtend requires two arguments")
- }
- b, ok := args[0].(Bits)
- n, ok2 := args[1].(Int)
- if !ok || !ok2 {
- return nil, fmt.Errorf("DecodeImmShift requires bitstring, int arguments")
- }
- b.N = int(n)
- return b, nil
-}
-
-func _DecodeImmShift(ctxt *Exec, args []Value) (Value, error) {
- if len(args) != 2 {
- return nil, fmt.Errorf("DecodeImmShift requires two arguments")
- }
- b1, ok1 := args[0].(Bits)
- b2, ok2 := args[1].(Bits)
- if !ok1 || !ok2 {
- return nil, fmt.Errorf("DecodeImmShift requires bitstring arguments")
- }
- _ = b1
- _ = b2
- // TODO
- return Tuple{Int(0), Int(0)}, nil
-}
-
-func _ARMExpandImm(ctxt *Exec, args []Value) (Value, error) {
- if len(args) != 1 {
- return nil, fmt.Errorf("ARMExpandImm requires one argument")
- }
- b, ok1 := args[0].(Bits)
- if !ok1 || b.N != 12 {
- return nil, fmt.Errorf("ARMExpandImm requires 12-bit bitstring argument")
- }
- v := uint32(b.Val & 0xFF)
- rot := uint(2 * ((b.Val >> 8) & 0xF))
- v = v>>rot | v<<(32-rot)
- return Bits{N: 32, Val: v}, nil
-}
-
-func _Zeros(ctxt *Exec, args []Value) (Value, error) {
- if len(args) != 1 {
- return nil, fmt.Errorf("Zeros requires one argument")
- }
- n, ok := args[0].(Int)
- if !ok {
- return nil, fmt.Errorf("Zeros requires int argument")
- }
- return Bits{N: int(n)}, nil
-}
-
-type Symbol string
-
-func (s Symbol) String() string { return string(s) }
-
-func (ctxt *Exec) name(name string) (v Value, err error) {
- v, ok := ctxt.Vars[name]
- if ok {
- return v, nil
- }
- v, ok = global[name]
- if ok {
- return v, nil
- }
- return Symbol(name), nil
- return nil, fmt.Errorf("unknown name %s", name)
-}
-
-/*
-func pseudoExec(base uint32, enc *Enc) {
- var ctxt Exec
- ctxt.Define("EncodingSpecificOperations", func(ctxt *Exec, args []Value) (Value, error) {
- return nil, ctxt.Run(enc.Prog)
- })
-
- var n uint
- for _, f := range enc.Fields {
- switch f {
- case "0", "1", "(0)", "(1)":
- n++
- default:
- wid := size[f]
- if wid == 0 {
- panic("missing width for " + f)
- }
- ctxt.Define(f, Bits{N: wid, Val: (base>>(31-n))&(1<<uint(wid)-1)})
- n += uint(wid)
- }
- }
-
- if err := ctxt.Run(enc.Inst.Prog); err != nil {
- log.Printf("%#x: %v", base, err)
- }
-}
-
-func loadLibrary(data []byte) {
- prog := parse("speclib.txt", string(data))
- for _, stmt := range prog {
- switch stmt.Op {
- default:
- log.Fatalf("unexpected statement in speclib.txt: %d", stmt.Op)
- case Fndef:
- global[stmt.Text] = funcImpl(stmt)
- case Enum:
- // TODO
- }
- }
-}
-
-func funcImpl(stmt *Stmt) func(*Exec, []Value) (Value, error) {
- return func(ctxt *Exec, args []Value) (Value, error) {
- ctxt1 := *ctxt
- if len(args) != len(stmt.List) {
- return nil, fmt.Errorf("calling %s: have %d arguments, want %d", stmt.Text, len(args), len(stmt.List))
- }
- for i, decl := range stmt.List {
- v, err := convert(args[i], decl.Type)
- if err != nil {
- return nil, fmt.Errorf("calling %s: %v", stmt.Text, err)
- }
- ctxt1.Define(decl.Text, v)
- }
- err := ctxt1.stmt(stmt.Body)
- if err != nil {
- return nil, err
- }
- if ctxt1.ret == nil && stmt.Type != nil {
- return nil, fmt.Errorf("calling %s: function body missing return", stmt.Text)
- }
- if ctxt1.ret != nil && stmt.Type == nil {
- return nil, fmt.Errorf("calling %s: unexpected return value from function with no result", stmt.Text)
- }
- return ctxt1.ret, nil
- }
-}
-
-func convert(v Value, typ *Type) (Value, error) {
- switch typ.Op {
- case BoolType:
- if v, ok := v.(Bool); ok {
- return v, nil
- }
- case BitType:
- if v, ok := v.(Bits); ok && v.N == typ.N {
- return v, nil
- }
- }
- return nil, fmt.Errorf("cannot convert %s to type %v", v, typ)
-}
-
-*/
diff --git a/arm/armspec/pseudo.go b/arm/armspec/pseudo.go
deleted file mode 100644
index 20bcec8..0000000
--- a/arm/armspec/pseudo.go
+++ /dev/null
@@ -1,264 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
- "fmt"
- "os"
- "regexp"
- "strings"
-)
-
-type Lexer struct {
- input string
- file string
- lineno int
- sym string
- prog []*Stmt
-}
-
-type Line struct {
- File string
- Lineno int
-}
-
-func (l Line) String() string {
- return fmt.Sprintf("%s:%d", l.File, l.Lineno)
-}
-
-var nerror int
-
-func (l Line) Errorf(format string, args ...interface{}) {
- fmt.Printf("%s: %s\n", l, fmt.Sprintf(format, args...))
- if nerror++; nerror > 20 {
- fmt.Printf("too many errors\n")
- os.Exit(1)
- }
-}
-
-func re(s string) *regexp.Regexp {
- return regexp.MustCompile(`\A(?:` + s + `)`)
-}
-
-var tokens = []struct {
- re *regexp.Regexp
- val int
- fn func(*Lexer, string, *yySymType)
-}{
- {re(`//[^\n]*`), -1, nil},
- {re(`/\*(.|\n)*?\*/`), -1, nil},
- {re(`[ \t\n]+`), -1, nil},
- {re(`»`), _INDENT, nil},
- {re(`«`), _UNINDENT, str},
- {re(`return`), _RETURN, str},
- {re(`UNDEFINED`), _UNDEFINED, str},
- {re(`UNPREDICTABLE`), _UNPREDICTABLE, str},
- {re(`SEE [^;]+`), _SEE, str},
- {re(`IMPLEMENTATION_DEFINED( [^;]+)?`), _IMPLEMENTATION_DEFINED, str},
- {re(`SUBARCHITECTURE_DEFINED( [^;]+)?`), _SUBARCHITECTURE_DEFINED, str},
- {re(`if`), _IF, nil},
- {re(`then`), _THEN, nil},
- {re(`repeat`), _REPEAT, nil},
- {re(`until`), _UNTIL, nil},
- {re(`while`), _WHILE, nil},
- {re(`case`), _CASE, nil},
- {re(`for`), _FOR, nil},
- {re(`to`), _TO, nil},
- {re(`do`), _DO, nil},
- {re(`of`), _OF, nil},
- {re(`elsif`), _ELSIF, nil},
- {re(`else`), _ELSE, nil},
- {re(`otherwise`), _OTHERWISE, nil},
- {re(`enumeration`), _ENUMERATION, nil},
- {re(`when`), _WHEN, nil},
- {re(`UNKNOWN`), _UNKNOWN, nil},
- {re(`DIV`), _DIV, nil},
- {re(`MOD`), _MOD, nil},
- {re(`AND`), _AND, nil},
- {re(`OR`), _OR, nil},
- {re(`EOR`), _EOR, nil},
- {re(`&&`), _ANDAND, nil},
- {re(`\|\|`), _OROR, nil},
- {re(`==`), _EQ, nil},
- {re(`!=`), _NE, nil},
- {re(` <`), _LT, nil},
- {re(` ?<=`), _LE, nil},
- {re(` ?>=`), _GE, nil},
- {re(` >`), _GT, nil},
- {re(`{`), '{', nil},
- {re(`}`), '}', nil},
- {re(`<`), '<', nil},
- {re(`>`), '>', nil},
- {re(`2^`), _TWOPOW, nil},
- {re(` ?<<`), _LSH, nil},
- {re(` ?>>`), _RSH, nil},
- {re(`,`), ',', nil},
- {re(`:`), ':', nil},
- {re(`\+`), '+', nil},
- {re(`\.`), '.', nil},
- {re(`-`), '-', nil},
- {re(`|`), '|', nil},
- {re(`\^`), '^', nil},
- {re(`\*`), '*', nil},
- {re(`/`), '/', nil},
- {re(`%`), '%', nil},
- {re(`&`), '&', nil},
- {re(`!`), '!', nil},
- {re(`;`), ';', nil},
- {re(`=`), '=', nil},
- {re(`\(`), '(', nil},
- {re(`\)`), ')', nil},
- {re(`\[`), '[', nil},
- {re(`\]`), ']', nil},
- {re(`!`), '!', nil},
- {re(`[0-9]+`), _CONST, str},
- {re(`[0-9]+\.[0-9]+`), _CONST, str},
- {re(`0x[0-9A-Fa-f]+`), _CONST, str},
- {re("[‘’][ 0-9x]+’"), _CONST, strNoSpaces},
- {re(`bit`), _BIT, str},
- {re(`bits\(`), _BITS, str1x},
- {re(`assert`), _ASSERT, str},
- {re(`integer`), _INTEGER, nil},
- {re(`boolean`), _BOOLEAN, nil},
-
- {re(`[A-Za-z_][A-Za-z0-9_]*`), _NAME, str},
- {re(`[A-Za-z_][A-Za-z0-9_]*\(`), _NAME_PAREN, str1x},
-}
-
-func (lx *Lexer) Lex(yy *yySymType) int {
- if len(lx.input) == 0 {
- return _EOF
- }
- var (
- longest string
- longestVal int
- longestFn func(*Lexer, string, *yySymType)
- )
- for _, tok := range tokens {
- s := tok.re.FindString(lx.input)
- if len(s) > len(longest) {
- longest = s
- longestVal = tok.val
- longestFn = tok.fn
- }
- }
- if longest == "" {
- lx.Error(fmt.Sprintf("lexer stuck at %.10q", lx.input))
- return -1
- }
- //println(longest)
- yy.line = lx.line()
- if longestFn != nil {
- lx.sym = longest
- longestFn(lx, longest, yy)
- }
- lx.input = lx.input[len(longest):]
- lx.lineno += strings.Count(longest, "\n")
- if longestVal < 0 {
- // skip
- return lx.Lex(yy)
- }
- return longestVal
-}
-
-func (lx *Lexer) Error(s string) {
- lx.line().Errorf("%s near %s", s, lx.sym)
-}
-
-func (lx *Lexer) line() Line {
- return Line{lx.file, lx.lineno}
-}
-
-func nop(*Lexer, string, *yySymType) {
- // having a function in the table
- // will make the lexer save the string
- // for use in error messages.
- // nothing more to do.
-}
-
-func str(lx *Lexer, s string, yy *yySymType) {
- yy.str = s
-}
-
-func str1(lx *Lexer, s string, yy *yySymType) {
- yy.str = s[1:]
-}
-
-func str1x(lx *Lexer, s string, yy *yySymType) {
- yy.str = s[:len(s)-1]
-}
-
-func strNoSpaces(lx *Lexer, s string, yy *yySymType) {
- yy.str = strings.Replace(s, " ", "", -1)
-}
-
-func parse(name, text string) []*Stmt {
- text = markup(text)
- lx := &Lexer{
- input: text,
- file: name,
- lineno: 1,
- }
- nerror = 0
- yyParse(lx)
- return lx.prog
-}
-
-func markup(text string) string {
- prefix := ""
-
- // Fix typos.
- text = strings.Replace(text, "R[i}", "R[i]", -1)
- text = strings.Replace(text, "R[n}", "R[n]", -1)
- text = strings.Replace(text, "(1 << (3-UInt(op)-UInt(size));", "(1 << (3-UInt(op)-UInt(size)));", -1)
- text = strings.Replace(text, "(D[n+r] AND NOT(D[m+r]);", "(D[n+r] AND NOT(D[m+r]));", -1)
- text = strings.Replace(text, "(D[d+r] AND NOT(D[m+r]);", "(D[d+r] AND NOT(D[m+r]));", -1)
- text = strings.Replace(text, "(D[n+r] AND D[d+r]) OR (D[m+r] AND NOT(D[d+r]);", "(D[n+r] AND D[d+r]) OR (D[m+r] AND NOT(D[d+r]));", -1)
-
- // Add indent, unindent tags.
- lines := strings.Split(text, "\n")
- var indent []int
- for j, line := range lines {
- if i := strings.Index(line, "//"); i >= 0 {
- line = line[:i]
- }
- if strings.TrimSpace(line) == "" {
- continue
- }
- n := 0
- for n < len(line) && line[n] == '\t' {
- n++
- }
- if len(indent) == 0 {
- indent = append(indent, n)
- }
- i := indent[len(indent)-1]
- if i > n {
- for i > n {
- line = "«" + line
- indent = indent[:len(indent)-1]
- if len(indent) == 0 {
- i = -1
- } else {
- i = indent[len(indent)-1]
- }
- }
- if i == -1 {
- indent = append(indent, n)
- i = n
- }
- }
- if i < n {
- line = "»" + line
- indent = append(indent, n)
- }
- lines[j] = line
- }
- n := len(indent) - 1
- if n < 0 {
- n = 0
- }
- return prefix + strings.Join(lines, "\n") + strings.Repeat("«", n)
-}
diff --git a/arm/armspec/pseudo.y b/arm/armspec/pseudo.y
deleted file mode 100644
index 6d9532f..0000000
--- a/arm/armspec/pseudo.y
+++ /dev/null
@@ -1,553 +0,0 @@
-// Copyright 2014 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-%{
-package main
-
-import (
- "strconv"
-)
-
-%}
-
-%union {
- str string
- line Line
- stmt *Stmt
- stmts []*Stmt
- expr *Expr
- exprs []*Expr
- elseifs []*ElseIf
- when *When
- whens []*When
- typ *Type
- typs []*Type
-}
-
-%token _ASSERT
-%token _BITS
-%token _BIT
-%token _IF
-%token _EOF
-%token _NAME _NAME_PAREN
-%token _RETURN
-%token _UNDEFINED
-%token _UNPREDICTABLE
-%token _IMPLEMENTATION_DEFINED
-%token _SUBARCHITECTURE_DEFINED
-%token _ENUMERATION
-%token _DO
-%token _INDENT
-%token _UNINDENT
-%token _THEN
-%token _REPEAT
-%token _UNTIL
-%token _WHILE
-%token _CASE
-%token _FOR
-%token _TO
-%token _OF
-%token _ELSIF
-%token _ELSE
-%token _OTHERWISE
-%token _WHEN
-%token _CONST
-%token _UNKNOWN
-%token _EQ
-%token _NE
-%token _LE
-%token _GE
-%token _AND
-%token _OR
-%token _EOR
-%token _ANDAND
-%token _OROR
-%token _DIV
-%token _MOD
-%token _TWOPOW
-%token _LSH
-%token _RSH
-%token _INTEGER
-%token _BOOLEAN
-
-%token <str> _NAME _NAME_PAREN _CONST
-%token <str> _SEE
-
-%left last_resort
-%left '='
-%left ','
-%left _IF
-%left _ANDAND _OROR
-%left _LT _LE '>' _GE _GT _EQ _NE
-%left ':'
-%left '+' '-' '|' '^' _OR _EOR
-%left '*' '/' '%' '&' _LSH _RSH _DIV _MOD _AND
-%left _TWOPOW
-%left '.' '<' '['
-%left unary
-
-%type <stmts> stmt_list simple_stmt_list stmt_list_opt
-%type <stmt> stmt simple_stmt block simple_block otherwise enumeration
-%type <stmt> else_opt simple_else_opt else_end simple_else_end
-%type <elseifs> elsif_list simple_elsif_list
-%type <when> when
-%type <whens> when_list
-%type <exprs> expr_list_opt expr_list expr_minus_list const_list
-%type <expr> expr call_expr const
-%type <typ> unnamed_type
-
-%%
-
-top:
- stmt_list_opt _EOF
- {
- yylex.(*Lexer).prog = $1
- return 0
- }
-
-simple_stmt:
- expr '=' expr ';'
- {
- $$ = &Stmt{Op: Assign, X: $1, Y: $3}
- }
-| expr _EQ expr ';'
- {
- $$ = &Stmt{Op: Assign, X: $1, Y: $3}
- }
-| call_expr ';'
- {
- $$ = &Stmt{Op: StmtExpr, X: $1}
- }
-| _RETURN expr_list_opt ';'
- {
- $$ = &Stmt{Op: Return, List: $2}
- }
-| _UNDEFINED ';'
- {
- $$ = &Stmt{Op: Undefined}
- }
-| _UNPREDICTABLE ';'
- {
- $$ = &Stmt{Op: Unpredictable}
- }
-| _SEE ';'
- {
- $$ = &Stmt{Op: See, Text: $1}
- }
-| _IMPLEMENTATION_DEFINED ';'
- {
- $$ = &Stmt{Op: ImplDefined}
- }
-| _SUBARCHITECTURE_DEFINED ';'
- {
- $$ = &Stmt{Op: SubarchDefined}
- }
-
-stmt:
- simple_stmt
-| unnamed_type _NAME ';'
- {
- $$ = &Stmt{Op: StmtExpr, X: &Expr{Op: Decl, Type: $1, Text: $2}}
- }
-| _IF expr _THEN block else_opt
- {
- $$ = &Stmt{Op: If, X: $2, Body: $4, ElseIf: $<elseifs>5, Else: $5}
- }
-| _IF expr _THEN simple_stmt simple_else_opt
- {
- $$ = &Stmt{Op: If, X: $2, Body: $4, ElseIf: $<elseifs>5, Else: $5}
- }
-| _REPEAT block _UNTIL expr ';'
- {
- $$ = &Stmt{Op: Repeat, Body: $2, X: $4}
- }
-| _WHILE expr do block
- {
- $$ = &Stmt{Op: While, X: $2, Body: $4}
- }
-| _FOR expr '=' expr _TO expr do block
- {
- $$ = &Stmt{Op: For, X: $2, Y: $4, Z: $6, Body: $8}
- }
-| _CASE expr _OF _INDENT when_list otherwise _UNINDENT
- {
- $$ = &Stmt{Op: Case, X: $2, When: $5, Else: $6}
- }
-| _ASSERT expr ';'
- {
- $$ = &Stmt{Op: Assert, X: $2}
- }
-| block
- {
- $$ = $1
- }
-| enumeration
-
-enumeration:
- _ENUMERATION _NAME '{' expr_list '}' ';'
- {
- $$ = &Stmt{Op: Enum, Text: $2, List: $4}
- }
-
-do:
-| _DO
-
-block:
- _INDENT stmt_list _UNINDENT
- {
- $$ = &Stmt{Op: Block, Block: $2}
- }
-
-simple_block:
- simple_stmt_list
- {
- $$ = &Stmt{Op: Block, Block: $1}
- }
-
-simple_stmt_list:
- simple_stmt
- {
- $$ = []*Stmt{$1}
- }
-| simple_stmt_list simple_stmt
- {
- $$ = append($1, $2)
- }
-
-stmt_list:
- stmt
- {
- $$ = []*Stmt{$1}
- }
-| stmt_list stmt
- {
- $$ = append($1, $2)
- }
-
-stmt_list_opt:
- {
- $$ = nil
- }
-| stmt_list
-
-else_opt:
- elsif_list else_end
- {
- $<elseifs>$ = $1
- $$ = $2
- }
-
-simple_else_opt:
- simple_elsif_list simple_else_end
- {
- $<elseifs>$ = $1
- $$ = $2
- }
-
-elsif_list:
- {
- $$ = nil
- }
-| elsif_list _ELSIF expr _THEN block
- {
- $$ = append($1, &ElseIf{Cond: $3, Body: $5})
- }
-
-simple_elsif_list:
- {
- $$ = nil
- }
-| simple_elsif_list _ELSIF expr _THEN simple_stmt
- {
- $$ = append($1, &ElseIf{Cond: $3, Body: $5})
- }
-
-else_end:
- {
- $$ = nil
- }
-| _ELSE block
- {
- $$ = $2
- }
-| _ELSE simple_stmt
- {
- $$ = $2
- }
-
-simple_else_end:
- {
- $$ = nil
- }
-| _ELSE simple_stmt
- {
- $$ = $2
- }
-
-when_list:
- {
- $$ = nil
- }
-| when_list when
- {
- $$ = append($1, $2)
- }
-
-when:
- _WHEN const_list then block
- {
- $$ = &When{Cond: $2, Body: $4}
- }
-| _WHEN const_list then simple_block
- {
- $$ = &When{Cond: $2, Body: $4}
- }
-
-then:
-| _THEN
-
-otherwise:
- {
- $$ = nil
- }
-| _OTHERWISE block
- {
- $$ = $2
- }
-| _OTHERWISE simple_block
- {
- $$ = $2
- }
-
-expr_list_opt:
- {
- $$ = nil
- }
-| expr_list
-
-expr_list:
- expr
- {
- $$ = []*Expr{$1}
- }
-| expr_list ',' expr
- {
- $$ = append($1, $3)
- }
-
-const_list:
- const
- {
- $$ = []*Expr{$1}
- }
-| const_list ',' const
- {
- $$ = append($1, $3)
- }
-
-const:
- _CONST
- {
- $$ = &Expr{Op: Const, Text: $1}
- }
-| _NAME
- {
- $$ = &Expr{Op: Name, Text: $1}
- }
-
-expr_minus_list:
- expr
- {
- $$ = []*Expr{$1}
- }
-| '-'
- {
- $$ = []*Expr{&Expr{Op: Blank}}
- }
-| expr_minus_list ',' expr
- {
- $$ = append($1, $3)
- }
-| expr_minus_list ',' '-'
- {
- $$ = append($1, &Expr{Op: Blank})
- }
-
-expr:
- _CONST
- {
- $$ = &Expr{Op: Const, Text: $1}
- }
-| _NAME
- {
- $$ = &Expr{Op: Name, Text: $1}
- }
-| unnamed_type _NAME
- {
- $$ = &Expr{Op: Decl, Type: $1, Text: $2}
- }
-| _UNKNOWN
- {
- $$ = &Expr{Op: Unknown}
- }
-| unnamed_type _UNKNOWN
- {
- $$ = &Expr{Op: Unknown, Type: $1}
- }
-| call_expr
-| '(' expr_minus_list ')'
- {
- $$ = &Expr{Op: ExprTuple, List: $2}
- }
-| expr _EQ expr
- {
- $$ = &Expr{Op: Eq, X: $1, Y: $3}
- }
-| expr _NE expr
- {
- $$ = &Expr{Op: NotEq, X: $1, Y: $3}
- }
-| expr _LE expr
- {
- $$ = &Expr{Op: LtEq, X: $1, Y: $3}
- }
-| expr '<' expr_list '>'
- {
- $$ = &Expr{Op: BitIndex, X: $1, List: $3}
- }
-| expr _LT expr
- {
- $$ = &Expr{Op: Lt, X: $1, Y: $3}
- }
-| expr _GE expr
- {
- $$ = &Expr{Op: GtEq, X: $1, Y: $3}
- }
-| expr _GT expr
- {
- $$ = &Expr{Op: Gt, X: $1, Y: $3}
- }
-| _IF expr _THEN expr _ELSE expr %prec _IF
- {
- $$ = &Expr{Op: IfElse, X: $2, Y: $4, Z: $6}
- }
-| '!' expr %prec unary
- {
- $$ = &Expr{Op: Not, X: $2}
- }
-| expr _ANDAND expr
- {
- $$ = &Expr{Op: AndAnd, X: $1, Y: $3}
- }
-| expr _OROR expr
- {
- $$ = &Expr{Op: OrOr, X: $1, Y: $3}
- }
-| expr '^' expr
- {
- $$ = &Expr{Op: Eor, X: $1, Y: $3}
- }
-| expr ':' expr
- {
- $$ = &Expr{Op: Colon, X: $1, Y: $3}
- }
-| expr _AND expr
- {
- $$ = &Expr{Op: BigAND, X: $1, Y: $3}
- }
-| expr _OR expr
- {
- $$ = &Expr{Op: BigOR, X: $1, Y: $3}
- }
-| expr _EOR expr
- {
- $$ = &Expr{Op: BigEOR, X: $1, Y: $3}
- }
-| '+' expr %prec unary
- {
- $$ = &Expr{Op: Plus, X: $2}
- }
-| '-' expr %prec unary
- {
- $$ = &Expr{Op: Minus, X: $2}
- }
-| expr '+' expr
- {
- $$ = &Expr{Op: Add, X: $1, Y: $3}
- }
-| expr '-' expr
- {
- $$ = &Expr{Op: Sub, X: $1, Y: $3}
- }
-| expr '*' expr
- {
- $$ = &Expr{Op: Mul, X: $1, Y: $3}
- }
-| expr '/' expr
- {
- $$ = &Expr{Op: Div, X: $1, Y: $3}
- }
-| expr _DIV expr
- {
- $$ = &Expr{Op: BigDIV, X: $1, Y: $3}
- }
-| expr _MOD expr
- {
- $$ = &Expr{Op: BigMOD, X: $1, Y: $3}
- }
-| _TWOPOW expr
- {
- $$ = &Expr{Op: TwoPow, X: $2}
- }
-| expr _LSH expr
- {
- $$ = &Expr{Op: Lsh, X: $1, Y: $3}
- }
-| expr _RSH expr
- {
- $$ = &Expr{Op: Rsh, X: $1, Y: $3}
- }
-| expr '[' expr_list ']'
- {
- $$ = &Expr{Op: Index, X: $1, List: $3}
- }
-| expr '.' _NAME
- {
- $$ = &Expr{Op: Dot, X: $1, Text: $3}
- }
-| expr '=' expr %prec last_resort
- {
- $$ = &Expr{Op: Eq, X: $1, Y: $3}
- }
-
-call_expr:
- _NAME_PAREN expr_list_opt ')'
- {
- $$ = &Expr{Op: Call, Text: $1, List: $2}
- }
-
-unnamed_type:
- _BITS expr ')'
- {
- $$ = &Type{Op: BitType, NX: $2}
- }
-| _BIT
- {
- $$ = &Type{Op: BitType, N: 1}
- }
-| _INTEGER
- {
- $$ = &Type{Op: IntegerType}
- }
-| _BOOLEAN
- {
- $$ = &Type{Op: BoolType}
- }
-
-%%
-
-func parseIntConst(s string) int {
- n, _ := strconv.Atoi(s)
- return n
-}
diff --git a/arm/armspec/y.go b/arm/armspec/y.go
deleted file mode 100644
index 8a289ce..0000000
--- a/arm/armspec/y.go
+++ /dev/null
@@ -1,1165 +0,0 @@
-//line pseudo.y:2
-package main
-
-import __yyfmt__ "fmt"
-
-//line pseudo.y:2
-import (
- "strconv"
-)
-
-//line pseudo.y:10
-type yySymType struct {
- yys int
- str string
- line Line
- stmt *Stmt
- stmts []*Stmt
- expr *Expr
- exprs []*Expr
- elseifs []*ElseIf
- when *When
- whens []*When
- typ *Type
- typs []*Type
-}
-
-const _ASSERT = 57346
-const _BITS = 57347
-const _BIT = 57348
-const _IF = 57349
-const _EOF = 57350
-const _NAME = 57351
-const _NAME_PAREN = 57352
-const _RETURN = 57353
-const _UNDEFINED = 57354
-const _UNPREDICTABLE = 57355
-const _IMPLEMENTATION_DEFINED = 57356
-const _SUBARCHITECTURE_DEFINED = 57357
-const _ENUMERATION = 57358
-const _DO = 57359
-const _INDENT = 57360
-const _UNINDENT = 57361
-const _THEN = 57362
-const _REPEAT = 57363
-const _UNTIL = 57364
-const _WHILE = 57365
-const _CASE = 57366
-const _FOR = 57367
-const _TO = 57368
-const _OF = 57369
-const _ELSIF = 57370
-const _ELSE = 57371
-const _OTHERWISE = 57372
-const _WHEN = 57373
-const _CONST = 57374
-const _UNKNOWN = 57375
-const _EQ = 57376
-const _NE = 57377
-const _LE = 57378
-const _GE = 57379
-const _AND = 57380
-const _OR = 57381
-const _EOR = 57382
-const _ANDAND = 57383
-const _OROR = 57384
-const _DIV = 57385
-const _MOD = 57386
-const _TWOPOW = 57387
-const _LSH = 57388
-const _RSH = 57389
-const _INTEGER = 57390
-const _BOOLEAN = 57391
-const _SEE = 57392
-const last_resort = 57393
-const _LT = 57394
-const _GT = 57395
-const unary = 57396
-
-var yyToknames = []string{
- "_ASSERT",
- "_BITS",
- "_BIT",
- "_IF",
- "_EOF",
- "_NAME",
- "_NAME_PAREN",
- "_RETURN",
- "_UNDEFINED",
- "_UNPREDICTABLE",
- "_IMPLEMENTATION_DEFINED",
- "_SUBARCHITECTURE_DEFINED",
- "_ENUMERATION",
- "_DO",
- "_INDENT",
- "_UNINDENT",
- "_THEN",
- "_REPEAT",
- "_UNTIL",
- "_WHILE",
- "_CASE",
- "_FOR",
- "_TO",
- "_OF",
- "_ELSIF",
- "_ELSE",
- "_OTHERWISE",
- "_WHEN",
- "_CONST",
- "_UNKNOWN",
- "_EQ",
- "_NE",
- "_LE",
- "_GE",
- "_AND",
- "_OR",
- "_EOR",
- "_ANDAND",
- "_OROR",
- "_DIV",
- "_MOD",
- "_TWOPOW",
- "_LSH",
- "_RSH",
- "_INTEGER",
- "_BOOLEAN",
- "_SEE",
- "last_resort",
- " =",
- " ,",
- "_LT",
- " >",
- "_GT",
- " :",
- " +",
- " -",
- " |",
- " ^",
- " *",
- " /",
- " %",
- " &",
- " .",
- " <",
- " [",
- "unary",
-}
-var yyStatenames = []string{}
-
-const yyEofCode = 1
-const yyErrCode = 2
-const yyMaxDepth = 200
-
-//line pseudo.y:544
-func parseIntConst(s string) int {
- n, _ := strconv.Atoi(s)
- return n
-}
-
-//line yacctab:1
-var yyExca = []int{
- -1, 1,
- 1, -1,
- -2, 0,
-}
-
-const yyNprod = 107
-const yyPrivate = 57344
-
-var yyTokenNames []string
-var yyStates []string
-
-const yyLast = 1272
-
-var yyAct = []int{
-
- 15, 190, 103, 44, 16, 134, 194, 16, 42, 5,
- 47, 48, 49, 50, 140, 4, 13, 137, 79, 39,
- 78, 138, 43, 6, 85, 46, 6, 181, 154, 134,
- 133, 16, 96, 89, 91, 92, 93, 94, 79, 75,
- 55, 74, 139, 134, 84, 83, 101, 82, 168, 81,
- 6, 80, 108, 109, 110, 111, 79, 113, 114, 115,
- 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,
- 126, 127, 128, 129, 130, 79, 112, 76, 134, 102,
- 153, 77, 203, 3, 100, 188, 40, 27, 63, 150,
- 16, 93, 132, 70, 71, 131, 72, 73, 143, 144,
- 145, 16, 39, 147, 179, 180, 149, 142, 41, 6,
- 41, 86, 68, 69, 141, 202, 75, 55, 74, 95,
- 148, 98, 53, 54, 57, 63, 64, 65, 59, 60,
- 70, 71, 38, 72, 73, 155, 87, 196, 79, 157,
- 201, 56, 1, 58, 62, 66, 67, 164, 61, 68,
- 69, 173, 174, 75, 55, 74, 193, 88, 156, 93,
- 195, 170, 171, 167, 175, 178, 162, 176, 160, 172,
- 169, 182, 161, 159, 185, 16, 14, 177, 16, 187,
- 2, 184, 191, 16, 186, 0, 0, 0, 183, 192,
- 0, 0, 0, 0, 0, 16, 189, 0, 0, 0,
- 0, 200, 16, 207, 199, 16, 0, 0, 205, 208,
- 0, 192, 0, 0, 204, 0, 0, 0, 206, 12,
- 23, 24, 7, 0, 30, 37, 17, 18, 19, 21,
- 22, 28, 0, 27, 136, 0, 8, 0, 9, 11,
- 10, 0, 0, 0, 0, 0, 0, 29, 31, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 36, 0, 0, 25, 26, 20, 0, 0, 0, 0,
- 0, 0, 0, 34, 35, 12, 23, 24, 7, 0,
- 30, 37, 17, 18, 19, 21, 22, 28, 32, 27,
- 33, 0, 8, 0, 9, 11, 10, 0, 0, 0,
- 0, 0, 0, 29, 31, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 36, 0, 0, 25,
- 26, 20, 0, 0, 0, 0, 0, 0, 0, 34,
- 35, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 32, 0, 33, 98, 53, 54,
- 57, 63, 64, 65, 59, 60, 70, 71, 0, 72,
- 73, 0, 0, 0, 0, 99, 0, 56, 0, 58,
- 62, 66, 67, 0, 61, 68, 69, 0, 0, 75,
- 55, 74, 0, 0, 23, 24, 45, 135, 30, 37,
- 17, 18, 19, 21, 22, 0, 0, 27, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 29, 31, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 36, 0, 0, 25, 26, 20,
- 0, 0, 0, 0, 0, 0, 0, 34, 35, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 32, 0, 33, 98, 53, 54, 57, 63,
- 64, 65, 59, 60, 70, 71, 0, 72, 73, 0,
- 0, 0, 0, 99, 0, 56, 0, 58, 62, 66,
- 67, 0, 61, 68, 69, 0, 0, 75, 55, 74,
- 0, 165, 98, 53, 54, 57, 63, 64, 65, 59,
- 60, 70, 71, 0, 72, 73, 0, 0, 0, 0,
- 99, 0, 56, 0, 58, 62, 66, 67, 0, 61,
- 68, 69, 0, 0, 75, 55, 74, 0, 151, 98,
- 53, 54, 57, 63, 64, 65, 59, 60, 70, 71,
- 0, 72, 73, 0, 0, 0, 0, 99, 0, 56,
- 0, 58, 62, 66, 67, 0, 61, 68, 69, 0,
- 0, 75, 55, 74, 0, 107, 23, 24, 45, 0,
- 30, 37, 17, 18, 19, 21, 22, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 29, 31, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 36, 0, 0, 25,
- 26, 20, 0, 0, 0, 0, 0, 0, 0, 34,
- 35, 0, 0, 198, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 32, 0, 33, 98, 53, 54,
- 57, 63, 64, 65, 59, 60, 70, 71, 0, 72,
- 73, 0, 0, 0, 0, 99, 0, 56, 197, 58,
- 62, 66, 67, 0, 61, 68, 69, 0, 0, 75,
- 55, 74, 98, 53, 54, 57, 63, 64, 65, 59,
- 60, 70, 71, 0, 72, 73, 0, 0, 0, 0,
- 99, 104, 56, 0, 58, 62, 66, 67, 0, 61,
- 68, 69, 0, 0, 75, 55, 74, 0, 98, 53,
- 54, 57, 63, 64, 65, 59, 60, 70, 71, 0,
- 72, 73, 0, 0, 0, 0, 99, 0, 56, 0,
- 58, 62, 66, 67, 0, 61, 68, 69, 163, 0,
- 75, 55, 74, 98, 53, 54, 57, 63, 64, 65,
- 59, 60, 70, 71, 0, 72, 73, 0, 0, 0,
- 0, 99, 0, 56, 0, 58, 62, 66, 67, 0,
- 61, 68, 69, 166, 0, 75, 55, 74, 0, 0,
- 0, 98, 53, 54, 57, 63, 64, 65, 59, 60,
- 70, 71, 0, 72, 73, 0, 0, 0, 0, 99,
- 0, 56, 0, 58, 62, 66, 67, 0, 61, 68,
- 69, 163, 0, 75, 55, 74, 52, 53, 54, 57,
- 63, 64, 65, 59, 60, 70, 71, 0, 72, 73,
- 0, 0, 0, 0, 51, 0, 56, 146, 58, 62,
- 66, 67, 0, 61, 68, 69, 0, 0, 75, 55,
- 74, 98, 53, 54, 57, 63, 64, 65, 59, 60,
- 70, 71, 0, 72, 73, 0, 0, 0, 0, 99,
- 0, 56, 0, 58, 62, 66, 67, 0, 61, 68,
- 69, 106, 0, 75, 55, 74, 0, 0, 98, 53,
- 54, 57, 63, 64, 65, 59, 60, 70, 71, 0,
- 72, 73, 0, 0, 0, 0, 99, 0, 56, 97,
- 58, 62, 66, 67, 0, 61, 68, 69, 0, 0,
- 75, 55, 74, 98, 53, 54, 57, 63, 64, 65,
- 59, 60, 70, 71, 0, 72, 73, 0, 0, 0,
- 0, 99, 0, 56, 0, 58, 62, 66, 67, 0,
- 61, 68, 69, 0, 0, 75, 55, 74, 98, 53,
- 54, 57, 63, 64, 65, 59, 60, 70, 71, 0,
- 72, 73, 0, 0, 0, 0, 99, 0, 56, 0,
- 58, 62, 66, 67, 0, 61, 68, 69, 0, 0,
- 75, 55, 74, 98, 53, 54, 57, 63, 64, 65,
- 59, 60, 70, 71, 0, 72, 73, 0, 0, 0,
- 0, 105, 0, 56, 0, 58, 62, 66, 67, 0,
- 61, 68, 69, 0, 0, 75, 55, 74, 52, 53,
- 54, 57, 63, 64, 65, 59, 60, 70, 71, 0,
- 72, 73, 0, 0, 0, 0, 51, 0, 56, 0,
- 58, 62, 66, 67, 0, 61, 68, 69, 0, 0,
- 75, 55, 74, 98, 53, 54, 57, 63, 64, 65,
- 0, 0, 70, 71, 0, 72, 73, 23, 24, 45,
- 0, 30, 37, 56, 0, 58, 62, 66, 67, 0,
- 61, 68, 69, 0, 0, 75, 55, 74, 23, 24,
- 45, 0, 30, 37, 29, 31, 23, 24, 45, 0,
- 30, 37, 0, 0, 0, 0, 0, 36, 0, 0,
- 25, 26, 0, 0, 0, 29, 31, 0, 0, 0,
- 34, 35, 0, 29, 31, 0, 0, 0, 36, 0,
- 0, 25, 26, 0, 0, 32, 36, 33, 0, 25,
- 26, 34, 158, 0, 0, 0, 0, 0, 0, 34,
- 90, 0, 0, 0, 0, 0, 32, 0, 33, 0,
- 0, 0, 0, 0, 32, 0, 33, 63, 64, 65,
- 0, 0, 70, 71, 0, 72, 73, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 62, 66, 67, 0,
- 61, 68, 69, 0, 0, 75, 55, 74, 0, 152,
- 63, 64, 65, 0, 0, 70, 71, 0, 72, 73,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,
- 66, 67, 0, 61, 68, 69, 0, 0, 75, 55,
- 74, 63, 64, 65, 0, 0, 70, 71, 0, 72,
- 73, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 66, 67, 0, 61, 68, 69, 0, 0, 75,
- 55, 74,
-}
-var yyPact = []int{
-
- 271, -1000, 124, 271, -1000, -1000, 77, 1072, 69, 1072,
- 1072, 1072, 1072, -1000, -1000, 994, 7, 1072, -19, -21,
- -23, -25, -26, 1072, -1000, -1000, -1000, 271, 127, -1000,
- -1000, -1000, 1101, 1072, 1072, 1072, 1072, 1072, -1000, -1000,
- -38, -1000, 889, 75, -1000, 1072, 57, 674, 959, 854,
- 495, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072,
- 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072, 1072,
- 1072, 1072, 1072, 1072, 1072, 83, -1000, -40, -10, 924,
- -1000, -1000, -1000, -1000, -1000, 313, 215, -54, -32, 924,
- 1072, -1000, -1000, -1000, -27, -60, -1000, 379, 1072, 1072,
- -1000, 817, 1072, 69, -1000, 1072, 71, -1000, 458, 1139,
- 1172, 1172, 25, 1172, 1172, 1172, 1029, 1029, 50, 1203,
- -27, 50, 50, 50, 50, -27, -27, -27, -27, -27,
- -27, -48, -1000, -1000, 1072, -1000, -1000, 1072, 1093, -1000,
- -1000, -1000, -1000, 782, 1172, 924, 1072, 421, -1000, 747,
- -1000, -1000, -1000, -1000, -1000, 924, -24, 924, 1072, -1000,
- 133, -1000, 123, 1072, 709, -1000, 1072, 74, -43, -1000,
- 1072, 379, -1000, 1072, 561, 87, 674, 66, -1000, 379,
- 128, -1000, 638, -1000, -1000, 603, -1000, 69, -1000, -1000,
- -1000, 561, -1000, 62, -1000, -1000, -1000, 69, 561, -1000,
- -1000, 379, 128, -1000, -1000, -1000, -1000, -1000, -1000,
-}
-var yyPgo = []int{
-
- 0, 83, 182, 180, 15, 9, 16, 1, 177, 176,
- 173, 172, 170, 169, 168, 166, 165, 163, 81, 20,
- 157, 156, 0, 3, 6, 22, 142, 2, 140,
-}
-var yyR1 = []int{
-
- 0, 26, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 9, 27, 27, 6, 7, 2, 2, 1,
- 1, 3, 3, 10, 11, 14, 14, 15, 15, 12,
- 12, 12, 13, 13, 17, 17, 16, 16, 28, 28,
- 8, 8, 8, 18, 18, 19, 19, 21, 21, 24,
- 24, 20, 20, 20, 20, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 22, 23, 25, 25, 25, 25,
-}
-var yyR2 = []int{
-
- 0, 2, 4, 4, 2, 3, 2, 2, 2, 2,
- 2, 1, 3, 5, 5, 5, 4, 8, 7, 3,
- 1, 1, 6, 0, 1, 3, 1, 1, 2, 1,
- 2, 0, 1, 2, 2, 0, 5, 0, 5, 0,
- 2, 2, 0, 2, 0, 2, 4, 4, 0, 1,
- 0, 2, 2, 0, 1, 1, 3, 1, 3, 1,
- 1, 1, 1, 3, 3, 1, 1, 2, 1, 2,
- 1, 3, 3, 3, 3, 4, 3, 3, 3, 6,
- 2, 3, 3, 3, 3, 3, 3, 3, 2, 2,
- 3, 3, 3, 3, 3, 3, 2, 3, 3, 4,
- 3, 3, 3, 3, 1, 1, 1,
-}
-var yyChk = []int{
-
- -1000, -26, -3, -1, -4, -5, -25, 7, 21, 23,
- 25, 24, 4, -6, -9, -22, -23, 11, 12, 13,
- 50, 14, 15, 5, 6, 48, 49, 18, 16, 32,
- 9, 33, 73, 75, 58, 59, 45, 10, 8, -4,
- 9, 33, -22, -25, -23, 7, -6, -22, -22, -22,
- -22, 52, 34, 35, 36, 67, 54, 37, 56, 41,
- 42, 61, 57, 38, 39, 40, 58, 59, 62, 63,
- 43, 44, 46, 47, 68, 66, 70, -18, -19, -22,
- 70, 70, 70, 70, 70, -22, -1, 9, -20, -22,
- 59, -22, -22, -22, -22, -18, 70, 20, 34, 52,
- 9, -22, 22, -27, 17, 52, 27, 70, -22, -22,
- -22, -22, -19, -22, -22, -22, -22, -22, -22, -22,
- -22, -22, -22, -22, -22, -22, -22, -22, -22, -22,
- -22, -19, 9, 70, 53, 74, 19, 71, 53, 74,
- 74, -6, -5, -22, -22, -22, 20, -22, -6, -22,
- 18, 70, 70, 55, 76, -22, -19, -22, 59, -10,
- -14, -11, -15, 29, -22, 70, 26, -17, 72, -12,
- 28, 29, -13, 28, 29, -22, -22, -8, -16, 30,
- 31, 70, -22, -6, -5, -22, -5, -27, 19, -6,
- -7, -2, -5, -21, -24, 32, 9, 20, 20, -6,
- -5, -28, 53, 20, -6, -5, -6, -7, -24,
-}
-var yyDef = []int{
-
- 31, -2, 0, 32, 29, 11, 0, 0, 0, 0,
- 0, 0, 0, 20, 21, 0, 70, 53, 0, 0,
- 0, 0, 0, 0, 104, 105, 106, 0, 0, 65,
- 66, 68, 0, 0, 0, 0, 0, 53, 1, 30,
- 67, 69, 0, 0, 70, 0, 0, 23, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 4, 0, 54, 55,
- 6, 7, 8, 9, 10, 0, 0, 0, 0, 61,
- 62, 80, 88, 89, 96, 0, 12, 0, 0, 0,
- 67, 0, 0, 0, 24, 0, 0, 19, 101, 72,
- 73, 74, 0, 76, 77, 78, 81, 82, 83, 84,
- 85, 86, 87, 90, 91, 92, 93, 94, 95, 97,
- 98, 0, 100, 5, 0, 103, 25, 0, 0, 71,
- 102, 35, 37, 0, 72, 101, 0, 0, 16, 0,
- 44, 2, 3, 75, 99, 56, 0, 63, 64, 13,
- 39, 14, 42, 0, 0, 15, 0, 50, 0, 33,
- 0, 0, 34, 0, 0, 79, 23, 0, 45, 0,
- 0, 22, 0, 40, 41, 0, 43, 0, 18, 51,
- 52, 26, 27, 48, 57, 59, 60, 0, 0, 17,
- 28, 0, 0, 49, 36, 38, 46, 47, 58,
-}
-var yyTok1 = []int{
-
- 1, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 75, 3, 3, 3, 64, 65, 3,
- 73, 74, 62, 58, 53, 59, 66, 63, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 57, 70,
- 67, 52, 55, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 68, 3, 76, 61, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 71, 60, 72,
-}
-var yyTok2 = []int{
-
- 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
- 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
- 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
- 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
- 54, 56, 69,
-}
-var yyTok3 = []int{
- 0,
-}
-
-//line yaccpar:1
-
-/* parser for yacc output */
-
-var yyDebug = 0
-
-type yyLexer interface {
- Lex(lval *yySymType) int
- Error(s string)
-}
-
-const yyFlag = -1000
-
-func yyTokname(c int) string {
- // 4 is TOKSTART above
- if c >= 4 && c-4 < len(yyToknames) {
- if yyToknames[c-4] != "" {
- return yyToknames[c-4]
- }
- }
- return __yyfmt__.Sprintf("tok-%v", c)
-}
-
-func yyStatname(s int) string {
- if s >= 0 && s < len(yyStatenames) {
- if yyStatenames[s] != "" {
- return yyStatenames[s]
- }
- }
- return __yyfmt__.Sprintf("state-%v", s)
-}
-
-func yylex1(lex yyLexer, lval *yySymType) int {
- c := 0
- char := lex.Lex(lval)
- if char <= 0 {
- c = yyTok1[0]
- goto out
- }
- if char < len(yyTok1) {
- c = yyTok1[char]
- goto out
- }
- if char >= yyPrivate {
- if char < yyPrivate+len(yyTok2) {
- c = yyTok2[char-yyPrivate]
- goto out
- }
- }
- for i := 0; i < len(yyTok3); i += 2 {
- c = yyTok3[i+0]
- if c == char {
- c = yyTok3[i+1]
- goto out
- }
- }
-
-out:
- if c == 0 {
- c = yyTok2[1] /* unknown char */
- }
- if yyDebug >= 3 {
- __yyfmt__.Printf("lex %s(%d)\n", yyTokname(c), uint(char))
- }
- return c
-}
-
-func yyParse(yylex yyLexer) int {
- var yyn int
- var yylval yySymType
- var yyVAL yySymType
- yyS := make([]yySymType, yyMaxDepth)
-
- Nerrs := 0 /* number of errors */
- Errflag := 0 /* error recovery flag */
- yystate := 0
- yychar := -1
- yyp := -1
- goto yystack
-
-ret0:
- return 0
-
-ret1:
- return 1
-
-yystack:
- /* put a state and value onto the stack */
- if yyDebug >= 4 {
- __yyfmt__.Printf("char %v in %v\n", yyTokname(yychar), yyStatname(yystate))
- }
-
- yyp++
- if yyp >= len(yyS) {
- nyys := make([]yySymType, len(yyS)*2)
- copy(nyys, yyS)
- yyS = nyys
- }
- yyS[yyp] = yyVAL
- yyS[yyp].yys = yystate
-
-yynewstate:
- yyn = yyPact[yystate]
- if yyn <= yyFlag {
- goto yydefault /* simple state */
- }
- if yychar < 0 {
- yychar = yylex1(yylex, &yylval)
- }
- yyn += yychar
- if yyn < 0 || yyn >= yyLast {
- goto yydefault
- }
- yyn = yyAct[yyn]
- if yyChk[yyn] == yychar { /* valid shift */
- yychar = -1
- yyVAL = yylval
- yystate = yyn
- if Errflag > 0 {
- Errflag--
- }
- goto yystack
- }
-
-yydefault:
- /* default state action */
- yyn = yyDef[yystate]
- if yyn == -2 {
- if yychar < 0 {
- yychar = yylex1(yylex, &yylval)
- }
-
- /* look through exception table */
- xi := 0
- for {
- if yyExca[xi+0] == -1 && yyExca[xi+1] == yystate {
- break
- }
- xi += 2
- }
- for xi += 2; ; xi += 2 {
- yyn = yyExca[xi+0]
- if yyn < 0 || yyn == yychar {
- break
- }
- }
- yyn = yyExca[xi+1]
- if yyn < 0 {
- goto ret0
- }
- }
- if yyn == 0 {
- /* error ... attempt to resume parsing */
- switch Errflag {
- case 0: /* brand new error */
- yylex.Error("syntax error")
- Nerrs++
- if yyDebug >= 1 {
- __yyfmt__.Printf("%s", yyStatname(yystate))
- __yyfmt__.Printf(" saw %s\n", yyTokname(yychar))
- }
- fallthrough
-
- case 1, 2: /* incompletely recovered error ... try again */
- Errflag = 3
-
- /* find a state where "error" is a legal shift action */
- for yyp >= 0 {
- yyn = yyPact[yyS[yyp].yys] + yyErrCode
- if yyn >= 0 && yyn < yyLast {
- yystate = yyAct[yyn] /* simulate a shift of "error" */
- if yyChk[yystate] == yyErrCode {
- goto yystack
- }
- }
-
- /* the current p has no shift on "error", pop stack */
- if yyDebug >= 2 {
- __yyfmt__.Printf("error recovery pops state %d\n", yyS[yyp].yys)
- }
- yyp--
- }
- /* there is no state on the stack with an error shift ... abort */
- goto ret1
-
- case 3: /* no shift yet; clobber input char */
- if yyDebug >= 2 {
- __yyfmt__.Printf("error recovery discards %s\n", yyTokname(yychar))
- }
- if yychar == yyEofCode {
- goto ret1
- }
- yychar = -1
- goto yynewstate /* try again in the same state */
- }
- }
-
- /* reduction by production yyn */
- if yyDebug >= 2 {
- __yyfmt__.Printf("reduce %v in:\n\t%v\n", yyn, yyStatname(yystate))
- }
-
- yynt := yyn
- yypt := yyp
- _ = yypt // guard against "declared and not used"
-
- yyp -= yyR2[yyn]
- yyVAL = yyS[yyp+1]
-
- /* consult goto table to find next state */
- yyn = yyR1[yyn]
- yyg := yyPgo[yyn]
- yyj := yyg + yyS[yyp].yys + 1
-
- if yyj >= yyLast {
- yystate = yyAct[yyg]
- } else {
- yystate = yyAct[yyj]
- if yyChk[yystate] != -yyn {
- yystate = yyAct[yyg]
- }
- }
- // dummy call; replaced with literal code
- switch yynt {
-
- case 1:
- //line pseudo.y:100
- {
- yylex.(*Lexer).prog = yyS[yypt-1].stmts
- return 0
- }
- case 2:
- //line pseudo.y:107
- {
- yyVAL.stmt = &Stmt{Op: Assign, X: yyS[yypt-3].expr, Y: yyS[yypt-1].expr}
- }
- case 3:
- //line pseudo.y:111
- {
- yyVAL.stmt = &Stmt{Op: Assign, X: yyS[yypt-3].expr, Y: yyS[yypt-1].expr}
- }
- case 4:
- //line pseudo.y:115
- {
- yyVAL.stmt = &Stmt{Op: StmtExpr, X: yyS[yypt-1].expr}
- }
- case 5:
- //line pseudo.y:119
- {
- yyVAL.stmt = &Stmt{Op: Return, List: yyS[yypt-1].exprs}
- }
- case 6:
- //line pseudo.y:123
- {
- yyVAL.stmt = &Stmt{Op: Undefined}
- }
- case 7:
- //line pseudo.y:127
- {
- yyVAL.stmt = &Stmt{Op: Unpredictable}
- }
- case 8:
- //line pseudo.y:131
- {
- yyVAL.stmt = &Stmt{Op: See, Text: yyS[yypt-1].str}
- }
- case 9:
- //line pseudo.y:135
- {
- yyVAL.stmt = &Stmt{Op: ImplDefined}
- }
- case 10:
- //line pseudo.y:139
- {
- yyVAL.stmt = &Stmt{Op: SubarchDefined}
- }
- case 11:
- yyVAL.stmt = yyS[yypt-0].stmt
- case 12:
- //line pseudo.y:146
- {
- yyVAL.stmt = &Stmt{Op: StmtExpr, X: &Expr{Op: Decl, Type: yyS[yypt-2].typ, Text: yyS[yypt-1].str}}
- }
- case 13:
- //line pseudo.y:150
- {
- yyVAL.stmt = &Stmt{Op: If, X: yyS[yypt-3].expr, Body: yyS[yypt-1].stmt, ElseIf: yyS[yypt-0].elseifs, Else: yyS[yypt-0].stmt}
- }
- case 14:
- //line pseudo.y:154
- {
- yyVAL.stmt = &Stmt{Op: If, X: yyS[yypt-3].expr, Body: yyS[yypt-1].stmt, ElseIf: yyS[yypt-0].elseifs, Else: yyS[yypt-0].stmt}
- }
- case 15:
- //line pseudo.y:158
- {
- yyVAL.stmt = &Stmt{Op: Repeat, Body: yyS[yypt-3].stmt, X: yyS[yypt-1].expr}
- }
- case 16:
- //line pseudo.y:162
- {
- yyVAL.stmt = &Stmt{Op: While, X: yyS[yypt-2].expr, Body: yyS[yypt-0].stmt}
- }
- case 17:
- //line pseudo.y:166
- {
- yyVAL.stmt = &Stmt{Op: For, X: yyS[yypt-6].expr, Y: yyS[yypt-4].expr, Z: yyS[yypt-2].expr, Body: yyS[yypt-0].stmt}
- }
- case 18:
- //line pseudo.y:170
- {
- yyVAL.stmt = &Stmt{Op: Case, X: yyS[yypt-5].expr, When: yyS[yypt-2].whens, Else: yyS[yypt-1].stmt}
- }
- case 19:
- //line pseudo.y:174
- {
- yyVAL.stmt = &Stmt{Op: Assert, X: yyS[yypt-1].expr}
- }
- case 20:
- //line pseudo.y:178
- {
- yyVAL.stmt = yyS[yypt-0].stmt
- }
- case 21:
- yyVAL.stmt = yyS[yypt-0].stmt
- case 22:
- //line pseudo.y:185
- {
- yyVAL.stmt = &Stmt{Op: Enum, Text: yyS[yypt-4].str, List: yyS[yypt-2].exprs}
- }
- case 25:
- //line pseudo.y:194
- {
- yyVAL.stmt = &Stmt{Op: Block, Block: yyS[yypt-1].stmts}
- }
- case 26:
- //line pseudo.y:200
- {
- yyVAL.stmt = &Stmt{Op: Block, Block: yyS[yypt-0].stmts}
- }
- case 27:
- //line pseudo.y:206
- {
- yyVAL.stmts = []*Stmt{yyS[yypt-0].stmt}
- }
- case 28:
- //line pseudo.y:210
- {
- yyVAL.stmts = append(yyS[yypt-1].stmts, yyS[yypt-0].stmt)
- }
- case 29:
- //line pseudo.y:216
- {
- yyVAL.stmts = []*Stmt{yyS[yypt-0].stmt}
- }
- case 30:
- //line pseudo.y:220
- {
- yyVAL.stmts = append(yyS[yypt-1].stmts, yyS[yypt-0].stmt)
- }
- case 31:
- //line pseudo.y:225
- {
- yyVAL.stmts = nil
- }
- case 32:
- yyVAL.stmts = yyS[yypt-0].stmts
- case 33:
- //line pseudo.y:232
- {
- yyVAL.elseifs = yyS[yypt-1].elseifs
- yyVAL.stmt = yyS[yypt-0].stmt
- }
- case 34:
- //line pseudo.y:239
- {
- yyVAL.elseifs = yyS[yypt-1].elseifs
- yyVAL.stmt = yyS[yypt-0].stmt
- }
- case 35:
- //line pseudo.y:245
- {
- yyVAL.elseifs = nil
- }
- case 36:
- //line pseudo.y:249
- {
- yyVAL.elseifs = append(yyS[yypt-4].elseifs, &ElseIf{Cond: yyS[yypt-2].expr, Body: yyS[yypt-0].stmt})
- }
- case 37:
- //line pseudo.y:254
- {
- yyVAL.elseifs = nil
- }
- case 38:
- //line pseudo.y:258
- {
- yyVAL.elseifs = append(yyS[yypt-4].elseifs, &ElseIf{Cond: yyS[yypt-2].expr, Body: yyS[yypt-0].stmt})
- }
- case 39:
- //line pseudo.y:263
- {
- yyVAL.stmt = nil
- }
- case 40:
- //line pseudo.y:267
- {
- yyVAL.stmt = yyS[yypt-0].stmt
- }
- case 41:
- //line pseudo.y:271
- {
- yyVAL.stmt = yyS[yypt-0].stmt
- }
- case 42:
- //line pseudo.y:276
- {
- yyVAL.stmt = nil
- }
- case 43:
- //line pseudo.y:280
- {
- yyVAL.stmt = yyS[yypt-0].stmt
- }
- case 44:
- //line pseudo.y:285
- {
- yyVAL.whens = nil
- }
- case 45:
- //line pseudo.y:289
- {
- yyVAL.whens = append(yyS[yypt-1].whens, yyS[yypt-0].when)
- }
- case 46:
- //line pseudo.y:295
- {
- yyVAL.when = &When{Cond: yyS[yypt-2].exprs, Body: yyS[yypt-0].stmt}
- }
- case 47:
- //line pseudo.y:299
- {
- yyVAL.when = &When{Cond: yyS[yypt-2].exprs, Body: yyS[yypt-0].stmt}
- }
- case 50:
- //line pseudo.y:307
- {
- yyVAL.stmt = nil
- }
- case 51:
- //line pseudo.y:311
- {
- yyVAL.stmt = yyS[yypt-0].stmt
- }
- case 52:
- //line pseudo.y:315
- {
- yyVAL.stmt = yyS[yypt-0].stmt
- }
- case 53:
- //line pseudo.y:320
- {
- yyVAL.exprs = nil
- }
- case 54:
- yyVAL.exprs = yyS[yypt-0].exprs
- case 55:
- //line pseudo.y:327
- {
- yyVAL.exprs = []*Expr{yyS[yypt-0].expr}
- }
- case 56:
- //line pseudo.y:331
- {
- yyVAL.exprs = append(yyS[yypt-2].exprs, yyS[yypt-0].expr)
- }
- case 57:
- //line pseudo.y:337
- {
- yyVAL.exprs = []*Expr{yyS[yypt-0].expr}
- }
- case 58:
- //line pseudo.y:341
- {
- yyVAL.exprs = append(yyS[yypt-2].exprs, yyS[yypt-0].expr)
- }
- case 59:
- //line pseudo.y:347
- {
- yyVAL.expr = &Expr{Op: Const, Text: yyS[yypt-0].str}
- }
- case 60:
- //line pseudo.y:351
- {
- yyVAL.expr = &Expr{Op: Name, Text: yyS[yypt-0].str}
- }
- case 61:
- //line pseudo.y:357
- {
- yyVAL.exprs = []*Expr{yyS[yypt-0].expr}
- }
- case 62:
- //line pseudo.y:361
- {
- yyVAL.exprs = []*Expr{&Expr{Op: Blank}}
- }
- case 63:
- //line pseudo.y:365
- {
- yyVAL.exprs = append(yyS[yypt-2].exprs, yyS[yypt-0].expr)
- }
- case 64:
- //line pseudo.y:369
- {
- yyVAL.exprs = append(yyS[yypt-2].exprs, &Expr{Op: Blank})
- }
- case 65:
- //line pseudo.y:375
- {
- yyVAL.expr = &Expr{Op: Const, Text: yyS[yypt-0].str}
- }
- case 66:
- //line pseudo.y:379
- {
- yyVAL.expr = &Expr{Op: Name, Text: yyS[yypt-0].str}
- }
- case 67:
- //line pseudo.y:383
- {
- yyVAL.expr = &Expr{Op: Decl, Type: yyS[yypt-1].typ, Text: yyS[yypt-0].str}
- }
- case 68:
- //line pseudo.y:387
- {
- yyVAL.expr = &Expr{Op: Unknown}
- }
- case 69:
- //line pseudo.y:391
- {
- yyVAL.expr = &Expr{Op: Unknown, Type: yyS[yypt-1].typ}
- }
- case 70:
- yyVAL.expr = yyS[yypt-0].expr
- case 71:
- //line pseudo.y:396
- {
- yyVAL.expr = &Expr{Op: ExprTuple, List: yyS[yypt-1].exprs}
- }
- case 72:
- //line pseudo.y:400
- {
- yyVAL.expr = &Expr{Op: Eq, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 73:
- //line pseudo.y:404
- {
- yyVAL.expr = &Expr{Op: NotEq, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 74:
- //line pseudo.y:408
- {
- yyVAL.expr = &Expr{Op: LtEq, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 75:
- //line pseudo.y:412
- {
- yyVAL.expr = &Expr{Op: BitIndex, X: yyS[yypt-3].expr, List: yyS[yypt-1].exprs}
- }
- case 76:
- //line pseudo.y:416
- {
- yyVAL.expr = &Expr{Op: Lt, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 77:
- //line pseudo.y:420
- {
- yyVAL.expr = &Expr{Op: GtEq, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 78:
- //line pseudo.y:424
- {
- yyVAL.expr = &Expr{Op: Gt, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 79:
- //line pseudo.y:428
- {
- yyVAL.expr = &Expr{Op: IfElse, X: yyS[yypt-4].expr, Y: yyS[yypt-2].expr, Z: yyS[yypt-0].expr}
- }
- case 80:
- //line pseudo.y:432
- {
- yyVAL.expr = &Expr{Op: Not, X: yyS[yypt-0].expr}
- }
- case 81:
- //line pseudo.y:436
- {
- yyVAL.expr = &Expr{Op: AndAnd, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 82:
- //line pseudo.y:440
- {
- yyVAL.expr = &Expr{Op: OrOr, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 83:
- //line pseudo.y:444
- {
- yyVAL.expr = &Expr{Op: Eor, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 84:
- //line pseudo.y:448
- {
- yyVAL.expr = &Expr{Op: Colon, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 85:
- //line pseudo.y:452
- {
- yyVAL.expr = &Expr{Op: BigAND, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 86:
- //line pseudo.y:456
- {
- yyVAL.expr = &Expr{Op: BigOR, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 87:
- //line pseudo.y:460
- {
- yyVAL.expr = &Expr{Op: BigEOR, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 88:
- //line pseudo.y:464
- {
- yyVAL.expr = &Expr{Op: Plus, X: yyS[yypt-0].expr}
- }
- case 89:
- //line pseudo.y:468
- {
- yyVAL.expr = &Expr{Op: Minus, X: yyS[yypt-0].expr}
- }
- case 90:
- //line pseudo.y:472
- {
- yyVAL.expr = &Expr{Op: Add, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 91:
- //line pseudo.y:476
- {
- yyVAL.expr = &Expr{Op: Sub, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 92:
- //line pseudo.y:480
- {
- yyVAL.expr = &Expr{Op: Mul, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 93:
- //line pseudo.y:484
- {
- yyVAL.expr = &Expr{Op: Div, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 94:
- //line pseudo.y:488
- {
- yyVAL.expr = &Expr{Op: BigDIV, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 95:
- //line pseudo.y:492
- {
- yyVAL.expr = &Expr{Op: BigMOD, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 96:
- //line pseudo.y:496
- {
- yyVAL.expr = &Expr{Op: TwoPow, X: yyS[yypt-0].expr}
- }
- case 97:
- //line pseudo.y:500
- {
- yyVAL.expr = &Expr{Op: Lsh, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 98:
- //line pseudo.y:504
- {
- yyVAL.expr = &Expr{Op: Rsh, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 99:
- //line pseudo.y:508
- {
- yyVAL.expr = &Expr{Op: Index, X: yyS[yypt-3].expr, List: yyS[yypt-1].exprs}
- }
- case 100:
- //line pseudo.y:512
- {
- yyVAL.expr = &Expr{Op: Dot, X: yyS[yypt-2].expr, Text: yyS[yypt-0].str}
- }
- case 101:
- //line pseudo.y:516
- {
- yyVAL.expr = &Expr{Op: Eq, X: yyS[yypt-2].expr, Y: yyS[yypt-0].expr}
- }
- case 102:
- //line pseudo.y:522
- {
- yyVAL.expr = &Expr{Op: Call, Text: yyS[yypt-2].str, List: yyS[yypt-1].exprs}
- }
- case 103:
- //line pseudo.y:528
- {
- yyVAL.typ = &Type{Op: BitType, NX: yyS[yypt-1].expr}
- }
- case 104:
- //line pseudo.y:532
- {
- yyVAL.typ = &Type{Op: BitType, N: 1}
- }
- case 105:
- //line pseudo.y:536
- {
- yyVAL.typ = &Type{Op: IntegerType}
- }
- case 106:
- //line pseudo.y:540
- {
- yyVAL.typ = &Type{Op: BoolType}
- }
- }
- goto yystack /* stack new state and value */
-}