mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-25 03:08:54 +01:00
shaderir: Add parsing expr and stmt
This commit is contained in:
parent
c75a35fd64
commit
d932787e36
@ -119,5 +119,53 @@ func (p *Program) glslBlock(b *Block, f *Func, level int) []string {
|
|||||||
lines = append(lines, fmt.Sprintf("%s%s;", idt, p.glslVarDecl(&t, fmt.Sprintf("l%d", idx))))
|
lines = append(lines, fmt.Sprintf("%s%s;", idt, p.glslVarDecl(&t, fmt.Sprintf("l%d", idx))))
|
||||||
idx++
|
idx++
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var glslExpr func(e *Expr) string
|
||||||
|
glslExpr = func(e *Expr) string {
|
||||||
|
switch e.Type {
|
||||||
|
case Literal:
|
||||||
|
return e.Value
|
||||||
|
case Ident:
|
||||||
|
return e.Value
|
||||||
|
case Unary:
|
||||||
|
return fmt.Sprintf("%s(%s)", e.Op, glslExpr(&e.Exprs[0]))
|
||||||
|
case Binary:
|
||||||
|
return fmt.Sprintf("(%s) %s (%s)", glslExpr(&e.Exprs[0]), e.Op, glslExpr(&e.Exprs[1]))
|
||||||
|
case Call:
|
||||||
|
return fmt.Sprintf("(%s).(%s)", glslExpr(&e.Exprs[0]), glslExpr(&e.Exprs[1]))
|
||||||
|
case Selector:
|
||||||
|
return fmt.Sprintf("(%s).%s", glslExpr(&e.Exprs[0]), glslExpr(&e.Exprs[1]))
|
||||||
|
case Index:
|
||||||
|
return fmt.Sprintf("(%s)[%s]", glslExpr(&e.Exprs[0]), glslExpr(&e.Exprs[1]))
|
||||||
|
default:
|
||||||
|
return fmt.Sprintf("?(unexpected expr: %d)", e.Type)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, s := range b.Stmts {
|
||||||
|
switch s.Type {
|
||||||
|
case ExprStmt:
|
||||||
|
panic("not implemented")
|
||||||
|
case BlockStmt:
|
||||||
|
lines = append(lines, idt+"{")
|
||||||
|
lines = append(lines, p.glslBlock(s.Block, f, level+1)...)
|
||||||
|
lines = append(lines, idt+"}")
|
||||||
|
case Assign:
|
||||||
|
lines = append(lines, fmt.Sprintf("%s%s = %s;", idt, glslExpr(&s.Exprs[0]), glslExpr(&s.Exprs[1])))
|
||||||
|
case If:
|
||||||
|
panic("not implemented")
|
||||||
|
case For:
|
||||||
|
panic("not implemented")
|
||||||
|
case Continue:
|
||||||
|
lines = append(lines, idt+"continue;")
|
||||||
|
case Break:
|
||||||
|
lines = append(lines, idt+"break;")
|
||||||
|
case Discard:
|
||||||
|
lines = append(lines, idt+"discard;")
|
||||||
|
default:
|
||||||
|
lines = append(lines, fmt.Sprintf("%s?(unexpected stmt: %d)", idt, s.Type))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return lines
|
return lines
|
||||||
}
|
}
|
||||||
|
@ -151,6 +151,53 @@ varying vec3 V0;`,
|
|||||||
Glsl: `void F0(in float l0, inout float l1, out float l2) {
|
Glsl: `void F0(in float l0, inout float l1, out float l2) {
|
||||||
mat4 l3;
|
mat4 l3;
|
||||||
mat4 l4;
|
mat4 l4;
|
||||||
|
}`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "FuncAdd",
|
||||||
|
Program: Program{
|
||||||
|
Funcs: []Func{
|
||||||
|
{
|
||||||
|
Name: "F0",
|
||||||
|
InParams: []Type{
|
||||||
|
{Main: Float},
|
||||||
|
{Main: Float},
|
||||||
|
},
|
||||||
|
OutParams: []Type{
|
||||||
|
{Main: Float},
|
||||||
|
},
|
||||||
|
Block: Block{
|
||||||
|
Stmts: []Stmt{
|
||||||
|
{
|
||||||
|
Type: Assign,
|
||||||
|
Exprs: []Expr{
|
||||||
|
{
|
||||||
|
Type: Ident,
|
||||||
|
Value: "l2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Type: Binary,
|
||||||
|
Op: Add,
|
||||||
|
Exprs: []Expr{
|
||||||
|
{
|
||||||
|
Type: Ident,
|
||||||
|
Value: "l0",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Type: Ident,
|
||||||
|
Value: "l1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Glsl: `void F0(in float l0, in float l1, out float l2) {
|
||||||
|
l2 = (l0) + (l1);
|
||||||
}`,
|
}`,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
@ -48,21 +48,22 @@ type Stmt struct {
|
|||||||
Type StmtType
|
Type StmtType
|
||||||
Exprs []Expr
|
Exprs []Expr
|
||||||
Condition Expr
|
Condition Expr
|
||||||
ElseStmts []Expr
|
ElseExprs []Expr
|
||||||
ForInit Expr
|
ForInit Expr
|
||||||
ForRest Expr
|
ForRest Expr
|
||||||
|
Block *Block
|
||||||
}
|
}
|
||||||
|
|
||||||
type StmtType int
|
type StmtType int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
ExprStmt StmtType = iota
|
ExprStmt StmtType = iota
|
||||||
|
BlockStmt
|
||||||
Assign
|
Assign
|
||||||
If
|
If
|
||||||
For
|
For
|
||||||
Continue
|
Continue
|
||||||
Break
|
Break
|
||||||
Return
|
|
||||||
Discard
|
Discard
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -78,7 +79,6 @@ type ExprType int
|
|||||||
const (
|
const (
|
||||||
Literal ExprType = iota
|
Literal ExprType = iota
|
||||||
Ident
|
Ident
|
||||||
LocalVarID
|
|
||||||
Unary
|
Unary
|
||||||
Binary
|
Binary
|
||||||
Call
|
Call
|
||||||
|
Loading…
Reference in New Issue
Block a user