diff options
Diffstat (limited to 'src/tparse')
-rw-r--r-- | src/tparse/tree-statement.go | 3 | ||||
-rw-r--r-- | src/tparse/tree-value.go | 9 | ||||
-rw-r--r-- | src/tparse/tree.go | 49 |
3 files changed, 58 insertions, 3 deletions
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 +} |