From 289c1fe3dd2f29e2511b6bb376582f8791179a9b Mon Sep 17 00:00:00 2001 From: Kyle Gunger Date: Sun, 26 Jun 2022 01:18:27 -0400 Subject: [AST] Parentheticals + Add support for parentheticals + Add uint as a valid type for the evaluator --- src/texec/eval.go | 6 ++++++ src/texec/libtnsl.go | 4 +++- src/tparse/tree-statement.go | 3 ++- src/tparse/tree-value.go | 9 ++++++-- src/tparse/tree.go | 49 ++++++++++++++++++++++++++++++++++++++++++++ 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 +} -- cgit v1.2.3