Reduced token size

This commit is contained in:
2024-07-21 14:35:06 +02:00
parent ca36d34cb9
commit 04ba68a075
47 changed files with 543 additions and 764 deletions

View File

@ -6,13 +6,8 @@ import (
"git.akyoto.dev/cli/q/src/build/token"
)
var (
call = []byte("λ")
array = []byte("@")
)
// Parse generates an expression tree from tokens.
func Parse(tokens token.List) *Expression {
func Parse(tokens []token.Token) *Expression {
var (
cursor *Expression
root *Expression
@ -43,20 +38,18 @@ func Parse(tokens token.List) *Expression {
parameters := NewList(tokens[groupPosition:i])
node := New()
node.Token.Kind = token.Operator
node.Token.Position = tokens[groupPosition].Position
switch t.Kind {
case token.GroupEnd:
node.Token.Bytes = call
node.Precedence = precedence("λ")
node.Token.Kind = token.Call
case token.ArrayEnd:
node.Token.Bytes = array
node.Precedence = precedence("@")
node.Token.Kind = token.Array
}
if cursor.Token.Kind == token.Operator && node.Precedence > cursor.Precedence {
node.Precedence = precedence(node.Token.Kind)
if cursor.Token.IsOperator() && node.Precedence > cursor.Precedence {
cursor.LastChild().Replace(node)
} else {
if cursor == root {
@ -108,18 +101,18 @@ func Parse(tokens token.List) *Expression {
continue
}
if t.Kind == token.Operator {
if t.IsOperator() {
if cursor == nil {
cursor = NewLeaf(t)
cursor.Precedence = precedence(t.Text())
cursor.Precedence = precedence(t.Kind)
root = cursor
continue
}
node := NewLeaf(t)
node.Precedence = precedence(t.Text())
node.Precedence = precedence(t.Kind)
if cursor.Token.Kind == token.Operator {
if cursor.Token.IsOperator() {
oldPrecedence := cursor.Precedence
newPrecedence := node.Precedence