feat/schema: add parser
This commit is contained in:
51
schema/parser/action.go
Normal file
51
schema/parser/action.go
Normal file
@@ -0,0 +1,51 @@
|
||||
// Code generated by gocc; DO NOT EDIT.
|
||||
|
||||
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)
|
||||
}
|
||||
599
schema/parser/actiontable.go
Normal file
599
schema/parser/actiontable.go
Normal file
@@ -0,0 +1,599 @@
|
||||
// Code generated by gocc; DO NOT EDIT.
|
||||
|
||||
package parser
|
||||
|
||||
type (
|
||||
actionTable [numStates]actionRow
|
||||
actionRow struct {
|
||||
canRecover bool
|
||||
actions [numSymbols]action
|
||||
}
|
||||
)
|
||||
|
||||
var actionTab = actionTable{
|
||||
actionRow{ // S0
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
shift(4), // (
|
||||
nil, // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S1
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
accept(true), // ␚
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
nil, // (
|
||||
nil, // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S2
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
reduce(1), // ␚, reduce: Schema
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
shift(4), // (
|
||||
nil, // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S3
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
reduce(2), // ␚, reduce: ExprList
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
reduce(2), // (, reduce: ExprList
|
||||
nil, // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S4
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
nil, // string
|
||||
nil, // number
|
||||
shift(6), // name
|
||||
nil, // (
|
||||
nil, // )
|
||||
shift(7), // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S5
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
reduce(3), // ␚, reduce: ExprList
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
reduce(3), // (, reduce: ExprList
|
||||
nil, // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S6
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
shift(10), // string
|
||||
shift(11), // number
|
||||
shift(12), // name
|
||||
shift(13), // (
|
||||
shift(14), // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S7
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
shift(10), // string
|
||||
shift(11), // number
|
||||
shift(12), // name
|
||||
shift(13), // (
|
||||
nil, // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S8
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
reduce(9), // string, reduce: Val
|
||||
reduce(9), // number, reduce: Val
|
||||
reduce(9), // name, reduce: Val
|
||||
reduce(9), // (, reduce: Val
|
||||
reduce(9), // ), reduce: Val
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S9
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
shift(19), // string
|
||||
shift(20), // number
|
||||
shift(21), // name
|
||||
shift(22), // (
|
||||
shift(23), // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S10
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
reduce(6), // string, reduce: Val
|
||||
reduce(6), // number, reduce: Val
|
||||
reduce(6), // name, reduce: Val
|
||||
reduce(6), // (, reduce: Val
|
||||
reduce(6), // ), reduce: Val
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S11
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
reduce(7), // string, reduce: Val
|
||||
reduce(7), // number, reduce: Val
|
||||
reduce(7), // name, reduce: Val
|
||||
reduce(7), // (, reduce: Val
|
||||
reduce(7), // ), reduce: Val
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S12
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
reduce(8), // string, reduce: Val
|
||||
reduce(8), // number, reduce: Val
|
||||
reduce(8), // name, reduce: Val
|
||||
reduce(8), // (, reduce: Val
|
||||
reduce(8), // ), reduce: Val
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S13
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
nil, // string
|
||||
nil, // number
|
||||
shift(24), // name
|
||||
nil, // (
|
||||
nil, // )
|
||||
shift(25), // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S14
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
reduce(12), // ␚, reduce: Expr
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
reduce(12), // (, reduce: Expr
|
||||
nil, // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S15
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
shift(10), // string
|
||||
shift(11), // number
|
||||
shift(12), // name
|
||||
shift(13), // (
|
||||
shift(27), // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S16
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
reduce(4), // string, reduce: ValList
|
||||
reduce(4), // number, reduce: ValList
|
||||
reduce(4), // name, reduce: ValList
|
||||
reduce(4), // (, reduce: ValList
|
||||
reduce(4), // ), reduce: ValList
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S17
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
nil, // (
|
||||
reduce(9), // ), reduce: Val
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S18
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
nil, // (
|
||||
shift(28), // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S19
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
nil, // (
|
||||
reduce(6), // ), reduce: Val
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S20
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
nil, // (
|
||||
reduce(7), // ), reduce: Val
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S21
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
nil, // (
|
||||
reduce(8), // ), reduce: Val
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S22
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
nil, // string
|
||||
nil, // number
|
||||
shift(29), // name
|
||||
nil, // (
|
||||
nil, // )
|
||||
shift(30), // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S23
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
reduce(11), // ␚, reduce: Expr
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
reduce(11), // (, reduce: Expr
|
||||
nil, // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S24
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
shift(10), // string
|
||||
shift(11), // number
|
||||
shift(12), // name
|
||||
shift(13), // (
|
||||
shift(32), // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S25
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
shift(10), // string
|
||||
shift(11), // number
|
||||
shift(12), // name
|
||||
shift(13), // (
|
||||
nil, // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S26
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
reduce(5), // string, reduce: ValList
|
||||
reduce(5), // number, reduce: ValList
|
||||
reduce(5), // name, reduce: ValList
|
||||
reduce(5), // (, reduce: ValList
|
||||
reduce(5), // ), reduce: ValList
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S27
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
reduce(13), // ␚, reduce: Expr
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
reduce(13), // (, reduce: Expr
|
||||
nil, // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S28
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
reduce(10), // ␚, reduce: Expr
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
reduce(10), // (, reduce: Expr
|
||||
nil, // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S29
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
shift(10), // string
|
||||
shift(11), // number
|
||||
shift(12), // name
|
||||
shift(13), // (
|
||||
shift(35), // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S30
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
shift(10), // string
|
||||
shift(11), // number
|
||||
shift(12), // name
|
||||
shift(13), // (
|
||||
nil, // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S31
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
shift(19), // string
|
||||
shift(20), // number
|
||||
shift(21), // name
|
||||
shift(22), // (
|
||||
shift(38), // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S32
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
reduce(12), // string, reduce: Expr
|
||||
reduce(12), // number, reduce: Expr
|
||||
reduce(12), // name, reduce: Expr
|
||||
reduce(12), // (, reduce: Expr
|
||||
reduce(12), // ), reduce: Expr
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S33
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
shift(10), // string
|
||||
shift(11), // number
|
||||
shift(12), // name
|
||||
shift(13), // (
|
||||
shift(39), // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S34
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
shift(19), // string
|
||||
shift(20), // number
|
||||
shift(21), // name
|
||||
shift(22), // (
|
||||
shift(41), // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S35
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
nil, // (
|
||||
reduce(12), // ), reduce: Expr
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S36
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
shift(10), // string
|
||||
shift(11), // number
|
||||
shift(12), // name
|
||||
shift(13), // (
|
||||
shift(42), // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S37
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
nil, // (
|
||||
shift(43), // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S38
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
reduce(11), // string, reduce: Expr
|
||||
reduce(11), // number, reduce: Expr
|
||||
reduce(11), // name, reduce: Expr
|
||||
reduce(11), // (, reduce: Expr
|
||||
reduce(11), // ), reduce: Expr
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S39
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
reduce(13), // string, reduce: Expr
|
||||
reduce(13), // number, reduce: Expr
|
||||
reduce(13), // name, reduce: Expr
|
||||
reduce(13), // (, reduce: Expr
|
||||
reduce(13), // ), reduce: Expr
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S40
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
nil, // (
|
||||
shift(44), // )
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S41
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
nil, // (
|
||||
reduce(11), // ), reduce: Expr
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S42
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
nil, // (
|
||||
reduce(13), // ), reduce: Expr
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S43
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
reduce(10), // string, reduce: Expr
|
||||
reduce(10), // number, reduce: Expr
|
||||
reduce(10), // name, reduce: Expr
|
||||
reduce(10), // (, reduce: Expr
|
||||
reduce(10), // ), reduce: Expr
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
actionRow{ // S44
|
||||
canRecover: false,
|
||||
actions: [numSymbols]action{
|
||||
nil, // INVALID
|
||||
nil, // ␚
|
||||
nil, // string
|
||||
nil, // number
|
||||
nil, // name
|
||||
nil, // (
|
||||
reduce(10), // ), reduce: Expr
|
||||
nil, // .
|
||||
},
|
||||
},
|
||||
}
|
||||
7
schema/parser/context.go
Normal file
7
schema/parser/context.go
Normal file
@@ -0,0 +1,7 @@
|
||||
// Code generated by gocc; DO NOT EDIT.
|
||||
|
||||
package parser
|
||||
|
||||
// Parser-specific user-defined and entirely-optional context,
|
||||
// accessible as '$Context' in SDT actions.
|
||||
type Context interface{}
|
||||
373
schema/parser/gototable.go
Normal file
373
schema/parser/gototable.go
Normal file
@@ -0,0 +1,373 @@
|
||||
// Code generated by gocc; DO NOT EDIT.
|
||||
|
||||
package parser
|
||||
|
||||
const numNTSymbols = 6
|
||||
|
||||
type (
|
||||
gotoTable [numStates]gotoRow
|
||||
gotoRow [numNTSymbols]int
|
||||
)
|
||||
|
||||
var gotoTab = gotoTable{
|
||||
gotoRow{ // S0
|
||||
-1, // S'
|
||||
1, // Schema
|
||||
2, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
3, // Expr
|
||||
},
|
||||
gotoRow{ // S1
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S2
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
5, // Expr
|
||||
},
|
||||
gotoRow{ // S3
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S4
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S5
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S6
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
9, // Val
|
||||
8, // Expr
|
||||
},
|
||||
gotoRow{ // S7
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
15, // ValList
|
||||
16, // Val
|
||||
8, // Expr
|
||||
},
|
||||
gotoRow{ // S8
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S9
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
18, // Val
|
||||
17, // Expr
|
||||
},
|
||||
gotoRow{ // S10
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S11
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S12
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S13
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S14
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S15
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
26, // Val
|
||||
8, // Expr
|
||||
},
|
||||
gotoRow{ // S16
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S17
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S18
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S19
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S20
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S21
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S22
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S23
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S24
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
31, // Val
|
||||
8, // Expr
|
||||
},
|
||||
gotoRow{ // S25
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
33, // ValList
|
||||
16, // Val
|
||||
8, // Expr
|
||||
},
|
||||
gotoRow{ // S26
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S27
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S28
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S29
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
34, // Val
|
||||
8, // Expr
|
||||
},
|
||||
gotoRow{ // S30
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
36, // ValList
|
||||
16, // Val
|
||||
8, // Expr
|
||||
},
|
||||
gotoRow{ // S31
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
37, // Val
|
||||
17, // Expr
|
||||
},
|
||||
gotoRow{ // S32
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S33
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
26, // Val
|
||||
8, // Expr
|
||||
},
|
||||
gotoRow{ // S34
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
40, // Val
|
||||
17, // Expr
|
||||
},
|
||||
gotoRow{ // S35
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S36
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
26, // Val
|
||||
8, // Expr
|
||||
},
|
||||
gotoRow{ // S37
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S38
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S39
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S40
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S41
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S42
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S43
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
gotoRow{ // S44
|
||||
-1, // S'
|
||||
-1, // Schema
|
||||
-1, // ExprList
|
||||
-1, // ValList
|
||||
-1, // Val
|
||||
-1, // Expr
|
||||
},
|
||||
}
|
||||
217
schema/parser/parser.go
Normal file
217
schema/parser/parser.go
Normal file
@@ -0,0 +1,217 @@
|
||||
// Code generated by gocc; DO NOT EDIT.
|
||||
|
||||
package parser
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
parseError "azalea/schema/errors"
|
||||
"azalea/schema/token"
|
||||
)
|
||||
|
||||
const (
|
||||
numProductions = 14
|
||||
numStates = 45
|
||||
numSymbols = 14
|
||||
)
|
||||
|
||||
// Stack
|
||||
|
||||
type stack struct {
|
||||
state []int
|
||||
attrib []Attrib
|
||||
}
|
||||
|
||||
const iNITIAL_STACK_SIZE = 100
|
||||
|
||||
func newStack() *stack {
|
||||
return &stack{
|
||||
state: make([]int, 0, iNITIAL_STACK_SIZE),
|
||||
attrib: make([]Attrib, 0, iNITIAL_STACK_SIZE),
|
||||
}
|
||||
}
|
||||
|
||||
func (s *stack) reset() {
|
||||
s.state = s.state[:0]
|
||||
s.attrib = s.attrib[:0]
|
||||
}
|
||||
|
||||
func (s *stack) push(state int, a Attrib) {
|
||||
s.state = append(s.state, state)
|
||||
s.attrib = append(s.attrib, a)
|
||||
}
|
||||
|
||||
func (s *stack) top() int {
|
||||
return s.state[len(s.state)-1]
|
||||
}
|
||||
|
||||
func (s *stack) peek(pos int) int {
|
||||
return s.state[pos]
|
||||
}
|
||||
|
||||
func (s *stack) topIndex() int {
|
||||
return len(s.state) - 1
|
||||
}
|
||||
|
||||
func (s *stack) popN(items int) []Attrib {
|
||||
lo, hi := len(s.state)-items, len(s.state)
|
||||
|
||||
attrib := s.attrib[lo:hi]
|
||||
|
||||
s.state = s.state[:lo]
|
||||
s.attrib = s.attrib[:lo]
|
||||
|
||||
return attrib
|
||||
}
|
||||
|
||||
func (s *stack) String() string {
|
||||
w := new(strings.Builder)
|
||||
fmt.Fprintf(w, "stack:\n")
|
||||
for i, st := range s.state {
|
||||
fmt.Fprintf(w, "\t%d: %d , ", i, st)
|
||||
if s.attrib[i] == nil {
|
||||
fmt.Fprintf(w, "nil")
|
||||
} else {
|
||||
switch attr := s.attrib[i].(type) {
|
||||
case *token.Token:
|
||||
fmt.Fprintf(w, "%s", attr.Lit)
|
||||
default:
|
||||
fmt.Fprintf(w, "%v", attr)
|
||||
}
|
||||
}
|
||||
fmt.Fprintf(w, "\n")
|
||||
}
|
||||
return w.String()
|
||||
}
|
||||
|
||||
// Parser
|
||||
|
||||
type Parser struct {
|
||||
stack *stack
|
||||
nextToken *token.Token
|
||||
pos int
|
||||
Context Context
|
||||
}
|
||||
|
||||
type Scanner interface {
|
||||
Scan() (tok *token.Token)
|
||||
}
|
||||
|
||||
func NewParser() *Parser {
|
||||
p := &Parser{stack: newStack()}
|
||||
p.Reset()
|
||||
return p
|
||||
}
|
||||
|
||||
func (p *Parser) Reset() {
|
||||
p.stack.reset()
|
||||
p.stack.push(0, nil)
|
||||
}
|
||||
|
||||
func (p *Parser) Error(err error, scanner Scanner) (recovered bool, errorAttrib *parseError.Error) {
|
||||
errorAttrib = &parseError.Error{
|
||||
Err: err,
|
||||
ErrorToken: p.nextToken,
|
||||
ErrorSymbols: p.popNonRecoveryStates(),
|
||||
ExpectedTokens: make([]string, 0, 8),
|
||||
}
|
||||
for t, action := range actionTab[p.stack.top()].actions {
|
||||
if action != nil {
|
||||
errorAttrib.ExpectedTokens = append(errorAttrib.ExpectedTokens, token.TokMap.Id(token.Type(t)))
|
||||
}
|
||||
}
|
||||
|
||||
if action := actionTab[p.stack.top()].actions[token.TokMap.Type("error")]; action != nil {
|
||||
p.stack.push(int(action.(shift)), errorAttrib) // action can only be shift
|
||||
} else {
|
||||
return
|
||||
}
|
||||
|
||||
if action := actionTab[p.stack.top()].actions[p.nextToken.Type]; action != nil {
|
||||
recovered = true
|
||||
}
|
||||
for !recovered && p.nextToken.Type != token.EOF {
|
||||
p.nextToken = scanner.Scan()
|
||||
if action := actionTab[p.stack.top()].actions[p.nextToken.Type]; action != nil {
|
||||
recovered = true
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (p *Parser) popNonRecoveryStates() (removedAttribs []parseError.ErrorSymbol) {
|
||||
if rs, ok := p.firstRecoveryState(); ok {
|
||||
errorSymbols := p.stack.popN(p.stack.topIndex() - rs)
|
||||
removedAttribs = make([]parseError.ErrorSymbol, len(errorSymbols))
|
||||
for i, e := range errorSymbols {
|
||||
removedAttribs[i] = e
|
||||
}
|
||||
} else {
|
||||
removedAttribs = []parseError.ErrorSymbol{}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// recoveryState points to the highest state on the stack, which can recover
|
||||
func (p *Parser) firstRecoveryState() (recoveryState int, canRecover bool) {
|
||||
recoveryState, canRecover = p.stack.topIndex(), actionTab[p.stack.top()].canRecover
|
||||
for recoveryState > 0 && !canRecover {
|
||||
recoveryState--
|
||||
canRecover = actionTab[p.stack.peek(recoveryState)].canRecover
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (p *Parser) newError(err error) error {
|
||||
e := &parseError.Error{
|
||||
Err: err,
|
||||
StackTop: p.stack.top(),
|
||||
ErrorToken: p.nextToken,
|
||||
}
|
||||
actRow := actionTab[p.stack.top()]
|
||||
for i, t := range actRow.actions {
|
||||
if t != nil {
|
||||
e.ExpectedTokens = append(e.ExpectedTokens, token.TokMap.Id(token.Type(i)))
|
||||
}
|
||||
}
|
||||
return e
|
||||
}
|
||||
|
||||
func (p *Parser) Parse(scanner Scanner) (res interface{}, err error) {
|
||||
p.Reset()
|
||||
p.nextToken = scanner.Scan()
|
||||
for acc := false; !acc; {
|
||||
action := actionTab[p.stack.top()].actions[p.nextToken.Type]
|
||||
if action == nil {
|
||||
if recovered, errAttrib := p.Error(nil, scanner); !recovered {
|
||||
p.nextToken = errAttrib.ErrorToken
|
||||
return nil, p.newError(nil)
|
||||
}
|
||||
if action = actionTab[p.stack.top()].actions[p.nextToken.Type]; action == nil {
|
||||
panic("Error recovery led to invalid action")
|
||||
}
|
||||
}
|
||||
|
||||
switch act := action.(type) {
|
||||
case accept:
|
||||
res = p.stack.popN(1)[0]
|
||||
acc = true
|
||||
case shift:
|
||||
p.stack.push(int(act), p.nextToken)
|
||||
p.nextToken = scanner.Scan()
|
||||
case reduce:
|
||||
prod := productionsTable[int(act)]
|
||||
attrib, err := prod.ReduceFunc(p.stack.popN(prod.NumSymbols), p.Context)
|
||||
if err != nil {
|
||||
return nil, p.newError(err)
|
||||
} else {
|
||||
p.stack.push(gotoTab[p.stack.top()][prod.NTType], attrib)
|
||||
}
|
||||
default:
|
||||
panic("unknown action: " + action.String())
|
||||
}
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
160
schema/parser/productionstable.go
Normal file
160
schema/parser/productionstable.go
Normal file
@@ -0,0 +1,160 @@
|
||||
// Code generated by gocc; DO NOT EDIT.
|
||||
|
||||
package parser
|
||||
|
||||
type (
|
||||
ProdTab [numProductions]ProdTabEntry
|
||||
ProdTabEntry struct {
|
||||
String string
|
||||
Id string
|
||||
NTType int
|
||||
Index int
|
||||
NumSymbols int
|
||||
ReduceFunc func([]Attrib, interface{}) (Attrib, error)
|
||||
}
|
||||
Attrib interface {
|
||||
}
|
||||
)
|
||||
|
||||
var productionsTable = ProdTab{
|
||||
ProdTabEntry{
|
||||
String: `S' : Schema << >>`,
|
||||
Id: "S'",
|
||||
NTType: 0,
|
||||
Index: 0,
|
||||
NumSymbols: 1,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `Schema : ExprList << >>`,
|
||||
Id: "Schema",
|
||||
NTType: 1,
|
||||
Index: 1,
|
||||
NumSymbols: 1,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `ExprList : Expr << >>`,
|
||||
Id: "ExprList",
|
||||
NTType: 2,
|
||||
Index: 2,
|
||||
NumSymbols: 1,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `ExprList : ExprList Expr << >>`,
|
||||
Id: "ExprList",
|
||||
NTType: 2,
|
||||
Index: 3,
|
||||
NumSymbols: 2,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `ValList : Val << >>`,
|
||||
Id: "ValList",
|
||||
NTType: 3,
|
||||
Index: 4,
|
||||
NumSymbols: 1,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `ValList : ValList Val << >>`,
|
||||
Id: "ValList",
|
||||
NTType: 3,
|
||||
Index: 5,
|
||||
NumSymbols: 2,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `Val : string << >>`,
|
||||
Id: "Val",
|
||||
NTType: 4,
|
||||
Index: 6,
|
||||
NumSymbols: 1,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `Val : number << >>`,
|
||||
Id: "Val",
|
||||
NTType: 4,
|
||||
Index: 7,
|
||||
NumSymbols: 1,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `Val : name << >>`,
|
||||
Id: "Val",
|
||||
NTType: 4,
|
||||
Index: 8,
|
||||
NumSymbols: 1,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `Val : Expr << >>`,
|
||||
Id: "Val",
|
||||
NTType: 4,
|
||||
Index: 9,
|
||||
NumSymbols: 1,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `Expr : "(" name Val Val ")" << >>`,
|
||||
Id: "Expr",
|
||||
NTType: 5,
|
||||
Index: 10,
|
||||
NumSymbols: 5,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `Expr : "(" name Val ")" << >>`,
|
||||
Id: "Expr",
|
||||
NTType: 5,
|
||||
Index: 11,
|
||||
NumSymbols: 4,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `Expr : "(" name ")" << >>`,
|
||||
Id: "Expr",
|
||||
NTType: 5,
|
||||
Index: 12,
|
||||
NumSymbols: 3,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `Expr : "(" "." ValList ")" << >>`,
|
||||
Id: "Expr",
|
||||
NTType: 5,
|
||||
Index: 13,
|
||||
NumSymbols: 4,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
},
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user