summaryrefslogtreecommitdiff
path: root/src/tparse/tree-value.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/tparse/tree-value.go')
-rw-r--r--src/tparse/tree-value.go130
1 files changed, 124 insertions, 6 deletions
diff --git a/src/tparse/tree-value.go b/src/tparse/tree-value.go
index 1a057d4..d03383e 100644
--- a/src/tparse/tree-value.go
+++ b/src/tparse/tree-value.go
@@ -16,6 +16,74 @@
package tparse
+// Ops order in TNSL
+// Cast/Paren > Address > Get > Inc/Dec > Math > Bitwise > Logic
+
+var ORDER = map[string]int{
+ // Address of
+ "~": 0,
+ // De-ref
+ "`": 0,
+
+ // Get
+ ".": 1,
+
+ // Inc/Dec
+ "++": 2,
+ "--": 2,
+
+ // Multiplication
+ "*": 3,
+ // Division
+ "/": 3,
+
+ // Addition
+ "+": 4,
+ // Subtraction
+ "-": 4,
+
+ // Mod
+ "%": 5,
+
+ // Bitwise and
+ "&": 6,
+ // Bitwise or
+ "|": 6,
+ // Bitwise xor
+ "^": 6,
+
+ // Bitwise l-shift
+ "<<": 6,
+ // Bitwise r-shift
+ ">>": 6,
+
+ "!&": 6,
+ "!|": 6,
+ "!^": 6,
+
+ // Not (prefix any bool or bitwise)
+ "!": 6,
+
+ // Boolean and
+ "&&": 7,
+ // Boolean or
+ "||": 7,
+ // Truthy equals
+ "==": 7,
+
+ // Greater than
+ ">": 7,
+ // Less than
+ "<": 7,
+
+ "!&&": 7,
+ "!||": 7,
+ "!==": 7,
+
+ "!>": 7,
+ "!<": 7,
+}
+
func parseValue(tokens *[]Token, tok, max int) (Node, int) {
out := Node{}
@@ -33,9 +101,48 @@ func parseValue(tokens *[]Token, tok, max int) (Node, int) {
func parseVoidType(tokens *[]Token, tok, max int) (Node, int) {
out := Node{}
+ working := &out
for ; tok < max; tok++ {
- //t := (*tokens)[tok]
+ t := (*tokens)[tok]
+ switch t.Type {
+ case AUGMENT:
+ if t.Data != "~" && t.Data != "`" {
+ errOut("Error: unexpected augment token when parsing type", t)
+ }
+ working.Data = t
+
+ case KEYTYPE:
+ if t.Data == "void" {
+ *working, tok = parseVoidType(tokens, tok, max)
+ } else {
+ working.Data = t
+ }
+
+ return out, tok
+
+ case DEFWORD:
+
+ case DELIMIT:
+ if t.Data == "{" && tok < max-1 {
+ if (*tokens)[tok+1].Data == "}" {
+ working.Data = Token{AUGMENT, "{}", t.Line, t.Char}
+ tok++
+ } else {
+ errOut("Error: start of list when parsing type (did you mean \"{}\"?)", t)
+ }
+ } else if tok >= max-1 {
+ errOut("Error: unexpected end of file when parsing type", t)
+ } else {
+ errOut("Error: unexpected delimeter when parsing type", t)
+ }
+
+ default:
+ errOut("Error: unexpected token when parsing type", t)
+ }
+
+ makeParent(working, Node{})
+ working = &(working.Sub[0])
}
return out, tok
@@ -49,7 +156,7 @@ func parseType(tokens *[]Token, tok, max int, param bool) (Node, int) {
t := (*tokens)[tok]
switch t.Type {
case AUGMENT:
- if t.Data != "~" {
+ if t.Data != "~" && t.Data != "`" {
errOut("Error: unexpected augment token when parsing type", t)
}
working.Data = t
@@ -70,22 +177,33 @@ func parseType(tokens *[]Token, tok, max int, param bool) (Node, int) {
case KEYWORD:
if param && t.Data == "static" {
+ // Nonstandard keyword in parameter definition
errOut("Error: parameter types cannot be static", t)
} else if t.Data != "const" && t.Data != "volatile" && t.Data != "static" {
+ // Nonstandard keyword in variable definition
errOut("Error: unexpected keyword when parsing type", t)
}
working.Data = t
case DELIMIT:
- if t.Data == "{" {
+ if t.Data == "{" && tok < max-1 {
+ // What happens when an array type is defined
if (*tokens)[tok+1].Data == "}" {
- working.Data = Token{9, "array", t.Line, t.Char}
+ // Length variable array
+ working.Data = Token{AUGMENT, "{}", t.Line, t.Char}
tok++
+ } else if (*tokens)[tok+1].Type == LITERAL {
+ // Array with constant length
} else {
- errOut("Error: start of list when parsing type (did you mean {} ?)", t)
+ // Undefined behaviour
+ errOut("Error: start of list when parsing type (did you mean \"{}\"?)", t)
}
+ } else if tok >= max-1 {
+ // End of file with open delimiter after type parsing has begun
+ errOut("Error: unexpected end of file when parsing type", t)
} else {
- errOut("Error: start of list when parsing type", t)
+ // Other delimiter than {} used in variable definition
+ errOut("Error: unexpected delimeter when parsing type", t)
}
default: