Improved performance

This commit is contained in:
2024-08-01 23:41:39 +02:00
parent 3c70529015
commit 778c125d19
10 changed files with 112 additions and 124 deletions

View File

@ -101,63 +101,64 @@ func Parse(tokens []token.Token) *Expression {
continue
}
if t.IsOperator() {
if cursor == nil {
cursor = NewLeaf(t)
cursor.Precedence = precedence(t.Kind)
root = cursor
continue
}
node := NewLeaf(t)
node.Precedence = precedence(t.Kind)
if cursor.Token.IsOperator() {
oldPrecedence := cursor.Precedence
newPrecedence := node.Precedence
if newPrecedence > oldPrecedence {
if len(cursor.Children) == numOperands(cursor.Token.Kind) {
cursor.LastChild().Replace(node)
} else {
cursor.AddChild(node)
}
} else {
start := cursor
for start != nil {
precedence := start.Precedence
if precedence < newPrecedence {
start.LastChild().Replace(node)
break
}
if precedence == newPrecedence {
if start == root {
root = node
}
start.Replace(node)
break
}
start = start.Parent
}
if start == nil {
root.Replace(node)
root = node
}
}
} else {
node.AddChild(cursor)
root = node
}
cursor = node
if !t.IsOperator() {
continue
}
if cursor == nil {
cursor = NewLeaf(t)
cursor.Precedence = precedence(t.Kind)
root = cursor
continue
}
node := NewLeaf(t)
node.Precedence = precedence(t.Kind)
if cursor.Token.IsOperator() {
oldPrecedence := cursor.Precedence
newPrecedence := node.Precedence
if newPrecedence > oldPrecedence {
if len(cursor.Children) == numOperands(cursor.Token.Kind) {
cursor.LastChild().Replace(node)
} else {
cursor.AddChild(node)
}
} else {
start := cursor
for start != nil {
precedence := start.Precedence
if precedence < newPrecedence {
start.LastChild().Replace(node)
break
}
if precedence == newPrecedence {
if start == root {
root = node
}
start.Replace(node)
break
}
start = start.Parent
}
if start == nil {
root.Replace(node)
root = node
}
}
} else {
node.AddChild(cursor)
root = node
}
cursor = node
}
return root