mirror of
https://github.com/RoBaertschi/tt.git
synced 2025-04-16 05:53:30 +00:00
Compare commits
2 Commits
508b3fdc7a
...
45dad474e0
Author | SHA1 | Date | |
---|---|---|---|
45dad474e0 | |||
6425cd3b55 |
@ -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() {}
|
||||
|
@ -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")
|
||||
}
|
||||
|
@ -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
18
design.md
Normal file
@ -0,0 +1,18 @@
|
||||
# Designs
|
||||
|
||||
Playground for language design dessisions
|
||||
|
||||
## Function Calls
|
||||
|
||||
```tt
|
||||
fn hi(hello: i32) = {
|
||||
3
|
||||
};
|
||||
|
||||
fn main() = {
|
||||
hi!;
|
||||
hi();
|
||||
hi;
|
||||
};
|
||||
|
||||
```
|
@ -3,9 +3,8 @@
|
||||
## Syntax
|
||||
|
||||
```tt
|
||||
// Return type is i64
|
||||
fn main() = {
|
||||
i : = 3;
|
||||
i := 3;
|
||||
i
|
||||
};
|
||||
```
|
||||
|
@ -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
22
test.tt
@ -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
|
||||
};
|
||||
|
1
todo.md
1
todo.md
@ -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
|
||||
|
@ -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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user