[MIRROR] Staticpath [MDB ignore] (#12445)

Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2026-02-22 16:33:43 -07:00
committed by GitHub
parent cc106f8032
commit ba5224fbcb
437 changed files with 5869 additions and 5220 deletions
+64 -64
View File
@@ -18,7 +18,7 @@
/*
Class: nS_Parser
*/
/n_Parser/nS_Parser
/datum/n_Parser/nS_Parser
/*
Var: expecting
A variable which keeps track of whether an operator or value is expected. It should be either <OPERATOR> or <VALUE>. See <ParseExpression()>
@@ -30,7 +30,7 @@
Proc: Precedence
Compares two operators, decides which is higher in the order of operations, and returns <SHIFT> or <REDUCE>.
*/
/n_Parser/nS_Parser/proc/Precedence(node/expression/op/top, node/expression/op/input)
/datum/n_Parser/nS_Parser/proc/Precedence(datum/node/expression/op/top, datum/node/expression/op/input)
if(istype(top))
top=top.precedence
if(istype(input))
@@ -43,35 +43,35 @@
Proc: GetExpression
Takes a token expected to represent a value and returns an <expression> node.
*/
/n_Parser/nS_Parser/proc/GetExpression(token/T)
/datum/n_Parser/nS_Parser/proc/GetExpression(datum/token/T)
if(!T) return
if(istype(T, /node/expression))
if(istype(T, /datum/node/expression))
return T
switch(T.type)
if(/token/word)
return new/node/expression/value/variable(T.value)
if(/token/accessor)
var/token/accessor/A=T
var/node/expression/value/variable/E//=new(A.member)
var/stack/S=new()
while(istype(A.object, /token/accessor))
if(/datum/token/word)
return new/datum/node/expression/value/variable(T.value)
if(/datum/token/accessor)
var/datum/token/accessor/A=T
var/datum/node/expression/value/variable/E//=new(A.member)
var/datum/stack/S=new()
while(istype(A.object, /datum/token/accessor))
S.Push(A)
A=A.object
ASSERT(istext(A.object))
while(A)
var/node/expression/value/variable/V=new()
var/datum/node/expression/value/variable/V=new()
V.id=new(A.member)
if(E)
V.object=E
else
V.object=new/node/identifier(A.object)
V.object=new/datum/node/identifier(A.object)
E=V
A=S.Pop()
return E
if(/token/number, /token/string)
return new/node/expression/value/literal(T.value)
if(/datum/token/number, /datum/token/string)
return new/datum/node/expression/value/literal(T.value)
/*
Proc: GetOperator
@@ -88,9 +88,9 @@ See Also:
- <GetBinaryOperator()>
- <GetUnaryOperator()>
*/
/n_Parser/nS_Parser/proc/GetOperator(O, type=/node/expression/op, L[])
/datum/n_Parser/nS_Parser/proc/GetOperator(O, type=/datum/node/expression/op, L[])
if(istype(O, type)) return O //O is already the desired type
if(istype(O, /token)) O=O:value //sets O to text
if(istype(O, /datum/token)) O=O:value //sets O to text
if(istext(O)) //sets O to path
if(L.Find(O)) O=L[O]
else return null
@@ -107,8 +107,8 @@ See Also:
- <GetOperator()>
- <GetUnaryOperator()>
*/
/n_Parser/nS_Parser/proc/GetBinaryOperator(O)
return GetOperator(O, /node/expression/op/binary, options.binary_operators)
/datum/n_Parser/nS_Parser/proc/GetBinaryOperator(O)
return GetOperator(O, /datum/node/expression/op/binary, options.binary_operators)
/*
Proc: GetUnaryOperator
@@ -119,24 +119,24 @@ See Also:
- <GetOperator()>
- <GetBinaryOperator()>
*/
/n_Parser/nS_Parser/proc/GetUnaryOperator(O)
return GetOperator(O, /node/expression/op/unary, options.unary_operators)
/datum/n_Parser/nS_Parser/proc/GetUnaryOperator(O)
return GetOperator(O, /datum/node/expression/op/unary, options.unary_operators)
/*
Proc: Reduce
Takes the operator on top of the opr stack and assigns its operand(s). Then this proc pushes the value of that operation to the top
of the val stack.
*/
/n_Parser/nS_Parser/proc/Reduce(stack/opr, stack/val)
var/node/expression/op/O=opr.Pop()
/datum/n_Parser/nS_Parser/proc/Reduce(datum/stack/opr, datum/stack/val)
var/datum/node/expression/op/O=opr.Pop()
if(!O) return
if(!istype(O))
errors+=new/scriptError("Error reducing expression - invalid operator.")
errors+=new/datum/scriptError("Error reducing expression - invalid operator.")
return
//Take O and assign its operands, popping one or two values from the val stack
//depending on whether O is a binary or unary operator.
if(istype(O, /node/expression/op/binary))
var/node/expression/op/binary/B=O
if(istype(O, /datum/node/expression/op/binary))
var/datum/node/expression/op/binary/B=O
B.exp2=val.Pop()
B.exp =val.Pop()
val.Push(B)
@@ -151,12 +151,12 @@ Returns true if the current token represents the end of an expression.
Parameters:
end - A list of values to compare the current token to.
*/
/n_Parser/nS_Parser/proc/EndOfExpression(end[])
/datum/n_Parser/nS_Parser/proc/EndOfExpression(end[])
if(!curToken)
return 1
if(istype(curToken, /token/symbol) && end.Find(curToken.value))
if(istype(curToken, /datum/token/symbol) && end.Find(curToken.value))
return 1
if(istype(curToken, /token/end) && end.Find(/token/end))
if(istype(curToken, /datum/token/end) && end.Find(/datum/token/end))
return 1
return 0
@@ -177,43 +177,43 @@ See Also:
- <ParseParenExpression()>
- <ParseParamExpression()>
*/
/n_Parser/nS_Parser/proc/ParseExpression(list/end=list(/token/end), list/ErrChars=list("{", "}"))
var/stack/opr=new
var/stack/val=new
/datum/n_Parser/nS_Parser/proc/ParseExpression(list/end=list(/datum/token/end), list/ErrChars=list("{", "}"))
var/datum/stack/opr=new
var/datum/stack/val=new
src.expecting=VALUE
while(TRUE)
if(EndOfExpression(end))
break
if(istype(curToken, /token/symbol) && ErrChars.Find(curToken.value))
errors+=new/scriptError/BadToken(curToken)
if(istype(curToken, /datum/token/symbol) && ErrChars.Find(curToken.value))
errors+=new/datum/scriptError/BadToken(curToken)
break
if(index>tokens.len) //End of File
errors+=new/scriptError/EndOfFile()
errors+=new/datum/scriptError/EndOfFile()
break
var/token/ntok
var/datum/token/ntok
if(index+1<=tokens.len)
ntok=tokens[index+1]
if(istype(curToken, /token/symbol) && curToken.value=="(") //Parse parentheses expression
if(istype(curToken, /datum/token/symbol) && curToken.value=="(") //Parse parentheses expression
if(expecting!=VALUE)
errors+=new/scriptError/ExpectedToken("operator", curToken)
errors+=new/datum/scriptError/ExpectedToken("operator", curToken)
NextToken()
continue
val.Push(ParseParenExpression())
else if(istype(curToken, /token/symbol)) //Operator found.
var/node/expression/op/curOperator //Figure out whether it is unary or binary and get a new instance.
else if(istype(curToken, /datum/token/symbol)) //Operator found.
var/datum/node/expression/op/curOperator //Figure out whether it is unary or binary and get a new instance.
if(src.expecting==OPERATOR)
curOperator=GetBinaryOperator(curToken)
if(!curOperator)
errors+=new/scriptError/ExpectedToken("operator", curToken)
errors+=new/datum/scriptError/ExpectedToken("operator", curToken)
NextToken()
continue
else
curOperator=GetUnaryOperator(curToken)
if(!curOperator) //given symbol isn't a unary operator
errors+=new/scriptError/ExpectedToken("expression", curToken)
errors+=new/datum/scriptError/ExpectedToken("expression", curToken)
NextToken()
continue
@@ -222,31 +222,31 @@ See Also:
continue
opr.Push(curOperator)
src.expecting=VALUE
else if(ntok && ntok.value=="(" && istype(ntok, /token/symbol)\
&& istype(curToken, /token/word)) //Parse function call
var/token/preToken=curToken
else if(ntok && ntok.value=="(" && istype(ntok, /datum/token/symbol)\
&& istype(curToken, /datum/token/word)) //Parse function call
var/datum/token/preToken=curToken
var/old_expect=src.expecting
var/fex=ParseFunctionExpression()
if(old_expect!=VALUE)
errors+=new/scriptError/ExpectedToken("operator", preToken)
errors+=new/datum/scriptError/ExpectedToken("operator", preToken)
NextToken()
continue
val.Push(fex)
else if(istype(curToken, /token/keyword)) //inline keywords
var/n_Keyword/kw=options.keywords[curToken.value]
else if(istype(curToken, /datum/token/keyword)) //inline keywords
var/datum/n_Keyword/kw=options.keywords[curToken.value]
kw=new kw(inline=1)
if(kw)
if(!kw.Parse(src))
return
else
errors+=new/scriptError/BadToken(curToken)
else if(istype(curToken, /token/end)) //semicolon found where it wasn't expected
errors+=new/scriptError/BadToken(curToken)
errors+=new/datum/scriptError/BadToken(curToken)
else if(istype(curToken, /datum/token/end)) //semicolon found where it wasn't expected
errors+=new/datum/scriptError/BadToken(curToken)
NextToken()
continue
else
if(expecting!=VALUE)
errors+=new/scriptError/ExpectedToken("operator", curToken)
errors+=new/datum/scriptError/ExpectedToken("operator", curToken)
NextToken()
continue
val.Push(GetExpression(curToken))
@@ -256,8 +256,8 @@ See Also:
while(opr.Top()) Reduce(opr, val) //Reduce the value stack completely
.=val.Pop() //Return what should be the last value on the stack
if(val.Top()) //
var/node/N=val.Pop()
errors+=new/scriptError("Error parsing expression. Unexpected value left on stack: [N.ToString()].")
var/datum/node/N=val.Pop()
errors+=new/datum/scriptError("Error parsing expression. Unexpected value left on stack: [N.ToString()].")
return null
/*
@@ -267,8 +267,8 @@ Parses a function call inside of an expression.
See Also:
- <ParseExpression()>
*/
/n_Parser/nS_Parser/proc/ParseFunctionExpression()
var/node/expression/FunctionCall/exp=new
/datum/n_Parser/nS_Parser/proc/ParseFunctionExpression()
var/datum/node/expression/FunctionCall/exp=new
exp.func_name=curToken.value
NextToken() //skip function name
NextToken() //skip open parenthesis, already found
@@ -279,12 +279,12 @@ See Also:
if(loops>=1000)
CRASH("Something TERRIBLE has gone wrong in ParseFunctionExpression ;__;")
if(istype(curToken, /token/symbol) && curToken.value==")")
if(istype(curToken, /datum/token/symbol) && curToken.value==")")
return exp
exp.parameters+=ParseParamExpression()
if(curToken.value==","&&istype(curToken, /token/symbol))NextToken() //skip comma
if(istype(curToken, /token/end)) //Prevents infinite loop...
errors+=new/scriptError/ExpectedToken(")")
if(curToken.value==","&&istype(curToken, /datum/token/symbol))NextToken() //skip comma
if(istype(curToken, /datum/token/end)) //Prevents infinite loop...
errors+=new/datum/scriptError/ExpectedToken(")")
return exp
/*
@@ -294,10 +294,10 @@ Parses an expression that ends with a close parenthesis. This is used for parsin
See Also:
- <ParseExpression()>
*/
/n_Parser/nS_Parser/proc/ParseParenExpression()
if(!CheckToken("(", /token/symbol))
/datum/n_Parser/nS_Parser/proc/ParseParenExpression()
if(!CheckToken("(", /datum/token/symbol))
return
return new/node/expression/op/unary/group(ParseExpression(list(")")))
return new/datum/node/expression/op/unary/group(ParseExpression(list(")")))
/*
Proc: ParseParamExpression
@@ -306,7 +306,7 @@ Parses an expression that ends with either a comma or close parenthesis. This is
See Also:
- <ParseExpression()>
*/
/n_Parser/nS_Parser/proc/ParseParamExpression()
/datum/n_Parser/nS_Parser/proc/ParseParamExpression()
return ParseExpression(list(",", ")"))
#undef OPERATOR
+40 -40
View File
@@ -12,9 +12,9 @@
Var: inline
1 if the keyword is in an expression (e.g. the new keyword in many languages), 0 otherwise (such as the if and else keywords).
*/
/n_Keyword
/datum/n_Keyword
var/inline
/n_Keyword/New(inline=FALSE)
/datum/n_Keyword/New(inline=FALSE)
src.inline=inline
return ..()
@@ -26,7 +26,7 @@
parser - The parser that created this object. You can use the parameter to manipulate the parser in order to add statements and blocks
to its AST.
*/
/n_Keyword/proc/Parse(n_Parser/parser)
/datum/n_Keyword/proc/Parse(datum/n_Parser/parser)
/*
Class: nS_Keyword
@@ -38,118 +38,118 @@
<n_Keyword.Parse()> proc.
*/
//
/n_Keyword/nS_Keyword/New(inline=0)
/datum/n_Keyword/nS_Keyword/New(inline=0)
if(inline)
qdel(src)
/n_Keyword/nS_Keyword/kwReturn/Parse(n_Parser/nS_Parser/parser)
/datum/n_Keyword/nS_Keyword/kwReturn/Parse(datum/n_Parser/nS_Parser/parser)
.=KW_PASS
if(istype(parser.curBlock, /node/BlockDefinition/GlobalBlock))
parser.errors+=new/scriptError/BadReturn(parser.curToken)
if(istype(parser.curBlock, /datum/node/BlockDefinition/GlobalBlock))
parser.errors+=new/datum/scriptError/BadReturn(parser.curToken)
. = KW_WARN
var/node/statement/ReturnStatement/stmt=new
var/datum/node/statement/ReturnStatement/stmt=new
parser.NextToken() //skip 'return' token
stmt.value=parser.ParseExpression()
parser.curBlock.statements+=stmt
/n_Keyword/nS_Keyword/kwIf/Parse(n_Parser/nS_Parser/parser)
/datum/n_Keyword/nS_Keyword/kwIf/Parse(datum/n_Parser/nS_Parser/parser)
.=KW_PASS
var/node/statement/IfStatement/stmt=new
var/datum/node/statement/IfStatement/stmt=new
parser.NextToken() //skip 'if' token
stmt.cond=parser.ParseParenExpression()
if(!parser.CheckToken(")", /token/symbol))
if(!parser.CheckToken(")", /datum/token/symbol))
return KW_FAIL
if(!parser.CheckToken("{", /token/symbol, skip=0)) //Token needs to be preserved for parse loop, so skip=0
if(!parser.CheckToken("{", /datum/token/symbol, skip=0)) //Token needs to be preserved for parse loop, so skip=0
return KW_ERR
parser.curBlock.statements+=stmt
stmt.block=new
parser.AddBlock(stmt.block)
/n_Keyword/nS_Keyword/kwElse/Parse(n_Parser/nS_Parser/parser)
/datum/n_Keyword/nS_Keyword/kwElse/Parse(datum/n_Parser/nS_Parser/parser)
.=KW_PASS
var/list/L=parser.curBlock.statements
var/node/statement/IfStatement/stmt
var/datum/node/statement/IfStatement/stmt
if(L&&L.len) stmt=L[L.len] //Get the last statement in the current block
if(!stmt || !istype(stmt) || stmt.else_block) //Ensure that it is an if statement
parser.errors+=new/scriptError/ExpectedToken("if statement",parser.curToken)
parser.errors+=new/datum/scriptError/ExpectedToken("if statement",parser.curToken)
return KW_FAIL
parser.NextToken() //skip 'else' token
if(!parser.CheckToken("{", /token/symbol, skip=0))
if(!parser.CheckToken("{", /datum/token/symbol, skip=0))
return KW_ERR
stmt.else_block=new()
parser.AddBlock(stmt.else_block)
/n_Keyword/nS_Keyword/kwWhile/Parse(n_Parser/nS_Parser/parser)
/datum/n_Keyword/nS_Keyword/kwWhile/Parse(datum/n_Parser/nS_Parser/parser)
.=KW_PASS
var/node/statement/WhileLoop/stmt=new
var/datum/node/statement/WhileLoop/stmt=new
parser.NextToken() //skip 'while' token
stmt.cond=parser.ParseParenExpression()
if(!parser.CheckToken(")", /token/symbol))
if(!parser.CheckToken(")", /datum/token/symbol))
return KW_FAIL
if(!parser.CheckToken("{", /token/symbol, skip=0))
if(!parser.CheckToken("{", /datum/token/symbol, skip=0))
return KW_ERR
parser.curBlock.statements+=stmt
stmt.block=new
parser.AddBlock(stmt.block)
/n_Keyword/nS_Keyword/kwBreak/Parse(n_Parser/nS_Parser/parser)
/datum/n_Keyword/nS_Keyword/kwBreak/Parse(datum/n_Parser/nS_Parser/parser)
.=KW_PASS
if(istype(parser.curBlock, /node/BlockDefinition/GlobalBlock))
parser.errors+=new/scriptError/BadToken(parser.curToken)
if(istype(parser.curBlock, /datum/node/BlockDefinition/GlobalBlock))
parser.errors+=new/datum/scriptError/BadToken(parser.curToken)
. = KW_WARN
var/node/statement/BreakStatement/stmt=new
var/datum/node/statement/BreakStatement/stmt=new
parser.NextToken() //skip 'break' token
parser.curBlock.statements+=stmt
/n_Keyword/nS_Keyword/kwContinue/Parse(n_Parser/nS_Parser/parser)
/datum/n_Keyword/nS_Keyword/kwContinue/Parse(datum/n_Parser/nS_Parser/parser)
.=KW_PASS
if(istype(parser.curBlock, /node/BlockDefinition/GlobalBlock))
parser.errors+=new/scriptError/BadToken(parser.curToken)
if(istype(parser.curBlock, /datum/node/BlockDefinition/GlobalBlock))
parser.errors+=new/datum/scriptError/BadToken(parser.curToken)
. = KW_WARN
var/node/statement/ContinueStatement/stmt=new
var/datum/node/statement/ContinueStatement/stmt=new
parser.NextToken() //skip 'break' token
parser.curBlock.statements+=stmt
/n_Keyword/nS_Keyword/kwDef/Parse(n_Parser/nS_Parser/parser)
/datum/n_Keyword/nS_Keyword/kwDef/Parse(datum/n_Parser/nS_Parser/parser)
.=KW_PASS
var/node/statement/FunctionDefinition/def=new
var/datum/node/statement/FunctionDefinition/def=new
parser.NextToken() //skip 'def' token
if(!parser.options.IsValidID(parser.curToken.value))
parser.errors+=new/scriptError/InvalidID(parser.curToken)
parser.errors+=new/datum/scriptError/InvalidID(parser.curToken)
return KW_FAIL
def.func_name=parser.curToken.value
parser.NextToken()
if(!parser.CheckToken("(", /token/symbol))
if(!parser.CheckToken("(", /datum/token/symbol))
return KW_FAIL
while(TRUE) //for now parameters can be separated by whitespace - they don't need a comma in between
if(istype(parser.curToken, /token/symbol))
if(istype(parser.curToken, /datum/token/symbol))
switch(parser.curToken.value)
if(",")
parser.NextToken()
if(")")
break
else
parser.errors+=new/scriptError/BadToken(parser.curToken)
parser.errors+=new/datum/scriptError/BadToken(parser.curToken)
return KW_ERR
else if(istype(parser.curToken, /token/word))
else if(istype(parser.curToken, /datum/token/word))
def.parameters+=parser.curToken.value
parser.NextToken()
else
parser.errors+=new/scriptError/InvalidID(parser.curToken)
parser.errors+=new/datum/scriptError/InvalidID(parser.curToken)
return KW_ERR
if(!parser.CheckToken(")", /token/symbol))
if(!parser.CheckToken(")", /datum/token/symbol))
return KW_FAIL
if(istype(parser.curToken, /token/end)) //Function prototype
if(istype(parser.curToken, /datum/token/end)) //Function prototype
parser.curBlock.statements+=def
else if(parser.curToken.value=="{" && istype(parser.curToken, /token/symbol))
else if(parser.curToken.value=="{" && istype(parser.curToken, /datum/token/symbol))
def.block = new
parser.curBlock.statements+=def
parser.curBlock.functions[def.func_name]=def
parser.AddBlock(def.block)
else
parser.errors+=new/scriptError/BadToken(parser.curToken)
parser.errors+=new/datum/scriptError/BadToken(parser.curToken)
return KW_FAIL
#undef KW_FAIL
+44 -44
View File
@@ -5,7 +5,7 @@
Class: n_Parser
An object that reads tokens and produces an AST (abstract syntax tree).
*/
/n_Parser
/datum/n_Parser
var/index = 1
/*
Var: index
@@ -33,22 +33,22 @@
Var: curToken
The token at <index> in <tokens>.
*/
var/token/curToken
var/stack/blocks=new
var/node/BlockDefinition/GlobalBlock/global_block=new
var/node/BlockDefinition/curBlock
var/datum/token/curToken
var/datum/stack/blocks=new
var/datum/node/BlockDefinition/GlobalBlock/global_block=new
var/datum/node/BlockDefinition/curBlock
/*
Proc: Parse
Reads the tokens and returns the AST's <GlobalBlock> node. Be sure to populate the tokens list before calling this procedure.
*/
/n_Parser/proc/Parse()
/datum/n_Parser/proc/Parse()
/*
Proc: NextToken
Sets <curToken> to the next token in the <tokens> list, or null if there are no more tokens.
*/
/n_Parser/proc/NextToken()
/datum/n_Parser/proc/NextToken()
if(index>=tokens.len)
curToken=null
else
@@ -59,8 +59,8 @@
Class: nS_Parser
An implmentation of a parser for n_Script.
*/
/n_Parser/nS_Parser
var/n_scriptOptions/nS_Options/options
/datum/n_Parser/nS_Parser
var/datum/n_scriptOptions/nS_Options/options
/*
Constructor: New
@@ -68,101 +68,101 @@
tokens - A list of tokens to parse.
options - An object used for configuration.
*/
/n_Parser/nS_Parser/New(tokens[], n_scriptOptions/options)
/datum/n_Parser/nS_Parser/New(tokens[], datum/n_scriptOptions/options)
src.tokens=tokens
src.options=options
curBlock=global_block
return ..()
/n_Parser/nS_Parser/Parse()
/datum/n_Parser/nS_Parser/Parse()
ASSERT(tokens)
for(,src.index<=src.tokens.len, src.index++)
curToken=tokens[index]
switch(curToken.type)
if(/token/keyword)
var/n_Keyword/kw=options.keywords[curToken.value]
if(/datum/token/keyword)
var/datum/n_Keyword/kw=options.keywords[curToken.value]
kw=new kw()
if(kw)
if(!kw.Parse(src))
return
if(/token/word)
var/token/ntok
if(/datum/token/word)
var/datum/token/ntok
if(index+1>tokens.len)
errors+=new/scriptError/BadToken(curToken)
errors+=new/datum/scriptError/BadToken(curToken)
continue
ntok=tokens[index+1]
if(!istype(ntok, /token/symbol))
errors+=new/scriptError/BadToken(ntok)
if(!istype(ntok, /datum/token/symbol))
errors+=new/datum/scriptError/BadToken(ntok)
continue
if(ntok.value=="(")
ParseFunctionStatement()
else if(options.assign_operators.Find(ntok.value))
ParseAssignment()
else
errors+=new/scriptError/BadToken(ntok)
errors+=new/datum/scriptError/BadToken(ntok)
continue
if(!istype(curToken, /token/end))
errors+=new/scriptError/ExpectedToken(";", curToken)
if(!istype(curToken, /datum/token/end))
errors+=new/datum/scriptError/ExpectedToken(";", curToken)
continue
if(/token/symbol)
if(/datum/token/symbol)
if(curToken.value=="}")
if(!EndBlock())
errors+=new/scriptError/BadToken(curToken)
errors+=new/datum/scriptError/BadToken(curToken)
continue
else
errors+=new/scriptError/BadToken(curToken)
errors+=new/datum/scriptError/BadToken(curToken)
continue
if(/token/end)
warnings+=new/scriptError/BadToken(curToken)
if(/datum/token/end)
warnings+=new/datum/scriptError/BadToken(curToken)
continue
else
errors+=new/scriptError/BadToken(curToken)
errors+=new/datum/scriptError/BadToken(curToken)
return
return global_block
/n_Parser/nS_Parser/proc/CheckToken(val, type, err=1, skip=1)
/datum/n_Parser/nS_Parser/proc/CheckToken(val, type, err=1, skip=1)
if(curToken.value!=val || !istype(curToken,type))
if(err)
errors+=new/scriptError/ExpectedToken(val, curToken)
errors+=new/datum/scriptError/ExpectedToken(val, curToken)
return 0
if(skip)NextToken()
return 1
/n_Parser/nS_Parser/proc/AddBlock(node/BlockDefinition/B)
/datum/n_Parser/nS_Parser/proc/AddBlock(datum/node/BlockDefinition/B)
blocks.Push(curBlock)
curBlock=B
/n_Parser/nS_Parser/proc/EndBlock()
/datum/n_Parser/nS_Parser/proc/EndBlock()
if(curBlock==global_block) return 0
curBlock=blocks.Pop()
return 1
/n_Parser/nS_Parser/proc/ParseAssignment()
/datum/n_Parser/nS_Parser/proc/ParseAssignment()
var/name=curToken.value
if(!options.IsValidID(name))
errors+=new/scriptError/InvalidID(curToken)
errors+=new/datum/scriptError/InvalidID(curToken)
return
NextToken()
var/t=options.binary_operators[options.assign_operators[curToken.value]]
var/node/statement/VariableAssignment/stmt=new()
var/datum/node/statement/VariableAssignment/stmt=new()
stmt.var_name=new(name)
NextToken()
if(t)
stmt.value=new t()
stmt.value:exp=new/node/expression/value/variable(stmt.var_name)
stmt.value:exp=new/datum/node/expression/value/variable(stmt.var_name)
stmt.value:exp2=ParseExpression()
else
stmt.value=ParseExpression()
curBlock.statements+=stmt
/n_Parser/nS_Parser/proc/ParseFunctionStatement()
if(!istype(curToken, /token/word))
errors+=new/scriptError("Bad identifier in function call.")
/datum/n_Parser/nS_Parser/proc/ParseFunctionStatement()
if(!istype(curToken, /datum/token/word))
errors+=new/datum/scriptError("Bad identifier in function call.")
return
var/node/statement/FunctionCall/stmt=new
var/datum/node/statement/FunctionCall/stmt=new
stmt.func_name=curToken.value
NextToken() //skip function name
if(!CheckToken("(", /token/symbol)) //Check for and skip open parenthesis
if(!CheckToken("(", /datum/token/symbol)) //Check for and skip open parenthesis
return
var/loops = 0
while(TRUE)
@@ -171,12 +171,12 @@
CRASH("Something TERRIBLE has gone wrong in ParseFunctionStatement ;__;")
if(!curToken)
errors+=new/scriptError/EndOfFile()
errors+=new/datum/scriptError/EndOfFile()
return
if(istype(curToken, /token/symbol) && curToken.value==")")
if(istype(curToken, /datum/token/symbol) && curToken.value==")")
curBlock.statements+=stmt
NextToken() //Skip close parenthesis
return
var/node/expression/P=ParseParamExpression()
var/datum/node/expression/P=ParseParamExpression()
stmt.parameters+=P
if(istype(curToken, /token/symbol) && curToken.value==",") NextToken()
if(istype(curToken, /datum/token/symbol) && curToken.value==",") NextToken()