mirror of
https://github.com/RoBaertschi/tt.git
synced 2025-04-19 23:33: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 {
|
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() {}
|
||||||
|
@ -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")
|
||||||
}
|
}
|
||||||
|
@ -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
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
|
## Syntax
|
||||||
|
|
||||||
```tt
|
```tt
|
||||||
// Return type is i64
|
|
||||||
fn main() = {
|
fn main() = {
|
||||||
i : = 3;
|
i := 3;
|
||||||
i
|
i
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
@ -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()
|
||||||
|
|
||||||
|
22
test.tt
22
test.tt
@ -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
|
|
||||||
};
|
fn test2(hello: i32,) = {
|
||||||
|
hello
|
||||||
test2
|
};
|
||||||
|
|
||||||
|
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 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
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
errs = append(errs, VarResolveExpr(&newS, e.ReturnExpression))
|
if e.ReturnExpression != nil {
|
||||||
|
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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user