diff options
author | Kyle Gunger <kgunger12@gmail.com> | 2022-07-13 02:44:41 -0400 |
---|---|---|
committer | Kyle Gunger <kgunger12@gmail.com> | 2022-07-13 02:44:41 -0400 |
commit | 42a014c98797c7c4d78bfc3c2494a6ef0ce4e6be (patch) | |
tree | bb9e6310d2d973882f05011a3b0e82db34f13a37 /src/tparse | |
parent | 81300fda909b260ff62ae1af9157cf0d097a47c0 (diff) |
[AST] Fix an issue with parsing lists of values
Diffstat (limited to 'src/tparse')
-rw-r--r-- | src/tparse/tree-list.go | 24 | ||||
-rw-r--r-- | src/tparse/tree-statement.go | 8 | ||||
-rw-r--r-- | src/tparse/tree-value.go | 12 |
3 files changed, 34 insertions, 10 deletions
diff --git a/src/tparse/tree-list.go b/src/tparse/tree-list.go index 3acc426..85f7134 100644 --- a/src/tparse/tree-list.go +++ b/src/tparse/tree-list.go @@ -34,21 +34,33 @@ func parseValueList(tokens *[]Token, tok, max int) (Node, int) { out := Node{Data: Token{Type: 10, Data: "vlist"}} var tmp Node - for ; tok < max; { + for ;tok < max; { t := (*tokens)[tok] switch t.Type { case LINESEP: - fallthrough - case DELIMIT: return out, tok + case DELIMIT: + switch t.Data { + case "}", ")", "]": + return out, tok + default: + mx := findClosing(tokens, tok) + if mx > -1 { + tmp, tok = parseValue(tokens, tok, mx + 1) + out.Sub = append(out.Sub, tmp) + } else { + errOut("Failed to find closing delim within list of values", t) + } + } case INLNSEP: tok++ + fallthrough + default: + tmp, tok = parseValue(tokens, tok, max) + out.Sub = append(out.Sub, tmp) } - - tmp, tok = parseValue(tokens, tok, max) - out.Sub = append(out.Sub, tmp) } return out, tok diff --git a/src/tparse/tree-statement.go b/src/tparse/tree-statement.go index 6a5b6e3..5c6d912 100644 --- a/src/tparse/tree-statement.go +++ b/src/tparse/tree-statement.go @@ -193,7 +193,13 @@ func keywordStatement(tokens *[]Token, tok, max int) (Node, int) { out.Sub = append(out.Sub, tmp) tok++ if (*tokens)[tok].Data == "(" { - tmp, tok = parseValueList(tokens, tok + 1, max) + mx := findClosing(tokens, tok) + + if mx < 0 { + errOut("Failed to find closing paren when parsing a struct def", (*tokens)[tok]) + } + + tmp, tok = parseValueList(tokens, tok + 1, mx) out.Sub = append(out.Sub, tmp) tok++ } diff --git a/src/tparse/tree-value.go b/src/tparse/tree-value.go index 35e94d2..220687e 100644 --- a/src/tparse/tree-value.go +++ b/src/tparse/tree-value.go @@ -150,21 +150,27 @@ func parseUnaryOps(tokens *[]Token, tok, max int) (Node) { var tmp Node switch t.Type { case DELIMIT: + mx := findClosing(tokens, tok) + + if mx < 0 { + errOut("Unable to find closing delim when parsing a value", t) + } + switch t.Data { case "(": // Function call if comp { errOut("Composite values can not be called as functions.", t) } - tmp, tok = parseValueList(tokens, tok + 1, max) + tmp, tok = parseValueList(tokens, tok + 1, mx + 1) tmp.Data.Data = "call" case "[": // Typecasting - tmp, tok = parseTypeList(tokens, tok + 1, max) + tmp, tok = parseTypeList(tokens, tok + 1, mx + 1) tmp.Data.Data = "cast" case "{": // Indexing if comp { errOut("Inline composite values can not be indexed.", t) } - tmp, tok = parseValueList(tokens, tok + 1, max) + tmp, tok = parseValueList(tokens, tok + 1, mx + 1) tmp.Data.Data = "index" default: errOut("Unexpected delimiter when parsing value", t) |