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

@ -175,7 +175,10 @@ func (be *BinaryExpression) String() string {
type BlockExpression struct { type BlockExpression struct {
Token token.Token // The '{' Token token.Token // The '{'
Expressions []Expression 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 // 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() {} func (be *BlockExpression) expressionNode() {}

View File

@ -47,7 +47,7 @@ func (sp *SourceProgram) Build(backend asm.Backend, emitAsmOnly bool, toPrint To
id := 0 id := 0
addRootNode := func(task task) int { 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} node := &node{task: task}
nodes[id] = node nodes[id] = node
rootNodes = append(rootNodes, id) 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 { 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 { if len(deps) <= 0 {
panic("node without dep is useless") panic("node without dep is useless")
} }

View File

@ -6,6 +6,7 @@ import (
"io" "io"
"os" "os"
"os/exec" "os/exec"
"runtime/debug"
"slices" "slices"
"strings" "strings"
@ -149,7 +150,7 @@ func build(outputWriter io.Writer, input string, output string, toPrint ToPrintF
defer func() { defer func() {
if panicErr := recover(); panicErr != nil { 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 { if done[id] != notStarted {
panic(fmt.Sprintf("tried starting task %d twice", id)) panic(fmt.Sprintf("tried starting task %d twice", id))
} }
l.Debugf("executing task %d", id)
node := nodes[id] node := nodes[id]
l.Debugf("executing task %d %q", id, node.task.Name())
output[id] = &strings.Builder{} output[id] = &strings.Builder{}
go node.task.Run(id, output[id], doneChan) go node.task.Run(id, output[id], doneChan)
running = append(running, id) running = append(running, id)
@ -298,7 +299,7 @@ func runTasks(nodes map[int]*node, rootNodes []int, l *utils.Logger) error {
for !allFinished { for !allFinished {
select { select {
case result := <-doneChan: 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 { for i, id := range running {
if id == result.Id { if id == result.Id {
running = slices.Delete(running, i, i+1) 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,7 +3,6 @@
## Syntax ## Syntax
```tt ```tt
// Return type is i64
fn main() = { fn main() = {
i := 3; i := 3;
i i

View File

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

18
test.tt
View File

@ -1,13 +1,17 @@
fn main() = { fn main() = {
hi := 4; i := 5;
if hi == 4 { if i == 5 {
test2 := 3; 0
hi = 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 asm, change all structs to pointer
- [ ] Fix inconsensity in Tests - [ ] Fix inconsensity in Tests
- [ ] Find a better way todo tests, like to generate a test case - [ ] 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 { for _, d := range p.Declarations {
switch d := d.(type) { switch d := d.(type) {
case *ast.FunctionDeclaration: 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)} s := Scope{Variables: make(map[string]Var)}
for _, arg := range d.Args { for _, arg := range d.Args {
s.SetUniq(arg.Name) s.SetUniq(arg.Name)
@ -118,7 +123,9 @@ func VarResolveExpr(s *Scope, e ast.Expression) error {
for _, e := range e.Expressions { for _, e := range e.Expressions {
errs = append(errs, VarResolveExpr(&newS, e)) errs = append(errs, VarResolveExpr(&newS, e))
} }
if e.ReturnExpression != nil {
errs = append(errs, VarResolveExpr(&newS, e.ReturnExpression)) errs = append(errs, VarResolveExpr(&newS, e.ReturnExpression))
}
return errors.Join(errs...) return errors.Join(errs...)
case *ast.IfExpression: case *ast.IfExpression:
@ -145,7 +152,7 @@ func VarResolveExpr(s *Scope, e ast.Expression) error {
return errorf(e.Token, "variable %q redefined", e.Identifier) return errorf(e.Token, "variable %q redefined", e.Identifier)
} }
s.SetUniq(e.Identifier) e.Identifier = s.SetUniq(e.Identifier)
case *ast.VariableReference: case *ast.VariableReference:
v, ok := s.Get(e.Identifier) v, ok := s.Get(e.Identifier)
if !ok { if !ok {