feat/schema: add ast and test
This commit is contained in:
@@ -2,6 +2,11 @@
|
||||
|
||||
package parser
|
||||
|
||||
import (
|
||||
"azalea/schema/ast"
|
||||
"azalea/schema/token"
|
||||
)
|
||||
|
||||
type (
|
||||
ProdTab [numProductions]ProdTabEntry
|
||||
ProdTabEntry struct {
|
||||
@@ -38,123 +43,123 @@ var productionsTable = ProdTab{
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `ExprList : Expr << >>`,
|
||||
String: `ExprList : Expr << ast.NewExprList(X[0]) >>`,
|
||||
Id: "ExprList",
|
||||
NTType: 2,
|
||||
Index: 2,
|
||||
NumSymbols: 1,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
return ast.NewExprList(X[0])
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `ExprList : ExprList Expr << >>`,
|
||||
String: `ExprList : ExprList Expr << ast.AppendExpr(X[0], X[1]) >>`,
|
||||
Id: "ExprList",
|
||||
NTType: 2,
|
||||
Index: 3,
|
||||
NumSymbols: 2,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
return ast.AppendExpr(X[0], X[1])
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `ValList : Val << >>`,
|
||||
String: `ValList : Val << ast.NewValList(X[0]) >>`,
|
||||
Id: "ValList",
|
||||
NTType: 3,
|
||||
Index: 4,
|
||||
NumSymbols: 1,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
return ast.NewValList(X[0])
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `ValList : ValList Val << >>`,
|
||||
String: `ValList : ValList Val << ast.AppendVal(X[0], X[1]) >>`,
|
||||
Id: "ValList",
|
||||
NTType: 3,
|
||||
Index: 5,
|
||||
NumSymbols: 2,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
return ast.AppendVal(X[0], X[1])
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `Val : string << >>`,
|
||||
String: `Val : string << ast.NewStringVal(X[0].(*token.Token)) >>`,
|
||||
Id: "Val",
|
||||
NTType: 4,
|
||||
Index: 6,
|
||||
NumSymbols: 1,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
return ast.NewStringVal(X[0].(*token.Token))
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `Val : number << >>`,
|
||||
String: `Val : number << ast.NewNumberVal(X[0].(*token.Token)) >>`,
|
||||
Id: "Val",
|
||||
NTType: 4,
|
||||
Index: 7,
|
||||
NumSymbols: 1,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
return ast.NewNumberVal(X[0].(*token.Token))
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `Val : name << >>`,
|
||||
String: `Val : name << ast.NewNameVal(X[0].(*token.Token)) >>`,
|
||||
Id: "Val",
|
||||
NTType: 4,
|
||||
Index: 8,
|
||||
NumSymbols: 1,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
return ast.NewNameVal(X[0].(*token.Token))
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `Val : Expr << >>`,
|
||||
String: `Val : Expr << ast.NewExprVal(X[0]) >>`,
|
||||
Id: "Val",
|
||||
NTType: 4,
|
||||
Index: 9,
|
||||
NumSymbols: 1,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
return ast.NewExprVal(X[0])
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `Expr : "(" name Val Val ")" << >>`,
|
||||
String: `Expr : "(" name Val Val ")" << ast.NewExpr(X[1].(*token.Token), X[2], X[3]) >>`,
|
||||
Id: "Expr",
|
||||
NTType: 5,
|
||||
Index: 10,
|
||||
NumSymbols: 5,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
return ast.NewExpr(X[1].(*token.Token), X[2], X[3])
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `Expr : "(" name Val ")" << >>`,
|
||||
String: `Expr : "(" name Val ")" << ast.NewExpr(X[1].(*token.Token), X[2], nil) >>`,
|
||||
Id: "Expr",
|
||||
NTType: 5,
|
||||
Index: 11,
|
||||
NumSymbols: 4,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
return ast.NewExpr(X[1].(*token.Token), X[2], nil)
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `Expr : "(" name ")" << >>`,
|
||||
String: `Expr : "(" name ")" << ast.NewExpr(X[1].(*token.Token), nil, nil) >>`,
|
||||
Id: "Expr",
|
||||
NTType: 5,
|
||||
Index: 12,
|
||||
NumSymbols: 3,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
return ast.NewExpr(X[1].(*token.Token), nil, nil)
|
||||
},
|
||||
},
|
||||
ProdTabEntry{
|
||||
String: `Expr : "(" "." ValList ")" << >>`,
|
||||
String: `Expr : "(" "." ValList ")" << ast.ListExpr(X[2]) >>`,
|
||||
Id: "Expr",
|
||||
NTType: 5,
|
||||
Index: 13,
|
||||
NumSymbols: 4,
|
||||
ReduceFunc: func(X []Attrib, C interface{}) (Attrib, error) {
|
||||
return X[0], nil
|
||||
return ast.ListExpr(X[2])
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user