summaryrefslogtreecommitdiff
path: root/tnslc
diff options
context:
space:
mode:
Diffstat (limited to 'tnslc')
-rw-r--r--tnslc/parse/ast.tnsl70
1 files changed, 57 insertions, 13 deletions
diff --git a/tnslc/parse/ast.tnsl b/tnslc/parse/ast.tnsl
index bab7cfd..c3ffe23 100644
--- a/tnslc/parse/ast.tnsl
+++ b/tnslc/parse/ast.tnsl
@@ -99,7 +99,7 @@ struct Node {
return false
;/
- /; if (op`.eq("len\0") || op`.eq("--\0"), op`.eq("++\0"))
+ /; if (op`.eq("len\0") || op`.eq("--\0") || op`.eq("++\0"))
return true
;/
@@ -121,6 +121,7 @@ struct Node {
return false
;/
+
/; _op_order(~Token op) [int]
/; if (op`._type !== TTYPE_AUG)
_ast_print_err(op, "[FATAL] [CMPERR] _op_order was called on a non-aug token\0")
@@ -181,40 +182,81 @@ struct Node {
return 999
;/
-/; _ast_value_singlet(~utils.File fin, ~Node mod, ~Token first) [bool]
+/; _ast_post_id (~utils.File fin, ~Node mod, ~Token first)
+;/
+
+/; _ast_value_bare(~utils.File fin, ~Node mod, ~Token first) [bool]
~Node cur = mod
- /; if (_advance_check(fin, first, "(\0") == true)
+ /; if (first`.eq("{\0") == true)
+ _ast_list_value(fin, mod, first)
+ /; if (_advance_check(fin, first, "}\0") == false)
+ _ast_print_err(first, "Expected closing '}' for singlet\0")
+ return false
+ ;/
+ ;; else if (_advance_check(fin, first, "(\0") == true)
_ast_value(fin, mod, first)
/; if (_advance_check(fin, first, ")\0") == false)
- _ast_print_err(first, "Expected closing parenthesis for singlet\0")
+ _ast_print_err(first, "Expected closing ')' for singlet\0")
return false
;/
- cur = mod`.sub.get(mod`.sub.count - 1)
;; else
/; loop (first`._type == TTYPE_AUG)
/; if (_op_prefix(first) == false)
- _ast_print_err(first, "\0")
+ _ast_print_err(first, "Only certain augments (-, !, ~, --, ++, len) can be used as prefixes for bare values\0")
return false
;/
Node pre
pre.init(NTYPE_PRE_OP, first`.data)
+
+ cur`.sub.push(~pre)
+ cur = cur`.sub.get(cur`.sub.count - 1)
+ first` = produce_next_token(fin, first`)
;/
+
+ Node val
+
+ /; if (first`._type == TTYPE_USRWD)
+ val.init(NTYPE_ID, first`.data)
+ first` = produce_next_token(fin, first`)
+ _ast_post_id(fin, ~val, first)
+ ;; else if (first`._type == TTYPE_LITRL)
+ val.init(NTYPE_LITERAL, first`.data)
+ first` = produce_next_token(fin, first`)
+ ;; else
+ _ast_print_err(first, "Expected identifier or literal in bare value\0")
+ return false
+ ;/
+
+ cur`.sub.push(~val)
;/
/; loop (_advance_check(fin, first, ".\0") == true)
/; if (first`._type !== TTYPE_USRWD)
- _ast_err(first, "Expected identifier/member name after '.'")
-
+ _ast_print_err(first, "Expected method/member name after '.'\0")
+ return false
;/
+ ~Node repl = cur`.sub.get(cur`.sub.count - 1)
+ Node dot
+ dot.init(NTYPE_BIN_OP, utils.strcpy(".\0"))
+ dot.sub.push(repl)
+
+ Node val
+ val.init(NTYPE_ID, first`.data)
+ first` = produce_next_token(fin, first`)
+ _ast_post_id(fin, ~val, first)
+ dot.sub.push(~val)
+
+ cur`.sub.pop()
+ cur`.sub.push(~dot)
+ cur = cur`.sub.get(cur`.sub.count - 1)
;/
+
+ return true
;/
/; _ast_value (~utils.File fin, ~Node mod, ~Token first)
- /; if (first`.eq("{\0") == true)
- _ast_list_value(fin, mod, first)
- ;/
Node val
val.init(NTYPE_VALUE, utils.strcpy("\0"))
@@ -222,7 +264,7 @@ struct Node {
~Node cur = ~val
/; loop (bool run = true; run == true && first`._type !== TTYPE_ERR)
- _ast_value_singlet(fin, ~cur, first)
+ _ast_value_bare(fin, ~cur, first)
;/
mod`.sub.push(~val)
@@ -291,7 +333,7 @@ struct Node {
_ast_list_type(fin, mod, first)
;/
- /; if (first.eq("[\0") == true)
+ /; if (first`.eq("[\0") == true)
_ast_list_type(fin, mod, first)
;/
;/
@@ -1088,3 +1130,5 @@ struct Node {
/; print_ast (~Node n)
print_ast_rec(n, 0)
;/
+
+