feat/schema: add ast and test

This commit is contained in:
mae
2026-01-27 21:57:38 -06:00
parent 5f9467e851
commit 1fd09335cd
9 changed files with 198 additions and 492 deletions

View File

@@ -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])
},
},
}