50 lines
885 B
Go
50 lines
885 B
Go
|
package parser
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
)
|
||
|
|
||
|
type action interface {
|
||
|
act()
|
||
|
String() string
|
||
|
}
|
||
|
|
||
|
type (
|
||
|
accept bool
|
||
|
shift int // value is next state index
|
||
|
reduce int // value is production index
|
||
|
)
|
||
|
|
||
|
func (this accept) act() {}
|
||
|
func (this shift) act() {}
|
||
|
func (this reduce) act() {}
|
||
|
|
||
|
func (this accept) Equal(that action) bool {
|
||
|
if _, ok := that.(accept); ok {
|
||
|
return true
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
func (this reduce) Equal(that action) bool {
|
||
|
that1, ok := that.(reduce)
|
||
|
if !ok {
|
||
|
return false
|
||
|
}
|
||
|
return this == that1
|
||
|
}
|
||
|
|
||
|
func (this shift) Equal(that action) bool {
|
||
|
that1, ok := that.(shift)
|
||
|
if !ok {
|
||
|
return false
|
||
|
}
|
||
|
return this == that1
|
||
|
}
|
||
|
|
||
|
func (this accept) String() string { return "accept(0)" }
|
||
|
func (this shift) String() string { return fmt.Sprintf("shift:%d", this) }
|
||
|
func (this reduce) String() string {
|
||
|
return fmt.Sprintf("reduce:%d(%s)", this, productionsTable[this].String)
|
||
|
}
|