Compare commits

...

2 Commits

Author SHA1 Message Date
45dad474e0 fix some function stuff 2025-03-03 14:36:25 +01:00
6425cd3b55 fixed some bugs 2025-02-28 13:06:10 +01:00
9 changed files with 57 additions and 21 deletions

View File

@ -173,9 +173,12 @@ func (be *BinaryExpression) String() string {
}
type BlockExpression struct {
Token token.Token // The '{'
Expressions []Expression
ReturnExpression Expression // A expression that does not end with a semicolon, there can only be one of those and it hast to be at the end
Token token.Token // The '{'
Expressions []Expression
// NOTE: Nullable
//
// A expression that does not end with a semicolon, there can only be one of those and it has to be at the end
ReturnExpression Expression
}
func (be *BlockExpression) expressionNode() {}

View File

@ -47,7 +47,7 @@ func (sp *SourceProgram) Build(backend asm.Backend, emitAsmOnly bool, toPrint To
id := 0
addRootNode := func(task task) int {
l.Debugf("registering root task %d", id)
l.Debugf("registering root task %d %q", id, task.Name())
node := &node{task: task}
nodes[id] = node
rootNodes = append(rootNodes, id)
@ -56,7 +56,7 @@ func (sp *SourceProgram) Build(backend asm.Backend, emitAsmOnly bool, toPrint To
}
addNode := func(task task, deps ...int) int {
l.Debugf("registering task %d", id)
l.Debugf("registering task %d %q", id, task.Name())
if len(deps) <= 0 {
panic("node without dep is useless")
}

View File

@ -6,6 +6,7 @@ import (
"io"
"os"
"os/exec"
"runtime/debug"
"slices"
"strings"
@ -149,7 +150,7 @@ func build(outputWriter io.Writer, input string, output string, toPrint ToPrintF
defer func() {
if panicErr := recover(); panicErr != nil {
err = fmt.Errorf("panic in build: %#v", panicErr)
err = fmt.Errorf("panic in build: %#v\n%s", panicErr, debug.Stack())
}
}()
@ -259,8 +260,8 @@ func runTasks(nodes map[int]*node, rootNodes []int, l *utils.Logger) error {
if done[id] != notStarted {
panic(fmt.Sprintf("tried starting task %d twice", id))
}
l.Debugf("executing task %d", id)
node := nodes[id]
l.Debugf("executing task %d %q", id, node.task.Name())
output[id] = &strings.Builder{}
go node.task.Run(id, output[id], doneChan)
running = append(running, id)
@ -298,7 +299,7 @@ func runTasks(nodes map[int]*node, rootNodes []int, l *utils.Logger) error {
for !allFinished {
select {
case result := <-doneChan:
l.Debugf("task %d is done with err: %v", result.Id, result.Err)
l.Debugf("task %d %q is done with err: %v", result.Id, nodes[result.Id].task.Name(), result.Err)
for i, id := range running {
if id == result.Id {
running = slices.Delete(running, i, i+1)

18
design.md Normal file
View File

@ -0,0 +1,18 @@
# Designs
Playground for language design dessisions
## Function Calls
```tt
fn hi(hello: i32) = {
3
};
fn main() = {
hi!;
hi();
hi;
};
```

View File

@ -3,9 +3,8 @@
## Syntax
```tt
// Return type is i64
fn main() = {
i : = 3;
i := 3;
i
};
```

View File

@ -192,6 +192,9 @@ func (p *Parser) parseArgumentList() ([]ast.Argument, bool) {
for p.peekTokenIs(token.Ident) {
p.nextToken()
name := p.curToken.Literal
if ok, _ := p.expectPeek(token.Colon); !ok {
return args, false
}
p.nextToken()
t, ok := p.parseType()

22
test.tt
View File

@ -1,13 +1,17 @@
fn main() = {
hi := 4;
i := 5;
if hi == 4 {
test2 := 3;
hi = 0
if i == 5 {
0
} else {
1
}
else {
hi = 1
};
test2
};
fn test2(hello: i32,) = {
hello
};
fn test2(hello: i32,) = {
hello
};

View File

@ -1,3 +1,4 @@
- [ ] Fix inconsensity in asm, change all structs to pointer
- [ ] Fix inconsensity in Tests
- [ ] Find a better way todo tests, like to generate a test case
- [ ] Add packages

View File

@ -73,6 +73,11 @@ func VarResolve(p *ast.Program) (map[string]Scope, error) {
for _, d := range p.Declarations {
switch d := d.(type) {
case *ast.FunctionDeclaration:
_, ok := functionToScope[d.Name]
if ok {
return functionToScope, errorf(d.Token, "duplicate function name %q", d.Name)
}
s := Scope{Variables: make(map[string]Var)}
for _, arg := range d.Args {
s.SetUniq(arg.Name)
@ -118,7 +123,9 @@ func VarResolveExpr(s *Scope, e ast.Expression) error {
for _, e := range e.Expressions {
errs = append(errs, VarResolveExpr(&newS, e))
}
errs = append(errs, VarResolveExpr(&newS, e.ReturnExpression))
if e.ReturnExpression != nil {
errs = append(errs, VarResolveExpr(&newS, e.ReturnExpression))
}
return errors.Join(errs...)
case *ast.IfExpression:
@ -145,7 +152,7 @@ func VarResolveExpr(s *Scope, e ast.Expression) error {
return errorf(e.Token, "variable %q redefined", e.Identifier)
}
s.SetUniq(e.Identifier)
e.Identifier = s.SetUniq(e.Identifier)
case *ast.VariableReference:
v, ok := s.Get(e.Identifier)
if !ok {