summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/texec/eval.go59
-rw-r--r--src/texec/libtnsl.go4
-rw-r--r--src/texec/world.go2
-rw-r--r--src/texec/worldbuilder.go8
4 files changed, 51 insertions, 22 deletions
diff --git a/src/texec/eval.go b/src/texec/eval.go
index 7f18f49..cacaa66 100644
--- a/src/texec/eval.go
+++ b/src/texec/eval.go
@@ -53,18 +53,20 @@ var (
// Error helper
func errOut(msg string) {
- fmt.Println("Error in eval:")
+ fmt.Println("==== BEGIN ERROR ====")
fmt.Println(msg)
fmt.Println(cart)
- panic("EVAL ERROR")
+ fmt.Println("==== END ERROR ====")
+ panic(">>> PANIC FROM EVAL <<<")
}
func errOutCTX(msg string, ctx VarMap) {
- fmt.Println("Error in eval:")
+ fmt.Println("==== BEGIN ERROR ====")
fmt.Println(msg)
fmt.Println(cart)
fmt.Println(ctx)
- panic("EVAL ERROR")
+ fmt.Println("==== END ERROR ====")
+ panic(">>> PANIC FROM EVAL <<<")
}
// Names of artifacts, finding artifacts
@@ -226,7 +228,7 @@ func getNodeRelative(s TArtifact) *tparse.Node {
return nil
}
-func getModDefRelative(s TArtifact) TVariable {
+func getModDefRelative(s TArtifact) *TVariable {
for i := len(cart.Path); i >= 0; i-- {
tmpmod := getModuleRelative(getModuleInPath(i), s)
@@ -234,19 +236,19 @@ func getModDefRelative(s TArtifact) TVariable {
continue
}
- def, prs := tmpmod.Defs[s.Name]
+ _, prs := tmpmod.Defs[s.Name]
if prs {
- return def
+ return &(mod.Defs[a.Name])
}
}
errOut(fmt.Sprintf("Failed to resolve mod def artifact %v", s))
- return null
+ return nil
}
// Returns a mod definition, requires a resolved artifact
-func getModDef(a TArtifact) TVariable {
+func getModDef(a TArtifact) *TVariable {
mod := prog
for i := 0; i < len(a.Path); i++ {
@@ -258,14 +260,14 @@ func getModDef(a TArtifact) TVariable {
}
}
- def, prs := mod.Defs[a.Name]
+ v, prs := mod.Defs[a.Name]
if prs {
- return def
+ return v
}
errOut(fmt.Sprintf("Failed to resolve mod def artifact %v", a))
- return null
+ return nil
}
// Type related stuff
@@ -421,8 +423,10 @@ func getLiteral(v tparse.Node, t TType) interface{} {
return getLiteralComposite(v)
}
-func compositeToStruct(str TVariable, cmp []interface{}) VarMap {
- vars := str.Data.([]TVariable)
+func compositeToStruct(str TArtifact, cmp []interface{}) VarMap {
+ sv := getModDefRelative(str)
+
+ vars := sv.Data.([]TVariable)
if len(vars) != len(cmp) {
return nil
}
@@ -430,7 +434,10 @@ func compositeToStruct(str TVariable, cmp []interface{}) VarMap {
out := make(VarMap)
for i:=0;i<len(vars);i++ {
- out[vars[i].Data.(string)] = TVariable{vars[i].Type, cmp[i]}
+ if equateType(vars[i].Type, tInt) || equateType(t, tCharp) || equateType(t, tString) {
+ out[vars[i].Data.(string)] = &(TVariable{vars[i].Type, cmp[i]})
+ }
+
}
return out
@@ -449,6 +456,16 @@ func resolveArtifactCall(a TArtifact, params []TVariable) TVariable {
}
func resolveArtifact(a TArtifact, ctx *VarMap) *TVariable {
+ if len(a.Path) == 0 {
+ val, prs := (*ctx)[a.Name]
+ if !prs {
+ errOutCTX(fmt.Sprintf("Could not resolve %s in the current context.", a.Name), *ctx)
+ }
+ return val
+ } else {
+
+ }
+
return nil
}
@@ -460,8 +477,16 @@ func resolveArtifact(a TArtifact, ctx *VarMap) *TVariable {
// Parse a value node
func evalValue(v tparse.Node, ctx *VarMap) TVariable {
- if v.Data.Data == "=" {
-
+ switch v.Data.Data {
+ case "=":
+ case "+":
+ case "-":
+ case "*":
+ case "/":
+ case "&&":
+ case "||":
+ case "==":
+ case ".":
}
return null
}
diff --git a/src/texec/libtnsl.go b/src/texec/libtnsl.go
index b810e5f..2a2a9d5 100644
--- a/src/texec/libtnsl.go
+++ b/src/texec/libtnsl.go
@@ -114,6 +114,8 @@ func tnslFileEval(file, in TVariable, function string) TVariable {
func tprint(in TVariable) {
if equateType(in.Type, tString) {
fmt.Print(in.Data.(string))
+ } else if equateType(in.Type, tCharp) {
+ fmt.Print(in.Data.(rune))
} else {
fmt.Print(in.Data)
}
@@ -122,6 +124,8 @@ func tprint(in TVariable) {
func tprintln(in TVariable) {
if equateType(in.Type, tString) {
fmt.Println(in.Data.(string))
+ } else if equateType(in.Type, tCharp) {
+ fmt.Println(in.Data.(rune))
} else {
fmt.Println(in.Data)
}
diff --git a/src/texec/world.go b/src/texec/world.go
index 7921a13..306517f 100644
--- a/src/texec/world.go
+++ b/src/texec/world.go
@@ -37,7 +37,7 @@ type TVariable struct {
Data interface{}
}
-type VarMap map[string]TVariable
+type VarMap map[string]*TVariable
// TModule represents a collection of files and sub-modules in a program
type TModule struct {
diff --git a/src/texec/worldbuilder.go b/src/texec/worldbuilder.go
index 2f71e79..6a5fb33 100644
--- a/src/texec/worldbuilder.go
+++ b/src/texec/worldbuilder.go
@@ -51,7 +51,7 @@ func modDef(n tparse.Node, m *TModule) {
t := getType(n.Sub[0])
s, vs := modDefVars(n.Sub[1], t)
for i := 0; i < len(s); i++ {
- m.Defs[s[i]] = vs[i]
+ m.Defs[s[i]] = &(vs[i])
}
}
@@ -94,7 +94,7 @@ func modDefStruct(n tparse.Node, m *TModule) {
}
}
- m.Defs[name] = TVariable{tStruct, tvlist}
+ m.Defs[name] = &(TVariable{tStruct, tvlist})
}
func modDefEnum(n tparse.Node, m *TModule) {
@@ -103,9 +103,9 @@ func modDefEnum(n tparse.Node, m *TModule) {
s, vs := modDefVars(n.Sub[2], t)
out := TVariable{tEnum, make(VarMap)}
for i := 0; i < len(s); i++ {
- out.Data.(VarMap)[s[i]] = vs[i]
+ out.Data.(VarMap)[s[i]] = &(vs[i])
}
- m.Defs[name] = out
+ m.Defs[name] = &(out)
}
// Parse a file and make an AST from it.