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) |