summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/texec/eval.go6
-rw-r--r--src/texec/libtnsl.go4
-rw-r--r--src/tparse/tree-statement.go3
-rw-r--r--src/tparse/tree-value.go9
-rw-r--r--src/tparse/tree.go49
5 files changed, 67 insertions, 4 deletions
diff --git a/src/texec/eval.go b/src/texec/eval.go
index 37341a5..b0f4a47 100644
--- a/src/texec/eval.go
+++ b/src/texec/eval.go
@@ -563,6 +563,9 @@ func convertValPS(to TType, sk int, dat interface{}) interface{} {
case int:
numcv = float64(v)
goto NCV
+ case uint:
+ numcv = float64(v)
+ goto NCV
case byte:
numcv = float64(v)
goto NCV
@@ -583,6 +586,8 @@ func convertValPS(to TType, sk int, dat interface{}) interface{} {
NCV:
if equateTypePSO(to, tInt, sk) {
return int(numcv)
+ } else if equateTypePSO(to, tUint, sk) {
+ return uint(numcv)
} else if equateTypePSO(to, tFloat, sk) {
return float64(numcv)
} else if equateTypePSO(to, tByte, sk) || equateTypePSO(to, tCharp, sk) {
@@ -696,6 +701,7 @@ func isStruct(t TType, skp int) bool {
ch = ch || equateTypePSO(t, tCharp, skp)
ch = ch || equateTypePSO(t, tBool, skp)
ch = ch || equateTypePSO(t, tNull, skp)
+ ch = ch || equateTypePSO(t, tUint, skp)
return !ch
}
diff --git a/src/texec/libtnsl.go b/src/texec/libtnsl.go
index bb0ce7d..91d65ae 100644
--- a/src/texec/libtnsl.go
+++ b/src/texec/libtnsl.go
@@ -26,7 +26,8 @@ import (
Parts included:
- io.print
- io.println
- - io.openFile
+ - io.readFile
+ - io.writeFile
- io.File API for file objects
Types included:
@@ -46,6 +47,7 @@ var (
tFile = TType{Pre: []string{}, T: TArtifact{Path: []string{"tnsl", "io"}, Name: "File"}, Post: ""}
tString = TType{Pre: []string{"{}"}, T: TArtifact{Path: []string{}, Name:"charp"}, Post: ""}
tInt = TType{Pre: []string{}, T: TArtifact{Path: []string{}, Name:"int"}, Post: ""}
+ tUint = TType{Pre: []string{}, T: TArtifact{Path: []string{}, Name:"uint"}, Post: ""}
tByte = TType{Pre: []string{}, T: TArtifact{Path: []string{}, Name:"uint8"}, Post: ""}
tByteArray = TType{Pre: []string{"{}"}, T: TArtifact{Path: []string{}, Name:"uint8"}, Post: ""}
tFloat = TType{Pre: []string{}, T: TArtifact{Path: []string{}, Name:"float"}, Post: ""}
diff --git a/src/tparse/tree-statement.go b/src/tparse/tree-statement.go
index cf25085..6a5b6e3 100644
--- a/src/tparse/tree-statement.go
+++ b/src/tparse/tree-statement.go
@@ -117,13 +117,14 @@ func parseBlock(tokens *[]Token, tok, max int) (Node, int) {
REBLOCK:
tmp, tok = parseBlock(tokens, tok + 1, max)
-
+
if (*tokens)[tok].Data == ";;" {
out.Sub = append(out.Sub, tmp)
goto REBLOCK
} else if (*tokens)[tok].Data == ";/" {
tok++
}
+
case "/:":
tmp, tok = parsePreBlock(tokens, tok + 1, max)
case ":":
diff --git a/src/tparse/tree-value.go b/src/tparse/tree-value.go
index 7ae346c..35e94d2 100644
--- a/src/tparse/tree-value.go
+++ b/src/tparse/tree-value.go
@@ -115,6 +115,11 @@ func parseUnaryOps(tokens *[]Token, tok, max int) (Node) {
(*vnode).Data.Data = "comp"
val = true
comp = true
+ case "(": //Typecast or paren statement
+ mx := findClosing(tokens, tok)
+ (*vnode) = parseBinaryOp(tokens, tok + 1, mx)
+ tok = mx
+ val = true
default:
errOut("Unexpected delimiter when parsing value", t)
}
@@ -210,7 +215,7 @@ func parseBinaryOp(tokens *[]Token, tok, max int) (Node) {
}
if curl < 0 || brak < 0 || parn < 0 {
- if curl > 0 || brak > 0 || parn > 0 {
+ if curl > 0 || brak > 0 || parn > 0 || tok < max - 1 {
errOut("Un-matched closing delimiter when parsing a type.", t)
}
}
@@ -303,7 +308,7 @@ func parseValue(tokens *[]Token, tok, max int) (Node, int) {
if block > 1 {
continue
} else if block == 1 {
- errOut("Error: redefinition of a block from a block as a value is not permitted.", t)
+ errOut("Error: redefinition of a block from a value block is not permitted.", t)
}
if curl > 0 || brak > 0 || parn > 0 {
errOut("Delimeter pairs not closed before end of value", t)
diff --git a/src/tparse/tree.go b/src/tparse/tree.go
index 30d6b0c..9aaed06 100644
--- a/src/tparse/tree.go
+++ b/src/tparse/tree.go
@@ -72,3 +72,52 @@ func MakeTree(tokens *[]Token, file string) Node {
return out
}
+
+func findClosing(tokens *[]Token, tok int) int {
+ t := (*tokens)[tok]
+ var match string
+
+ switch (t.Data) {
+ case "(":
+ match = ")"
+ case "[":
+ match = "]"
+ case "{":
+ match = "}"
+ default:
+ errOut("[Internal] Attempted to find closing for a non-delim token.", t)
+ }
+
+ var curl, brak, parn int = 0, 0, 0
+
+ for tok++; tok < len(*tokens); tok++ {
+ t := (*tokens)[tok]
+ if t.Type == DELIMIT {
+ switch t.Data {
+ case "{":
+ curl++
+ case "[":
+ brak++
+ case "(":
+ parn++
+
+ case "}":
+ curl--
+ case "]":
+ brak--
+ case ")":
+ parn--
+ }
+
+ if curl < 0 || brak < 0 || parn < 0 {
+ if (curl < 0 && match == "}") || (brak < 0 && match == "]") || (parn < 0 && match == ")") {
+ return tok
+ } else {
+ errOut("Un-matched closing delimiter when searching for a closing delim.", t)
+ }
+ }
+ }
+ }
+
+ return -1
+}