Simplified constant folding
This commit is contained in:
parent
ebe53b3b50
commit
bbf2970c4e
@ -17,31 +17,11 @@ func (f *Function) Fold(expr *expression.Expression) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if expr.IsLeaf() {
|
if expr.IsLeaf() {
|
||||||
if expr.Token.IsNumeric() {
|
return f.FoldLeaf(expr)
|
||||||
value, err := f.ToNumber(expr.Token)
|
|
||||||
expr.Value = value
|
|
||||||
expr.IsFolded = true
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if expr.Token.Kind == token.Period {
|
if expr.Token.Kind == token.Period {
|
||||||
left := expr.Children[0]
|
return f.FoldConstant(expr)
|
||||||
leftText := left.Token.Text(f.File.Bytes)
|
|
||||||
right := expr.Children[1]
|
|
||||||
rightText := right.Token.Text(f.File.Bytes)
|
|
||||||
constant, isConst := f.All.Constants[f.Package+"."+leftText+"."+rightText]
|
|
||||||
|
|
||||||
if !isConst {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
value, err := ToNumber(constant.Token, constant.File)
|
|
||||||
expr.Value = value
|
|
||||||
expr.IsFolded = true
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
canFold := true
|
canFold := true
|
||||||
|
23
src/core/FoldConstant.go
Normal file
23
src/core/FoldConstant.go
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.urbach.dev/cli/q/src/expression"
|
||||||
|
)
|
||||||
|
|
||||||
|
// FoldConstant tries to find a constant that can be folded.
|
||||||
|
func (f *Function) FoldConstant(expr *expression.Expression) error {
|
||||||
|
left := expr.Children[0]
|
||||||
|
right := expr.Children[1]
|
||||||
|
leftText := left.Token.Text(f.File.Bytes)
|
||||||
|
rightText := right.Token.Text(f.File.Bytes)
|
||||||
|
constant, exists := f.All.Constants[f.Package+"."+leftText+"."+rightText]
|
||||||
|
|
||||||
|
if !exists {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
value, err := ToNumber(constant.Token, constant.File)
|
||||||
|
expr.Value = value
|
||||||
|
expr.IsFolded = true
|
||||||
|
return err
|
||||||
|
}
|
17
src/core/FoldLeaf.go
Normal file
17
src/core/FoldLeaf.go
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.urbach.dev/cli/q/src/expression"
|
||||||
|
)
|
||||||
|
|
||||||
|
// FoldLeaf tries to fold a leaf expression.
|
||||||
|
func (f *Function) FoldLeaf(expr *expression.Expression) error {
|
||||||
|
if !expr.Token.IsNumeric() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
value, err := f.ToNumber(expr.Token)
|
||||||
|
expr.Value = value
|
||||||
|
expr.IsFolded = true
|
||||||
|
return err
|
||||||
|
}
|
@ -11,9 +11,8 @@ type Expression struct {
|
|||||||
Parent *Expression
|
Parent *Expression
|
||||||
Children []*Expression
|
Children []*Expression
|
||||||
Token token.Token
|
Token token.Token
|
||||||
Value int
|
|
||||||
Precedence int8
|
Precedence int8
|
||||||
IsFolded bool
|
Foldable
|
||||||
}
|
}
|
||||||
|
|
||||||
// New creates a new expression.
|
// New creates a new expression.
|
||||||
@ -62,8 +61,8 @@ func (expr *Expression) Reset() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
expr.Token.Reset()
|
expr.Token.Reset()
|
||||||
expr.Value = 0
|
|
||||||
expr.Precedence = 0
|
expr.Precedence = 0
|
||||||
|
expr.Value = 0
|
||||||
expr.IsFolded = false
|
expr.IsFolded = false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
7
src/expression/Foldable.go
Normal file
7
src/expression/Foldable.go
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package expression
|
||||||
|
|
||||||
|
// Foldable has optional fields that are used for constant folding later.
|
||||||
|
type Foldable struct {
|
||||||
|
Value int
|
||||||
|
IsFolded bool
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user