Ports more sdql features from vg

This commit is contained in:
Tastyfish
2016-03-23 05:59:17 -04:00
parent e8ffe7acbb
commit cd06bf07e0
2 changed files with 131 additions and 82 deletions
@@ -31,12 +31,13 @@
// expression : ( unary_expression | '(' expression ')' | value ) [binary_operator expression]
// unary_expression : unary_operator ( unary_expression | value | '(' expression ')' )
// comparitor : '=' | '==' | '!=' | '<>' | '<' | '<=' | '>' | '>='
// value : variable | string | number | 'null'
// value : variable | string | array | number | 'null'
// unary_operator : '!' | '-' | '~'
// binary_operator : comparitor | '+' | '-' | '/' | '*' | '&' | '|' | '^'
// bool_operator : 'AND' | '&&' | 'OR' | '||'
//
// string : ''' <some text> ''' | '"' <some text > '"'
// array : '{' [arguments] '}'
// number : <some digits>
//
//////////
@@ -336,7 +337,7 @@
variable(i, list/node)
var/list/L = list(token(i))
node[++node.len] = L
if(token(i) == "\[")
L += token(i + 1)
i += 2
@@ -401,12 +402,43 @@
return i + 1
//array: '{' expression, expression, ... '}'
array(var/i, var/list/node)
// Arrays get turned into this: list("{", list(exp_1a = exp_1b, ...), ...), "{" is to mark the next node as an array.
if(copytext(token(i), 1, 2) != "{")
parse_error("Expected an array but found '[token(i)]'")
return i + 1
node += token(i) // Add the "{"
var/list/expression_list = list()
if(token(i + 1) != "}")
var/list/temp_expression_list = list()
do
i = expression(i + 1, temp_expression_list)
if(token(i) == ",")
expression_list[++expression_list.len] = temp_expression_list
temp_expression_list = list()
while(token(i) && token(i) != "}")
expression_list[++expression_list.len] = temp_expression_list
else
i++
node[++node.len] = expression_list
return i + 1
//call_function: <function name> ['(' [arguments] ')']
call_function(i, list/node, list/arguments)
var/list/cur_argument = list()
if(length(tokenl(i)))
node += token(i++)
var/procname = ""
if(tokenl(i) == "global" && token(i + 1) == ".") // Global proc.
i += 2
procname = "global."
node += procname + token(i++)
if(token(i) != "(")
parse_error("Expected ( but found '[token(i)]'")
else if(token(i + 1) != ")")
@@ -526,11 +558,11 @@
if(token(i) == "null")
node += "null"
i++
else if(lowertext(copytext(token(i), 1, 3)) == "0x" && isnum(hex2num(copytext(token(i), 3))))
node += hex2num(copytext(token(i), 3))
i++
else if(isnum(text2num(token(i))))
node += text2num(token(i))
i++
@@ -538,6 +570,9 @@
else if(copytext(token(i), 1, 2) in list("'", "\""))
i = string(i, node)
else if(copytext(token(i), 1, 2) == "{") // Start a list.
i = array(i, node)
else
i = variable(i, node)