diff --git a/code/game/machinery/telecomms/server.dm b/code/game/machinery/telecomms/server.dm index ea7c5de0d0b..a3564c45bb3 100644 --- a/code/game/machinery/telecomms/server.dm +++ b/code/game/machinery/telecomms/server.dm @@ -16,10 +16,6 @@ var/max_logs = 400 // maximum number of logs var/log_cull_count = 10 // number of logs to cull at a time var/totaltraffic = 0 // gigabytes (if > 1024, divide by 1024 -> terrabytes) - var/list/memory = list() // stored memory - var/rawcode = "" // the code to compile (raw text) - var/datum/TCS_Compiler/Compiler // the compiler that compiles and runs the code - var/autoruncode = FALSE // TRUE if the code is set to run every time a signal is picked up var/encryption = "null" // encryption key: ie "password" var/salt = "null" // encryption salt: ie "123comsat" var/obj/item/radio/headset/server_radio @@ -27,14 +23,11 @@ /obj/machinery/telecomms/server/Destroy() QDEL_NULL_LIST(log_entries) - QDEL_NULL(Compiler) QDEL_NULL(server_radio) return ..() /obj/machinery/telecomms/server/Initialize() - Compiler = new - Compiler.Holder = src server_radio = new return ..() @@ -94,8 +87,6 @@ signal.data["server"] = src var/identifier = num2text(rand(-1000, 1000) + world.time) log.name = "data packet ([sha1(identifier)])" - if (autoruncode && Compiler) - Compiler.Run(signal) var/send_success = relay_information(signal, /obj/machinery/telecomms/hub) if (!send_success) relay_information(signal, /obj/machinery/telecomms/broadcaster) @@ -112,15 +103,6 @@ update_logs() -/obj/machinery/telecomms/server/proc/compile() - return Compiler?.Compile(rawcode) - - -/obj/machinery/telecomms/server/proc/setcode(text) - if (istext(text)) - rawcode = text - - /obj/machinery/telecomms/server/proc/update_logs() if (logs >= max_logs) log_entries.Cut(0, log_cull_count) diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm deleted file mode 100644 index e1717b8ad9d..00000000000 --- a/code/game/machinery/telecomms/traffic_control.dm +++ /dev/null @@ -1,177 +0,0 @@ -/obj/machinery/computer/telecomms/traffic - name = "Telecommunications Traffic Control" - desc = "Used to upload code to telecommunication consoles for execution." - icon_screen = "generic" - icon_keyboard = "tech_key" - circuit = /obj/item/circuitboard/comm_traffic - req_access = list(access_tcomsat) - var/const/SCREEN_MAIN_MENU = 0 - var/const/SCREEN_VIEW_SERVER = 1 - var/screen = SCREEN_MAIN_MENU - var/list/servers = list() // the servers located by the computer - var/mob/editingcode - var/mob/lasteditor - var/list/viewingcode = list() - var/obj/machinery/telecomms/server/SelectedServer - var/network = "NULL" // the network to probe - var/temp = "" // temporary feedback messages - var/storedcode = "" // code stored - - -/obj/machinery/computer/telecomms/traffic/Destroy() - if (editingcode) - winshow(editingcode, "Telecomms IDE", FALSE) - editingcode.unset_machine() - editingcode = null - for (var/mob/viewer in viewingcode) - winshow(viewer, "Telecomms IDE", FALSE) - viewer.unset_machine() - LAZYCLEARLIST(viewingcode) - SelectedServer = null - return ..() - - -/obj/machinery/computer/telecomms/traffic/attack_hand(mob/user) - if (stat & (BROKEN|NOPOWER)) - return - user.set_machine(src) - var/dat = "Telecommunication Traffic Control
Telecommunications Traffic Control
" - switch(screen) - if (SCREEN_MAIN_MENU) // Main Menu - dat += "
[temp]
" - dat += "
Current Network: [network]
" - if(length(servers)) - dat += "
Detected Telecommunication Servers:" - dat += "
\[Flush Buffer\]" - else - dat += "
No servers detected. Scan for servers: \[Scan\]" - if (SCREEN_VIEW_SERVER) // Viewing Server - dat += "
[temp]
" - dat += "
\[Main Menu\] \[Refresh\]
" - dat += "
Current Network: [network]" - dat += "
Selected Server: [SelectedServer.id]

" - dat += "
\[Edit Code\]" - dat += "
Signal Execution: " - if (SelectedServer.autoruncode) - dat += "ALWAYS" - else - dat += "NEVER" - user << browse(dat, "window=traffic_control;size=575x400") - onclose(user, "server_control") - temp = "" - return - - -/obj/machinery/computer/telecomms/traffic/emag_act(remaining_charges, mob/user) - if (emagged) - return - playsound(src, 'sound/effects/sparks4.ogg', 75, TRUE) - emagged = TRUE - to_chat(user, SPAN_NOTICE("You you disable the security protocols")) - updateUsrDialog() - return 1 - - -/obj/machinery/computer/telecomms/traffic/Topic(href, href_list) - if (..()) - return - add_fingerprint(usr) - usr.set_machine(src) - if (!emagged && !allowed(usr)) - to_chat(usr, "ACCESS DENIED.") - return - if (href_list["viewserver"]) - screen = SCREEN_VIEW_SERVER - for (var/obj/machinery/telecomms/machine in servers) - if(machine.id == href_list["viewserver"]) - SelectedServer = machine - break - if (href_list["operation"]) - switch (href_list["operation"]) - if ("release") - servers = list() - screen = SCREEN_MAIN_MENU - if ("mainmenu") - screen = SCREEN_MAIN_MENU - if ("scan") - if(length(servers)) - temp = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -" - else - for (var/obj/machinery/telecomms/server/server in range(25, src)) - if (server.network == network) - servers += server - if(!length(servers)) - temp = "- 0 SERVERS PROBED & BUFFERED -" - else - temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -" - screen = SCREEN_MAIN_MENU - if ("editcode") - if (editingcode == usr) - return - if (usr in viewingcode) - return - if (!editingcode) - lasteditor = usr - editingcode = usr - winshow(editingcode, "Telecomms IDE", TRUE) - winset(editingcode, "tcscode", "is-disabled=false") - winset(editingcode, "tcscode", "text=\"\"") - var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") - showcode = replacetext(storedcode, "\"", "\\\"") - winset(editingcode, "tcscode", "text=\"[showcode]\"") - spawn() - update_ide() - else - viewingcode += usr - winshow(usr, "Telecomms IDE", TRUE) - winset(usr, "tcscode", "is-disabled=true") - winset(editingcode, "tcscode", "text=\"\"") - var/showcode = replacetext(storedcode, "\"", "\\\"") - winset(usr, "tcscode", "text=\"[showcode]\"") - if ("togglerun") - SelectedServer.autoruncode = !(SelectedServer.autoruncode) - if (href_list["network"]) - var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null | text - if(newnet && (issilicon(usr) || (usr in range(1, src)))) - if(length(newnet) > 15) - temp = "- FAILED: NETWORK TAG STRING TOO LENGHTY -" - else - network = newnet - screen = SCREEN_MAIN_MENU - servers = list() - temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -" - updateUsrDialog() - - -/obj/machinery/computer/telecomms/traffic/proc/update_ide() - while (editingcode) - if (!editingcode.client) - editingcode = null - break - if (editingcode) - storedcode = "[winget(editingcode, "tcscode", "text")]" - if (editingcode) - winset(editingcode, "tcscode", "is-disabled=false") - if (!issilicon(editingcode) && (editingcode.machine != src || !(editingcode in range(1, src)))) - if (editingcode) - winshow(editingcode, "Telecomms IDE", FALSE) - editingcode = null - break - if (length(viewingcode)) - var/showcode = replacetext(storedcode, "\\\"", "\\\\\"") - showcode = replacetext(storedcode, "\"", "\\\"") - for (var/mob/viewer in viewingcode) - if (issilicon(viewer) || (viewer.machine == src && (viewer in view(1, src)))) - winset(viewer, "tcscode", "is-disabled=true") - winset(viewer, "tcscode", "text=\"[showcode]\"") - else - viewingcode -= viewer - winshow(viewer, "Telecomms IDE", FALSE) - sleep(5) - if (length(viewingcode)) - editingcode = pick(viewingcode) - viewingcode -= editingcode - update_ide() diff --git a/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm b/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm index f9bfcb5364c..075b2770aa0 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/telecomms.dm @@ -1,5 +1,5 @@ #ifndef T_BOARD -#error T_BOARD macro is not defined but we need it! +#error T_BOARD macro is not defined but we need it! #endif /obj/item/circuitboard/comm_monitor @@ -11,8 +11,3 @@ name = T_BOARD("telecommunications server monitor console") build_path = /obj/machinery/computer/telecomms/server origin_tech = list(TECH_DATA = 3) - -/obj/item/circuitboard/comm_traffic - name = T_BOARD("telecommunications traffic control console") - build_path = /obj/machinery/computer/telecomms/traffic - origin_tech = list(TECH_DATA = 3) diff --git a/code/modules/scripting/AST/AST Nodes.dm b/code/modules/scripting/AST/AST Nodes.dm deleted file mode 100644 index 6a8346fc087..00000000000 --- a/code/modules/scripting/AST/AST Nodes.dm +++ /dev/null @@ -1,127 +0,0 @@ -/* - File: AST Nodes - An abstract syntax tree (AST) is a representation of source code in a computer-friendly format. It is composed of nodes, - each of which represents a certain part of the source code. For example, an node represents an if statement in the - script's source code. Because it is a representation of the source code in memory, it is independent of any specific scripting language. - This allows a script in any language for which a parser exists to be run by the interpreter. - - The AST is produced by an object. It consists of a with an arbitrary amount of statements. These statements are - run in order by an object. A statement may in turn run another block (such as an if statement might if its condition is - met). - - Articles: - - -*/ - -/* - Constants: Operator Precedence - OOP_OR - Logical or - OOP_AND - Logical and - OOP_BIT - Bitwise operations - OOP_EQUAL - Equality checks - OOP_COMPARE - Greater than, less then, etc - OOP_ADD - Addition and subtraction - OOP_MULTIPLY - Multiplication and division - OOP_POW - Exponents - OOP_UNARY - Unary Operators - OOP_GROUP - Parentheses -*/ -var/global/const/OOP_OR = 1 //|| -var/global/const/OOP_AND = OOP_OR + 1 //&& -var/global/const/OOP_BIT = OOP_AND + 1 //&, | -var/global/const/OOP_EQUAL = OOP_BIT + 1 //==, != -var/global/const/OOP_COMPARE = OOP_EQUAL + 1 //>, <, >=, <= -var/global/const/OOP_ADD = OOP_COMPARE + 1 //+, - -var/global/const/OOP_MULTIPLY= OOP_ADD + 1 //*, /, % -var/global/const/OOP_POW = OOP_MULTIPLY+ 1 //^ -var/global/const/OOP_UNARY = OOP_POW + 1 //! -var/global/const/OOP_GROUP = OOP_UNARY + 1 //() - -/* - Class: node -*/ -/node/proc/ToString() - return "[src.type]" -/* - Class: identifier -*/ -/node/identifier - var/id_name - -/node/identifier/New(id) - .=..() - src.id_name=id - -/node/identifier/ToString() - return id_name - -/* - Class: expression -*/ -/node/expression -/* - Class: operator - See and for subtypes. -*/ -/node/expression/operator - var/node/expression/exp - var/name - var/precedence - -/node/expression/operator/New() - .=..() - if(!src.name) src.name="[src.type]" - -/node/expression/operator/ToString() - return "operator: [name]" - -/* - Class: FunctionCall -*/ -/node/expression/FunctionCall - //Function calls can also be expressions or statements. - var/func_name - var/node/identifier/object - var/list/parameters = list() - -/* - Class: literal -*/ -/node/expression/value/literal - var/value - -/node/expression/value/literal/New(value) - .=..() - src.value=value - -/node/expression/value/literal/ToString() - return src.value - -/* - Class: variable -*/ -/node/expression/value/variable - var/node/object //Either a node/identifier or another node/expression/value/variable which points to the object - var/node/identifier/id - - -/node/expression/value/variable/New(ident) - .=..() - id=ident - if(istext(id))id=new(id) - -/node/expression/value/variable/ToString() - return src.id.ToString() - -/* - Class: reference -*/ -/node/expression/value/reference - var/datum/value - -/node/expression/value/reference/New(value) - .=..() - src.value=value - -/node/expression/value/reference/ToString() - return "ref: [src.value] ([src.value.type])" diff --git a/code/modules/scripting/AST/Blocks.dm b/code/modules/scripting/AST/Blocks.dm deleted file mode 100644 index c992d7b4fa1..00000000000 --- a/code/modules/scripting/AST/Blocks.dm +++ /dev/null @@ -1,45 +0,0 @@ -/* - File: Block Types -*/ -/* - Class: BlockDefinition - An object representing a set of actions to perform independently from the rest of the script. Blocks are basically just - lists of statements to execute which also contain some local variables and methods. Note that since functions are local to a block, - it is possible to have a function definition inside of any type of block (such as in an if statement or another function), - and not just in the global scope as in many languages. -*/ -/node/BlockDefinition - var/list/statements = list() - var/list/functions = list() - var/list/initial_variables = list() - -/* - Proc: SetVar - Defines a permanent variable. The variable will not be deleted when it goes out of scope. - - Notes: - Since all pre-existing temporary variables are deleted, it is not generally desirable to use this proc after the interpreter has been instantiated. - Instead, use . - - See Also: - - -*/ -/node/BlockDefinition/proc/SetVar(name, value) - initial_variables[name]=value - - -/* - Class: GlobalBlock - A block object representing the global scope. -*/ -// -/node/BlockDefinition/GlobalBlock/New() - initial_variables["null"]=null - return ..() - -/* - Class: FunctionBlock - A block representing a function body. -*/ -// -/node/BlockDefinition/FunctionBlock \ No newline at end of file diff --git a/code/modules/scripting/AST/Operators/Binary Operators.dm b/code/modules/scripting/AST/Operators/Binary Operators.dm deleted file mode 100644 index e191ba348c7..00000000000 --- a/code/modules/scripting/AST/Operators/Binary Operators.dm +++ /dev/null @@ -1,174 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 - -/* - File: Binary Operators -*/ -/* - Class: binary - Represents a binary operator in the AST. A binary operator takes two operands (ie x and y) and returns a value. -*/ -/node/expression/operator/binary - var/node/expression/exp2 - -////////// Comparison Operators ////////// -/* - Class: Equal - Returns true if x = y. -*/ -// -/node/expression/operator/binary/Equal - precedence=OOP_EQUAL - -/* - Class: NotEqual - Returns true if x and y aren't equal. -*/ -// -/node/expression/operator/binary/NotEqual - precedence=OOP_EQUAL - -/* - Class: Greater - Returns true if x > y. -*/ -// -/node/expression/operator/binary/Greater - precedence=OOP_COMPARE - -/* - Class: Less - Returns true if x < y. -*/ -// -/node/expression/operator/binary/Less - precedence=OOP_COMPARE - -/* - Class: GreaterOrEqual - Returns true if x >= y. -*/ -// -/node/expression/operator/binary/GreaterOrEqual - precedence=OOP_COMPARE - -/* - Class: LessOrEqual - Returns true if x <= y. -*/ -// -/node/expression/operator/binary/LessOrEqual - precedence=OOP_COMPARE - - -////////// Logical Operators ////////// - -/* - Class: LogicalAnd - Returns true if x and y are true. -*/ -// -/node/expression/operator/binary/LogicalAnd - precedence=OOP_AND - -/* - Class: LogicalOr - Returns true if x, y, or both are true. -*/ -// -/node/expression/operator/binary/LogicalOr - precedence=OOP_OR - -/* - Class: LogicalXor - Returns true if either x or y but not both are true. -*/ -// -/node/expression/operator/binary/LogicalXor //Not implemented in nS - precedence=OOP_OR - - -////////// Bitwise Operators ////////// - -/* - Class: BitwiseAnd - Performs a bitwise and operation. - - Example: - 011 & 110 = 010 -*/ -// -/node/expression/operator/binary/BitwiseAnd - precedence=OOP_BIT - -/* - Class: BitwiseOr - Performs a bitwise or operation. - - Example: - 011 | 110 = 111 -*/ -// -/node/expression/operator/binary/BitwiseOr - precedence=OOP_BIT - -/* - Class: BitwiseXor - Performs a bitwise exclusive or operation. - - Example: - 011 xor 110 = 101 -*/ -// -/node/expression/operator/binary/BitwiseXor - precedence=OOP_BIT - - -////////// Arithmetic Operators ////////// - -/* - Class: Add - Returns the sum of x and y. -*/ -// -/node/expression/operator/binary/Add - precedence=OOP_ADD - -/* - Class: Subtract - Returns the difference of x and y. -*/ -// -/node/expression/operator/binary/Subtract - precedence=OOP_ADD - -/* - Class: Multiply - Returns the product of x and y. -*/ -// -/node/expression/operator/binary/Multiply - precedence=OOP_MULTIPLY - -/* - Class: Divide - Returns the quotient of x and y. -*/ -// -/node/expression/operator/binary/Divide - precedence=OOP_MULTIPLY - -/* - Class: Power - Returns x raised to the power of y. -*/ -// -/node/expression/operator/binary/Power - precedence=OOP_POW - -/* - Class: Modulo - Returns the remainder of x / y. -*/ -// -/node/expression/operator/binary/Modulo - precedence=OOP_MULTIPLY diff --git a/code/modules/scripting/AST/Operators/Unary Operators.dm b/code/modules/scripting/AST/Operators/Unary Operators.dm deleted file mode 100644 index b49984ba18e..00000000000 --- a/code/modules/scripting/AST/Operators/Unary Operators.dm +++ /dev/null @@ -1,51 +0,0 @@ -/* - File: Unary Operators -*/ -/* - Class: unary - Represents a unary operator in the AST. Unary operators take a single operand (referred to as x below) and return a value. -*/ -/node/expression/operator/unary - precedence=OOP_UNARY - -/* - Class: LogicalNot - Returns !x. - - Example: - !true = false and !false = true -*/ -// -/node/expression/operator/unary/LogicalNot - name="logical not" - -/* - Class: BitwiseNot - Returns the value of a bitwise not operation performed on x. - - Example: - ~10 (decimal 2) = 01 (decimal 1). -*/ -// -/node/expression/operator/unary/BitwiseNot - name="bitwise not" - -/* - Class: Minus - Returns -x. -*/ -// -/node/expression/operator/unary/Minus - name="minus" - -/* - Class: group - A special unary operator representing a value in parentheses. -*/ -// -/node/expression/operator/unary/group - precedence=OOP_GROUP - -/node/expression/operator/unary/New(node/expression/exp) - src.exp=exp - return ..() diff --git a/code/modules/scripting/AST/Statements.dm b/code/modules/scripting/AST/Statements.dm deleted file mode 100644 index eba7b71ae5e..00000000000 --- a/code/modules/scripting/AST/Statements.dm +++ /dev/null @@ -1,106 +0,0 @@ -/* - File: Statement Types -*/ -/* - Class: statement - An object representing a single instruction run by an interpreter. -*/ -/node/statement -/* - Class: FunctionCall - Represents a call to a function. -*/ -// -/node/statement/FunctionCall - var/func_name - var/node/identifier/object - var/list/parameters=list() - -/* - Class: FunctionDefinition - Defines a function. -*/ -// -/node/statement/FunctionDefinition - var/func_name - var/list/parameters=list() - var/node/BlockDefinition/FunctionBlock/block - -/* - Class: VariableAssignment - Sets a variable in an accessible scope to the given value if one exists, otherwise initializes a new local variable to the given value. - - Notes: - If a variable with the same name exists in a higher block, the value will be assigned to it. If not, - a new variable is created in the current block. To force creation of a new variable, use . - - See Also: - - -*/ -// -/node/statement/VariableAssignment - var/node/identifier/object - var/node/identifier/var_name - var/node/expression/value - -/* - Class: VariableDeclaration - Intializes a local variable to a null value. - - See Also: - - -*/ -// -/node/statement/VariableDeclaration - var/node/identifier/object - var/node/identifier/var_name - -/* - Class: IfStatement -*/ -// -/node/statement/IfStatement - var/node/BlockDefinition/block - var/node/BlockDefinition/else_block // may be null - var/node/expression/cond - -/* - Class: WhileLoop - Loops while a given condition is true. -*/ -// -/node/statement/WhileLoop - var/node/BlockDefinition/block - var/node/expression/cond - -/* - Class: ForLoop - Loops while test is true, initializing a variable, increasing the variable -*/ -/node/statement/ForLoop - var/node/BlockDefinition/block - var/node/expression/test - var/node/expression/init - var/node/expression/increment - -/* - Class: BreakStatement - Ends a loop. -*/ -// -/node/statement/BreakStatement - -/* - Class: ContinueStatement - Skips to the next iteration of a loop. -*/ -// -/node/statement/ContinueStatement - -/* - Class: ReturnStatement - Ends the function and returns a value. -*/ -// -/node/statement/ReturnStatement - var/node/expression/value \ No newline at end of file diff --git a/code/modules/scripting/Errors.dm b/code/modules/scripting/Errors.dm deleted file mode 100644 index 8a47bf1c28f..00000000000 --- a/code/modules/scripting/Errors.dm +++ /dev/null @@ -1,122 +0,0 @@ -/* - File: Errors -*/ -/* - Class: scriptError - An error scanning or parsing the source code. -*/ -/scriptError - var/message /// A message describing the problem. -/scriptError/New(msg=null) - if(msg)message=msg - -/scriptError/BadToken - message="Unexpected token: " - var/token/token -/scriptError/BadToken/New(token/t) - token=t - if(t&&t.line) message="[t.line]: [message]" - if(istype(t))message+="[t.value]" - else message+="[t]" - -/scriptError/InvalidID - parent_type=/scriptError/BadToken - message="Invalid identifier name: " - -/scriptError/ReservedWord - parent_type=/scriptError/BadToken - message="Identifer using reserved word: " - -/scriptError/BadNumber - parent_type=/scriptError/BadToken - message = "Bad number: " - -/scriptError/BadReturn - var/token/token - message = "Unexpected return statement outside of a function." -/scriptError/BadReturn/New(token/t) - src.token=t - -/scriptError/EndOfFile - message = "Unexpected end of file." - -/scriptError/ExpectedToken - message="Expected: '" -/scriptError/ExpectedToken/New(id, token/T) - if(T && T.line) message="[T.line]: [message]" - message+="[id]'. " - if(T)message+="Found '[T.value]'." - - -/scriptError/UnterminatedComment - message="Unterminated multi-line comment statement: expected */" - -/scriptError/DuplicateFunction - message="Function defined twice." -/scriptError/DuplicateFunction/New(name, token/t) - message="Function '[name]' defined twice." - -/* - Class: runtimeError - An error thrown by the interpreter in running the script. -*/ -/runtimeError - var/name - var/message /// A basic description as to what went wrong. - var/stack/stack - -/** - * Proc: ToString - * Returns a description of the error suitable for showing to the user. - */ -/runtimeError/proc/ToString() - . = "[name]: [message]" - if(!stack.Top()) return - .+="\nStack:" - while(stack.Top()) - var/node/statement/FunctionCall/stmt=stack.Pop() - . += "\n\t [stmt.func_name]()" - -/runtimeError/TypeMismatch - name="TypeMismatchError" -/runtimeError/TypeMismatch/New(op, a, b) - message="Type mismatch: '[a]' [op] '[b]'" - -/runtimeError/UnexpectedReturn - name="UnexpectedReturnError" - message="Unexpected return statement." - -/runtimeError/UnknownInstruction - name="UnknownInstructionError" - message="Unknown instruction type. This may be due to incompatible compiler and interpreter versions or a lack of implementation." - -/runtimeError/UndefinedVariable - name="UndefinedVariableError" -/runtimeError/UndefinedVariable/New(variable) - message="Variable '[variable]' has not been declared." - -/runtimeError/UndefinedFunction - name="UndefinedFunctionError" -/runtimeError/UndefinedFunction/New(function) - message="Function '[function]()' has not been defined." - -/runtimeError/DuplicateVariableDeclaration - name="DuplicateVariableError" -/runtimeError/DuplicateVariableDeclaration/New(variable) - message="Variable '[variable]' was already declared." - -/runtimeError/IterationLimitReached - name="MaxIterationError" - message="A loop has reached its maximum number of iterations." - -/runtimeError/RecursionLimitReached - name="MaxRecursionError" - message="The maximum amount of recursion has been reached." - -/runtimeError/DivisionByZero - name="DivideByZeroError" - message="Division by zero attempted." - -/runtimeError/MaxCPU - name="MaxComputationalUse" - message="Maximum amount of computational cycles reached (>= 1000)." \ No newline at end of file diff --git a/code/modules/scripting/IDE.dm b/code/modules/scripting/IDE.dm deleted file mode 100644 index 5b6ea4daf0c..00000000000 --- a/code/modules/scripting/IDE.dm +++ /dev/null @@ -1,211 +0,0 @@ -/client/verb/tcssave() - set hidden = 1 - if(mob.machine || issilicon(mob)) - if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || issilicon(mob)) - var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine - if(Machine.editingcode != mob) - return - - if(Machine.SelectedServer) - var/obj/machinery/telecomms/server/Server = Machine.SelectedServer - var/tcscode=winget(src, "tcscode", "text") - var/msg="[mob.name] is adding script to server [Server]: [tcscode]" - log_misc(msg) - message_admins("[mob.name] has uploaded a NTLS script to [Machine.SelectedServer] ([mob.x],[mob.y],[mob.z] - JMP)",0,1) - Server.setcode( tcscode ) // this actually saves the code from input to the server - src << output(null, "tcserror") // clear the errors - else - src << output(null, "tcserror") - src << output("Failed to save: Unable to locate server machine. (Back up your code before exiting the window!)", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to save: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to save: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") - - -/client/verb/tcscompile() - set hidden = 1 - if(mob.machine || issilicon(mob)) - if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) )) - var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine - if(Machine.editingcode != mob) - return - - if(Machine.SelectedServer) - var/obj/machinery/telecomms/server/Server = Machine.SelectedServer - Server.setcode( winget(src, "tcscode", "text") ) // save code first - var/list/compileerrors = Server.compile() // then compile the code! - - // Output all the compile-time errors - src << output(null, "tcserror") - - if(compileerrors.len) - src << output("Compile Errors", "tcserror") - for(var/scriptError/e in compileerrors) - src << output("\t>[e.message]", "tcserror") - src << output("([compileerrors.len] errors)", "tcserror") - - // Output compile errors to all other people viewing the code too - for(var/mob/M in Machine.viewingcode) - if(M.client) - M << output(null, "tcserror") - M << output("Compile Errors", "tcserror") - for(var/scriptError/e in compileerrors) - M << output("\t>[e.message]", "tcserror") - M << output("([compileerrors.len] errors)", "tcserror") - - - else - src << output("TCS compilation successful!", "tcserror") - src << output("(0 errors)", "tcserror") - - for(var/mob/M in Machine.viewingcode) - if(M.client) - M << output("TCS compilation successful!", "tcserror") - M << output("(0 errors)", "tcserror") - - else - src << output(null, "tcserror") - src << output("Failed to compile: Unable to locate server machine. (Back up your code before exiting the window!)", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to compile: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to compile: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") - -/client/verb/tcsrun() - set hidden = 1 - if(mob.machine || issilicon(mob)) - if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) )) - var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine - if(Machine.editingcode != mob) - return - - if(Machine.SelectedServer) - var/obj/machinery/telecomms/server/Server = Machine.SelectedServer - Server.setcode( winget(src, "tcscode", "text") ) // save code first - var/list/compileerrors = Server.compile() // then compile the code! - - // Output all the compile-time errors - src << output(null, "tcserror") - - if(compileerrors.len) - src << output("Compile Errors", "tcserror") - for(var/scriptError/e in compileerrors) - src << output("\t>[e.message]", "tcserror") - src << output("([compileerrors.len] errors)", "tcserror") - - // Output compile errors to all other people viewing the code too - for(var/mob/M in Machine.viewingcode) - if(M.client) - M << output(null, "tcserror") - M << output("Compile Errors", "tcserror") - for(var/scriptError/e in compileerrors) - M << output("\t>[e.message]", "tcserror") - M << output("([compileerrors.len] errors)", "tcserror") - - else - // Finally, we run the code! - src << output("TCS compilation successful! Code executed.", "tcserror") - src << output("(0 errors)", "tcserror") - - for(var/mob/M in Machine.viewingcode) - if(M.client) - M << output("TCS compilation successful!", "tcserror") - M << output("(0 errors)", "tcserror") - - var/datum/signal/signal = new() - signal.data["message"] = "" - if(Server.freq_listening.len > 0) - signal.frequency = Server.freq_listening[1] - else - signal.frequency = PUB_FREQ - signal.data["name"] = "" - signal.data["job"] = "" - signal.data["reject"] = 0 - signal.data["server"] = Server - - Server.Compiler.Run(signal) - - - else - src << output(null, "tcserror") - src << output("Failed to run: Unable to locate server machine. (Back up your code before exiting the window!)", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to run: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to run: Unable to locate machine. (Back up your code before exiting the window!)", "tcserror") - - -/client/verb/exittcs() - set hidden = 1 - if(mob.machine || issilicon(mob)) - if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) )) - var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine - if(Machine.editingcode == mob) - Machine.storedcode = "[winget(mob, "tcscode", "text")]" - Machine.editingcode = null - else - if(mob in Machine.viewingcode) - Machine.viewingcode.Remove(mob) - -/client/verb/tcsrevert() - set hidden = 1 - if(mob.machine || issilicon(mob)) - if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) )) - var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine - if(Machine.editingcode != mob) - return - - if(Machine.SelectedServer) - var/obj/machinery/telecomms/server/Server = Machine.SelectedServer - - // Replace quotation marks with quotation macros for proper winset() compatibility - var/showcode = replacetext(Server.rawcode, "\\\"", "\\\\\"") - showcode = replacetext(showcode, "\"", "\\\"") - - winset(mob, "tcscode", "text=\"[showcode]\"") - - src << output(null, "tcserror") // clear the errors - else - src << output(null, "tcserror") - src << output("Failed to revert: Unable to locate server machine.", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to revert: Unable to locate machine.", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to revert: Unable to locate machine.", "tcserror") - - -/client/verb/tcsclearmem() - set hidden = 1 - if(mob.machine || issilicon(mob)) - if((istype(mob.machine, /obj/machinery/computer/telecomms/traffic) && (mob.machine in view(1, mob))) || (issilicon(mob) && istype(mob.machine, /obj/machinery/computer/telecomms/traffic) )) - var/obj/machinery/computer/telecomms/traffic/Machine = mob.machine - if(Machine.editingcode != mob) - return - - if(Machine.SelectedServer) - var/obj/machinery/telecomms/server/Server = Machine.SelectedServer - Server.memory = list() // clear the memory - // Show results - src << output(null, "tcserror") - src << output("Server memory cleared!", "tcserror") - for(var/mob/M in Machine.viewingcode) - if(M.client) - M << output("Server memory cleared!", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to clear memory: Unable to locate server machine.", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to clear memory: Unable to locate machine.", "tcserror") - else - src << output(null, "tcserror") - src << output("Failed to clear memory: Unable to locate machine.", "tcserror") diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm deleted file mode 100644 index ae81985207b..00000000000 --- a/code/modules/scripting/Implementations/Telecomms.dm +++ /dev/null @@ -1,289 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 - - -/* --- Traffic Control Scripting Language --- */ - // NanoTrasen TCS Language - Made by Doohl - -/n_Interpreter/TCS_Interpreter - var/datum/TCS_Compiler/Compiler - -/n_Interpreter/TCS_Interpreter/Destroy() - QDEL_NULL(Compiler) - return ..() - -/n_Interpreter/TCS_Interpreter/HandleError(runtimeError/e) - Compiler.Holder.add_entry(e.ToString(), "Execution Error") - -/datum/TCS_Compiler - var/n_Interpreter/TCS_Interpreter/interpreter - var/obj/machinery/telecomms/server/Holder // the server that is running the code - var/ready = 1 // 1 if ready to run code - -/datum/TCS_Compiler/Destroy() - QDEL_NULL(interpreter) - Holder = null - return ..() - - /** Proc: Compile - * Compile a raw block of text into a program - * Returns: List of errors - */ - -/datum/TCS_Compiler/proc/Compile(code as message) - var/n_scriptOptions/nS_Options/options = new() - var/n_Scanner/nS_Scanner/scanner = new(code, options) - var/list/tokens = scanner.Scan() - var/n_Parser/nS_Parser/parser = new(tokens, options) - var/node/BlockDefinition/GlobalBlock/program = parser.Parse() - - var/list/returnerrors = list() - - returnerrors += scanner.errors - returnerrors += parser.errors - - if(returnerrors.len) - return returnerrors - - interpreter = new(program) - interpreter.persist = 1 - interpreter.Compiler= src - - return returnerrors - - /* -- Execute the compiled code -- */ -/** Proc: Run - * Executes the compiled code. - * Arguments: - * var/datum/signal/signal - a telecomms signal - * Returns: None - */ -/datum/TCS_Compiler/proc/Run(var/datum/signal/signal) - - if(!ready) - return - - if(!interpreter) - return - - interpreter.container = src - - interpreter.SetVar("PI" , 3.141592653) // value of pi - interpreter.SetVar("E" , 2.718281828) // value of e - interpreter.SetVar("SQURT2" , 1.414213562) // value of the square root of 2 - interpreter.SetVar("FALSE" , 0) // boolean shortcut to 0 - interpreter.SetVar("TRUE" , 1) // boolean shortcut to 1 - - interpreter.SetVar("NORTH" , NORTH) // NORTH (1) - interpreter.SetVar("SOUTH" , SOUTH) // SOUTH (2) - interpreter.SetVar("EAST" , EAST) // EAST (4) - interpreter.SetVar("WEST" , WEST) // WEST (8) - - // Channel macros - interpreter.SetVar("$common", PUB_FREQ) - interpreter.SetVar("$science", SCI_FREQ) - interpreter.SetVar("$command", COMM_FREQ) - interpreter.SetVar("$medical", MED_FREQ) - interpreter.SetVar("$engineering",ENG_FREQ) - interpreter.SetVar("$security", SEC_FREQ) - interpreter.SetVar("$supply", SUP_FREQ) - interpreter.SetVar("$explorer", EXP_FREQ) - - // Signal data - - interpreter.SetVar("$content", signal.data["message"]) - interpreter.SetVar("$freq" , signal.frequency) - interpreter.SetVar("$source" , signal.data["name"]) - interpreter.SetVar("$job" , signal.data["job"]) - interpreter.SetVar("$sign" , signal) - interpreter.SetVar("$pass" , !(signal.data["reject"])) // if the signal isn't rejected, pass = 1; if the signal IS rejected, pass = 0 - - // Set up the script procs - - /* - -> Send another signal to a server - @format: broadcast(content, frequency, source, job) - - @param content: Message to broadcast - @param frequency: Frequency to broadcast to - @param source: The name of the source you wish to imitate. Must be stored in stored_names list. - @param job: The name of the job. - */ - interpreter.SetProc("broadcast", "tcombroadcast", signal, list("message", "freq", "source", "job")) - - /* - -> Store a value permanently to the server machine (not the actual game hosting machine, the ingame machine) - @format: mem(address, value) - - @param address: The memory address (string index) to store a value to - @param value: The value to store to the memory address - */ - interpreter.SetProc("mem", "mem", signal, list("address", "value")) - - /* - -> Delay code for a given amount of deciseconds - @format: sleep(time) - - @param time: time to sleep in deciseconds (1/10th second) - */ - interpreter.SetProc("sleep", /proc/delay) - - /* - -> Replaces a string with another string - @format: replace(string, substring, replacestring) - - @param string: the string to search for substrings (best used with $content$ constant) - @param substring: the substring to search for - @param replacestring: the string to replace the substring with - - */ - interpreter.SetProc("replace", /proc/string_replacetext) - - /* - -> Locates an element/substring inside of a list or string - @format: find(haystack, needle, start = 1, end = 0) - - @param haystack: the container to search - @param needle: the element to search for - @param start: the position to start in - @param end: the position to end in - - */ - interpreter.SetProc("find", /proc/smartfind) - - /* - -> Finds the length of a string or list - @format: length(container) - - @param container: the list or container to measure - - */ - interpreter.SetProc("length", /proc/smartlength) - - /* -- Clone functions, carried from default BYOND procs --- */ - - // vector namespace - interpreter.SetProc("vector", /proc/n_list) - interpreter.SetProc("at", /proc/n_listpos) - interpreter.SetProc("copy", /proc/n_listcopy) - interpreter.SetProc("push_back", /proc/n_listadd) - interpreter.SetProc("remove", /proc/n_listremove) - interpreter.SetProc("cut", /proc/n_listcut) - interpreter.SetProc("swap", /proc/n_listswap) - interpreter.SetProc("insert", /proc/n_listinsert) - - interpreter.SetProc("pick", /proc/n_pick) - interpreter.SetProc("prob", /proc/prob_chance) - interpreter.SetProc("substr", /proc/docopytext) - - // Donkie~ - // Strings - interpreter.SetProc("lower", /proc/n_lower) - interpreter.SetProc("upper", /proc/n_upper) - interpreter.SetProc("explode", /proc/string_explode) - interpreter.SetProc("repeat", /proc/n_repeat) - interpreter.SetProc("reverse", /proc/n_reverse) - interpreter.SetProc("tonum", /proc/n_str2num) - - // Numbers - interpreter.SetProc("tostring", /proc/n_num2str) - interpreter.SetProc("sqrt", /proc/n_sqrt) - interpreter.SetProc("abs", /proc/n_abs) - interpreter.SetProc("floor", /proc/n_floor) - interpreter.SetProc("ceil", /proc/n_ceil) - interpreter.SetProc("round", /proc/n_round) - interpreter.SetProc("clamp", /proc/n_clamp) - interpreter.SetProc("inrange", /proc/n_inrange) - // End of Donkie~ - - - // Run the compiled code - interpreter.Run() - - // Backwards-apply variables onto signal data - /* sanitize EVERYTHING. fucking players can't be trusted with SHIT */ - - signal.data["message"] = interpreter.GetVar("$content") - signal.frequency = interpreter.GetVar("$freq") - - var/setname = "" - var/obj/machinery/telecomms/server/S = signal.data["server"] - if(interpreter.GetVar("$source") in S.stored_names) - setname = interpreter.GetVar("$source") - else - setname = "[interpreter.GetVar("$source")]" - - if(signal.data["name"] != setname) - signal.data["realname"] = setname - signal.data["name"] = setname - signal.data["job"] = interpreter.GetVar("$job") - signal.data["reject"] = !(interpreter.GetVar("$pass")) // set reject to the opposite of $pass - - // If the message is invalid, just don't broadcast it! - if(signal.data["message"] == "" || !signal.data["message"]) - signal.data["reject"] = 1 - -/* -- Actual language proc code -- */ - -/datum/signal/proc/mem(var/address, var/value) - - if(istext(address)) - var/obj/machinery/telecomms/server/S = data["server"] - - if(!value && value != 0) - return S.memory[address] - - else - S.memory[address] = value - - -/datum/signal/proc/tcombroadcast(var/message, var/freq, var/source, var/job) - - var/datum/signal/newsign = new - var/obj/machinery/telecomms/server/S = data["server"] - var/obj/item/radio/hradio = S.server_radio - - if(!hradio) - error("[src] has no radio.") - return - - if((!message || message == "") && message != 0) - message = "*beep*" - if(!source) - source = "[html_encode(uppertext(S.id))]" - hradio = new // sets the hradio as a radio intercom - if(!freq) - freq = PUB_FREQ - if(findtext(num2text(freq), ".")) // if the frequency has been set as a decimal - freq *= 10 // shift the decimal one place - - if(!job) - job = "?" - - newsign.data["mob"] = null - newsign.data["mobtype"] = /mob/living/carbon/human - if(source in S.stored_names) - newsign.data["name"] = source - else - newsign.data["name"] = "[html_encode(uppertext(source))]" - newsign.data["realname"] = newsign.data["name"] - newsign.data["job"] = job - newsign.data["compression"] = 0 - newsign.data["message"] = message - newsign.data["type"] = 2 // artificial broadcast - if(!isnum(freq)) - freq = text2num(freq) - newsign.frequency = freq - - var/datum/radio_frequency/connection = radio_controller.return_frequency(freq) - newsign.data["connection"] = connection - - - newsign.data["radio"] = hradio - newsign.data["vmessage"] = message - newsign.data["vname"] = source - newsign.data["vmask"] = 0 - newsign.data["level"] = list() - - var/pass = S.relay_information(newsign, /obj/machinery/telecomms/hub) - if(!pass) - S.relay_information(newsign, /obj/machinery/telecomms/broadcaster) // send this simple message to broadcasters diff --git a/code/modules/scripting/Implementations/_Logic.dm b/code/modules/scripting/Implementations/_Logic.dm deleted file mode 100644 index 7139fe79304..00000000000 --- a/code/modules/scripting/Implementations/_Logic.dm +++ /dev/null @@ -1,291 +0,0 @@ -// Script -> BYOND code procs -#define SCRIPT_MAX_REPLACEMENTS_ALLOWED 200 -// --- List operations (lists known as vectors in n_script) --- - -// Clone of list() -/proc/n_list() - var/list/returnlist = list() - for(var/e in args) - returnlist.Add(e) - return returnlist - -// Clone of pick() -/proc/n_pick() - var/list/finalpick = list() - for(var/e in args) - if(isobject(e)) - if(istype(e, /list)) - var/list/sublist = e - for(var/sube in sublist) - finalpick.Add(sube) - continue - finalpick.Add(e) - - return pick(finalpick) - -// Clone of list[] -/proc/n_listpos(var/list/L, var/pos, var/value) - if(!istype(L, /list)) return - if(isnum(pos)) - if(!value) - if(L.len >= pos) - return L[pos] - else - if(L.len >= pos) - L[pos] = value - else if(istext(pos)) - if(!value) - return L[pos] - else - L[pos] = value - -// Clone of list.Copy() -/proc/n_listcopy(var/list/L, var/start, var/end) - if(!istype(L, /list)) return - return L.Copy(start, end) - -// Clone of list.Add() -/proc/n_listadd() - var/list/chosenlist - var/i = 1 - for(var/e in args) - if(i == 1) - if(isobject(e)) - if(istype(e, /list)) - chosenlist = e - i = 2 - else - if(chosenlist) - chosenlist.Add(e) - -// Clone of list.Remove() -/proc/n_listremove() - var/list/chosenlist - var/i = 1 - for(var/e in args) - if(i == 1) - if(isobject(e)) - if(istype(e, /list)) - chosenlist = e - i = 2 - else - if(chosenlist) - chosenlist.Remove(e) - -// Clone of list.Cut() -/proc/n_listcut(var/list/L, var/start, var/end) - if(!istype(L, /list)) return - return L.Cut(start, end) - -// Clone of list.Swap() -/proc/n_listswap(var/list/L, var/firstindex, var/secondindex) - if(!istype(L, /list)) return - if(L.len >= secondindex && L.len >= firstindex) - return L.Swap(firstindex, secondindex) - -// Clone of list.Insert() -/proc/n_listinsert(var/list/L, var/index, var/element) - if(!istype(L, /list)) return - return L.Insert(index, element) - -// --- Miscellaneous functions --- - -// Clone of sleep() -/proc/delay(var/time) - sleep(time) - -// Clone of prob() -/proc/prob_chance(var/chance) - return prob(chance) - -// Merge of list.Find() and findtext() -/proc/smartfind(var/haystack, var/needle, var/start = 1, var/end = 0) - if(haystack && needle) - if(isobject(haystack)) - if(istype(haystack, /list)) - if(length(haystack) >= end && start > 0) - var/list/listhaystack = haystack - return listhaystack.Find(needle, start, end) - - else - if(istext(haystack)) - if(length(haystack) >= end && start > 0) - return findtext(haystack, needle, start, end) - -// Clone of copytext() -/proc/docopytext(var/string, var/start = 1, var/end = 0) - if(istext(string) && isnum(start) && isnum(end)) - if(start > 0) - return copytext(string, start, end) - -// Clone of length() -/proc/smartlength(var/container) - if(container) - if(istype(container, /list) || istext(container)) - return length(container) - -// BY DONKIE~ -// String stuff -/proc/n_lower(var/string) - if(istext(string)) - return lowertext(string) - -/proc/n_upper(var/string) - if(istext(string)) - return uppertext(string) - -/* -//Makes a list where all indices in a string is a separate index in the list -// JUST A HELPER DON'T ADD TO NTSCRIPT -/proc/string_tolist(var/string) - var/list/L = new/list() - - var/i - for(i=1, i<=length(string), i++) - L.Add(copytext(string, i, i)) - - return L - -/proc/string_explode(var/string, var/separator) - if(istext(string)) - if(istext(separator) && separator == "") - return string_tolist(string) - var/i - var/lasti = 1 - var/list/L = new/list() - - for(i=1, i<=length(string)+1, i++) - if(copytext(string, i, i+1) == separator) // We found a separator - L.Add(copytext(string, lasti, i)) - lasti = i+1 - - L.Add(copytext(string, lasti, length(string)+1)) // Adds the last segment - - return L - -Just found out there was already a string explode function, did some benchmarking, and that function were a bit faster, sticking to that. -*/ -/proc/string_explode(var/string, var/separator) - if(istext(string) && istext(separator)) - return splittext(string, separator) - -/proc/n_repeat(var/string, var/amount) - if(istext(string) && isnum(amount)) - var/i - var/newstring = "" - if(length(newstring)*amount >=1000) - return - for(i=0, i<=amount, i++) - if(i>=1000) - break - newstring = newstring + string - - return newstring - -/proc/n_reverse(var/string) - if(istext(string)) - var/newstring = "" - var/i - for(i=length(string), i>0, i--) - if(i>=1000) - break - newstring = newstring + copytext(string, i, i+1) - - return newstring - -// I don't know if it's necessary to make my own proc, but I think I have to to be able to check for istext. -/proc/n_str2num(var/string) - if(istext(string)) - return text2num(string) - -// Number shit -/proc/n_num2str(var/num) - if(isnum(num)) - return num2text(num) - -// Squareroot -/proc/n_sqrt(var/num) - if(isnum(num)) - return sqrt(num) - -// Magnitude of num -/proc/n_abs(var/num) - if(isnum(num)) - return abs(num) - -// Round down -/proc/n_floor(var/num) - if(isnum(num)) - return round(num) - -// Round up -/proc/n_ceil(var/num) - if(isnum(num)) - return round(num)+1 - -// Round to nearest integer -/proc/n_round(var/num) - if(isnum(num)) - if(num-round(num)<0.5) - return round(num) - return n_ceil(num) - -// Clamps N between min and max -/proc/n_clamp(var/num, var/min=-1, var/max=1) - if(isnum(num)&&isnum(min)&&isnum(max)) - if(num<=min) - return min - if(num>=max) - return max - return num - -// Returns 1 if N is inbetween Min and Max -/proc/n_inrange(var/num, var/min=-1, var/max=1) - if(isnum(num)&&isnum(min)&&isnum(max)) - return ((min <= num) && (num <= max)) -// END OF BY DONKIE :( - -// Non-recursive -// Imported from Mono string.ReplaceUnchecked -/proc/string_replacetext(var/haystack,var/a,var/b) - if(istext(haystack)&&istext(a)&&istext(b)) - var/i = 1 - var/lenh=length(haystack) - var/lena=length(a) - //var/lenb=length(b) - var/count = 0 - var/list/dat = list() - while (i < lenh) - var/found = findtext(haystack, a, i, 0) - //log_misc("findtext([haystack], [a], [i], 0)=[found]") - if (found == 0) // Not found - break - else - if (count < SCRIPT_MAX_REPLACEMENTS_ALLOWED) - dat+=found - count+=1 - else - //log_misc("Script found [a] [count] times, aborted") - break - //log_misc("Found [a] at [found]! Moving up...") - i = found + lena - if (count == 0) - return haystack - //var/nlen = lenh + ((lenb - lena) * count) - var/buf = copytext(haystack,1,dat[1]) // Prefill - var/lastReadPos = 0 - for (i = 1, i <= count, i++) - var/precopy = dat[i] - lastReadPos-1 - //internal static unsafe void CharCopy (String target, int targetIndex, String source, int sourceIndex, int count) - //fixed (char* dest = target, src = source) - //CharCopy (dest + targetIndex, src + sourceIndex, count); - //CharCopy (dest + curPos, source + lastReadPos, precopy); - buf+=copytext(haystack,lastReadPos,precopy) - log_misc("buf+=copytext([haystack],[lastReadPos],[precopy])") - log_misc("[buf]") - lastReadPos = dat[i] + lena - //CharCopy (dest + curPos, replace, newValue.length); - buf+=b - log_misc("[buf]") - buf+=copytext(haystack,lastReadPos, 0) - return buf diff --git a/code/modules/scripting/Interpreter/Evaluation.dm b/code/modules/scripting/Interpreter/Evaluation.dm deleted file mode 100644 index cfdc797ce40..00000000000 --- a/code/modules/scripting/Interpreter/Evaluation.dm +++ /dev/null @@ -1,167 +0,0 @@ -/proc/isobject(x) - return !(isnum(x) || istext(x)) - -/n_Interpreter/proc/Eval(node/expression/exp) - if(istype(exp, /node/expression/FunctionCall)) - return RunFunction(exp) - else if(istype(exp, /node/expression/operator)) - return EvalOperator(exp) - else if(istype(exp, /node/expression/value/literal)) - var/node/expression/value/literal/lit=exp - return lit.value - else if(istype(exp, /node/expression/value/reference)) - var/node/expression/value/reference/ref=exp - return ref.value - else if(istype(exp, /node/expression/value/variable)) - var/node/expression/value/variable/v=exp - if(!v.object) - return Eval(GetVariable(v.id.id_name)) - else - var/datum/D - if(istype(v.object, /node/identifier)) - D=GetVariable(v.object:id_name) - else - D=v.object - D=Eval(D) - if(!isobject(D)) - return null - if(!D.vars.Find(v.id.id_name)) - RaiseError(new/runtimeError/UndefinedVariable("[v.object.ToString()].[v.id.id_name]")) - return null - return Eval(D.vars[v.id.id_name]) - else if(istype(exp, /node/expression)) - RaiseError(new/runtimeError/UnknownInstruction()) - else - return exp - -/n_Interpreter/proc/EvalOperator(node/expression/operator/exp) - if(istype(exp, /node/expression/operator/binary)) - var/node/expression/operator/binary/bin=exp - switch(bin.type) - if(/node/expression/operator/binary/Equal) - return Equal(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/NotEqual) - return NotEqual(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/Greater) - return Greater(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/Less) - return Less(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/GreaterOrEqual) - return GreaterOrEqual(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/LessOrEqual) - return LessOrEqual(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/LogicalAnd) - return LogicalAnd(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/LogicalOr) - return LogicalOr(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/LogicalXor) - return LogicalXor(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/BitwiseAnd) - return BitwiseAnd(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/BitwiseOr) - return BitwiseOr(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/BitwiseXor) - return BitwiseXor(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/Add) - return Add(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/Subtract) - return Subtract(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/Multiply) - return Multiply(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/Divide) - return Divide(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/Power) - return Power(Eval(bin.exp), Eval(bin.exp2)) - if(/node/expression/operator/binary/Modulo) - return Modulo(Eval(bin.exp), Eval(bin.exp2)) - else - RaiseError(new/runtimeError/UnknownInstruction()) - return - switch(exp.type) - if(/node/expression/operator/unary/Minus) - return Minus(Eval(exp.exp)) - if(/node/expression/operator/unary/LogicalNot) - return LogicalNot(Eval(exp.exp)) - if(/node/expression/operator/unary/BitwiseNot) - return BitwiseNot(Eval(exp.exp)) - if(/node/expression/operator/unary/group) - return Eval(exp.exp) - else - RaiseError(new/runtimeError/UnknownInstruction()) - - -//Binary// - //Comparison operators -/n_Interpreter/proc/Equal(a, b) return a==b -/n_Interpreter/proc/NotEqual(a, b) return a!=b //LogicalNot(Equal(a, b)) -/n_Interpreter/proc/Greater(a, b) return a>b -/n_Interpreter/proc/Less(a, b) return a=b -/n_Interpreter/proc/LessOrEqual(a, b) return a<=b - //Logical Operators -/n_Interpreter/proc/LogicalAnd(a, b) return a&&b -/n_Interpreter/proc/LogicalOr(a, b) return a||b -/n_Interpreter/proc/LogicalXor(a, b) return (a||b) && !(a&&b) - //Bitwise Operators -/n_Interpreter/proc/BitwiseAnd(a, b) return a&b -/n_Interpreter/proc/BitwiseOr(a, b) return a|b -/n_Interpreter/proc/BitwiseXor(a, b) return a^b - //Arithmetic Operators -/n_Interpreter/proc/Add(a, b) - if(istext(a)&&!istext(b)) b="[b]" - else if(istext(b)&&!istext(a)) a="[a]" - if(isobject(a) && !isobject(b)) - RaiseError(new/runtimeError/TypeMismatch("+", a, b)) - return null - else if(isobject(b) && !isobject(a)) - RaiseError(new/runtimeError/TypeMismatch("+", a, b)) - return null - return a+b -/n_Interpreter/proc/Subtract(a, b) - if(isobject(a) && !isobject(b)) - RaiseError(new/runtimeError/TypeMismatch("-", a, b)) - return null - else if(isobject(b) && !isobject(a)) - RaiseError(new/runtimeError/TypeMismatch("-", a, b)) - return null - return a-b -/n_Interpreter/proc/Divide(a, b) - if(isobject(a) && !isobject(b)) - RaiseError(new/runtimeError/TypeMismatch("/", a, b)) - return null - else if(isobject(b) && !isobject(a)) - RaiseError(new/runtimeError/TypeMismatch("/", a, b)) - return null - if(b==0) - RaiseError(new/runtimeError/DivisionByZero()) - return null - return a/b -/n_Interpreter/proc/Multiply(a, b) - if(isobject(a) && !isobject(b)) - RaiseError(new/runtimeError/TypeMismatch("*", a, b)) - return null - else if(isobject(b) && !isobject(a)) - RaiseError(new/runtimeError/TypeMismatch("*", a, b)) - return null - return a*b -/n_Interpreter/proc/Modulo(a, b) - if(isobject(a) && !isobject(b)) - RaiseError(new/runtimeError/TypeMismatch("%", a, b)) - return null - else if(isobject(b) && !isobject(a)) - RaiseError(new/runtimeError/TypeMismatch("%", a, b)) - return null - return a%b -/n_Interpreter/proc/Power(a, b) - if(isobject(a) && !isobject(b)) - RaiseError(new/runtimeError/TypeMismatch("**", a, b)) - return null - else if(isobject(b) && !isobject(a)) - RaiseError(new/runtimeError/TypeMismatch("**", a, b)) - return null - return a**b - -//Unary// -/n_Interpreter/proc/Minus(a) return -a -/n_Interpreter/proc/LogicalNot(a) return !a -/n_Interpreter/proc/BitwiseNot(a) return ~a \ No newline at end of file diff --git a/code/modules/scripting/Interpreter/Interaction.dm b/code/modules/scripting/Interpreter/Interaction.dm deleted file mode 100644 index 231281a0c90..00000000000 --- a/code/modules/scripting/Interpreter/Interaction.dm +++ /dev/null @@ -1,140 +0,0 @@ -/* - File: Interpreter (Public) - Contains methods for interacting with the interpreter. -*/ -/* - Class: n_Interpreter - Procedures allowing for interaction with the script that is being run by the interpreter object. -*/ -/n_Interpreter - -/* - Proc: Load - Loads a 'compiled' script into memory. - - Parameters: - program - A object which represents the script's global scope. -*/ -/n_Interpreter/proc/Load(node/BlockDefinition/GlobalBlock/program) - ASSERT(program) - src.program = program - CreateGlobalScope() - -/* - Proc: Run - Runs the script. -*/ -/n_Interpreter/proc/Run() - cur_recursion = 0 // reset recursion - cur_statements = 0 // reset CPU tracking - alertadmins = 0 - - ASSERT(src.program) - RunBlock(src.program) - -/* - Proc: SetVar - Defines a global variable for the duration of the next execution of a script. - - Notes: - This differs from in that variables set using this procedure only last for the session, - while those defined from the block object persist if it is ran multiple times. - - See Also: - - -*/ -/n_Interpreter/proc/SetVar(name, value) - if(!istext(name)) - //CRASH("Invalid variable name") - return - AssignVariable(name, value) - -/* - Proc: SetProc - Defines a procedure to be available to the script. - - Parameters: - name - The name of the procedure as exposed to the script. - path - The typepath of a proc to be called when the function call is read by the interpreter, or, if object is specified, a string representing the procedure's name. - object - (Optional) An object which will the be target of a function call. - params - Only required if object is not null, a list of the names of parameters the proc takes. -*/ -/n_Interpreter/proc/SetProc(name, path, object=null, list/params=null) - if(!istext(name)) - //CRASH("Invalid function name") - return - if(!object) - globalScope.functions[name] = path - return - var/node/statement/FunctionDefinition/S = new() - S.func_name = name - S.parameters = params - S.block = new() - S.block.SetVar("src", object) - var/node/expression/FunctionCall/C = new() - C.func_name = path - C.object = new("src") - for(var/p in params) - C.parameters += new/node/expression/value/variable(p) - var/node/statement/ReturnStatement/R=new() - R.value=C - S.block.statements += R - globalScope.functions[name] = S -/* - Proc: VarExists - Checks whether a global variable with the specified name exists. -*/ -/n_Interpreter/proc/VarExists(name) - return globalScope.variables.Find(name) //convert to 1/0 first? - -/* - Proc: ProcExists - Checks whether a global function with the specified name exists. -*/ -/n_Interpreter/proc/ProcExists(name) - return globalScope.functions.Find(name) - -/* - Proc: GetVar - Returns the value of a global variable in the script. Remember to ensure that the variable exists before calling this procedure. - - See Also: - - -*/ -/n_Interpreter/proc/GetVar(name) - if(!VarExists(name)) - //CRASH("No variable named '[name]'.") - return - var/x = globalScope.variables[name] - return Eval(x) - -/* - Proc: CallProc - Calls a global function defined in the script and, amazingly enough, returns its return value. Remember to ensure that the function - exists before calling this procedure. - - See Also: - - -*/ -/n_Interpreter/proc/CallProc(name, params[]=null) - if(!ProcExists(name)) - //CRASH("No function named '[name]'.") - return - var/node/statement/FunctionDefinition/func = globalScope.functions[name] - if(istype(func)) - var/node/statement/FunctionCall/stmt = new - stmt.func_name = func.func_name - stmt.parameters = params - return RunFunction(stmt) - else - return call(func)(arglist(params)) - //CRASH("Unknown function type '[name]'.") - -/* - Event: HandleError - Called when the interpreter throws a runtime error. - - See Also: - - -*/ -/n_Interpreter/proc/HandleError(runtimeError/e) \ No newline at end of file diff --git a/code/modules/scripting/Interpreter/Interpreter.dm b/code/modules/scripting/Interpreter/Interpreter.dm deleted file mode 100644 index efdf1f7651d..00000000000 --- a/code/modules/scripting/Interpreter/Interpreter.dm +++ /dev/null @@ -1,309 +0,0 @@ -/* - File: Interpreter (Internal) -*/ -/* - Class: n_Interpreter -*/ -/* - Macros: Status Macros - RETURNING - Indicates that the current function is returning a value. - BREAKING - Indicates that the current loop is being terminated. - CONTINUING - Indicates that the rest of the current iteration of a loop is being skipped. -*/ -#define RETURNING 1 -#define BREAKING 2 -#define CONTINUING 4 -/n_Interpreter - var/scope/curScope - var/scope/globalScope - var/node/BlockDefinition/program - var/node/statement/FunctionDefinition/curFunction - var/stack/scopes = new() - var/stack/functions = new() - - var/datum/container // associated container for interpeter -/* - Var: status - A variable indicating that the rest of the current block should be skipped. This may be set to any combination of . -*/ - var/status=0 - var/returnVal - - var/max_statements=1000 // maximum amount of statements that can be called in one execution. this is to prevent massive crashes and exploitation - var/cur_statements=0 // current amount of statements called - var/alertadmins=0 // set to 1 if the admins shouldn't be notified of anymore issues - var/max_iterations=100 // max number of uninterrupted loops possible - var/max_recursion=50 // max recursions without returning anything (or completing the code block) - var/cur_recursion=0 // current amount of recursion -/* - Var: persist - If 0, global variables will be reset after Run() finishes. -*/ - var/persist=1 - var/paused=0 - -/* - Constructor: New - Calls with the given parameters. -*/ -/n_Interpreter/New(node/BlockDefinition/GlobalBlock/program=null) - .=..() - if(program)Load(program) - -/* - Proc: RaiseError - Raises a runtime error. -*/ -/n_Interpreter/proc/RaiseError(runtimeError/e) - e.stack=functions.Copy() - e.stack.Push(curFunction) - src.HandleError(e) - -/n_Interpreter/proc/CreateScope(node/BlockDefinition/B) - var/scope/S = new(B, curScope) - scopes.Push(curScope) - curScope = S - return S - -/n_Interpreter/proc/CreateGlobalScope() - scopes.Clear() - var/scope/S = new(program, null) - globalScope = S - return S - -/* -Proc: RunBlock -Runs each statement in a block of code. -*/ -/n_Interpreter/proc/RunBlock(node/BlockDefinition/Block, scope/scope = null) - var/is_global = istype(Block, /node/BlockDefinition/GlobalBlock) - if(!is_global) - if(scope) - curScope = scope - else - CreateScope(Block) - else - if(!persist) - CreateGlobalScope() - curScope = globalScope - - if(cur_statements < max_statements) - - for(var/node/statement/S in Block.statements) - while(paused) sleep(10) - - cur_statements++ - if(cur_statements >= max_statements) - RaiseError(new/runtimeError/MaxCPU()) - - if(container && !alertadmins) - if(istype(container, /datum/TCS_Compiler)) - var/datum/TCS_Compiler/Compiler = container - var/obj/machinery/telecomms/server/Holder = Compiler.Holder - var/message = "Potential crash-inducing NTSL script detected at telecommunications server [Compiler.Holder] ([Holder.x], [Holder.y], [Holder.z])." - - alertadmins = 1 - message_admins(message, 1) - break - - if(istype(S, /node/statement/VariableAssignment)) - var/node/statement/VariableAssignment/stmt = S - var/name = stmt.var_name.id_name - if(!stmt.object) - // Below we assign the variable first to null if it doesn't already exist. - // This is necessary for assignments like +=, and when the variable is used in a function - // If the variable already exists in a different block, then AssignVariable will automatically use that one. - if(!IsVariableAccessible(name)) - AssignVariable(name, null) - AssignVariable(name, Eval(stmt.value)) - else - var/datum/D = Eval(GetVariable(stmt.object.id_name)) - if(!D) return - D.vars[stmt.var_name.id_name] = Eval(stmt.value) - else if(istype(S, /node/statement/VariableDeclaration)) - //VariableDeclaration nodes are used to forcibly declare a local variable so that one in a higher scope isn't used by default. - var/node/statement/VariableDeclaration/dec=S - if(!dec.object) - AssignVariable(dec.var_name.id_name, null, curScope) - else - var/datum/D = Eval(GetVariable(dec.object.id_name)) - if(!D) return - D.vars[dec.var_name.id_name] = null - else if(istype(S, /node/statement/FunctionCall)) - RunFunction(S) - else if(istype(S, /node/statement/FunctionDefinition)) - //do nothing - else if(istype(S, /node/statement/WhileLoop)) - RunWhile(S) - else if(istype(S, /node/statement/IfStatement)) - RunIf(S) - else if(istype(S, /node/statement/ReturnStatement)) - if(!curFunction) - RaiseError(new/runtimeError/UnexpectedReturn()) - continue - status |= RETURNING - returnVal=Eval(S:value) - break - else if(istype(S, /node/statement/BreakStatement)) - status |= BREAKING - break - else if(istype(S, /node/statement/ContinueStatement)) - status |= CONTINUING - break - else - RaiseError(new/runtimeError/UnknownInstruction()) - if(status) - break - - curScope = scopes.Pop() - -/* -Proc: RunFunction -Runs a function block or a proc with the arguments specified in the script. -*/ -/n_Interpreter/proc/RunFunction(node/statement/FunctionCall/stmt) - //Note that anywhere /node/statement/FunctionCall/stmt is used so may /node/expression/FunctionCall - - // If recursion gets too high (max 50 nested functions) throw an error - if(cur_recursion >= max_recursion) - RaiseError(new/runtimeError/RecursionLimitReached()) - return 0 - - var/node/statement/FunctionDefinition/def - if(!stmt.object) //A scope's function is being called, stmt.object is null - def = GetFunction(stmt.func_name) - else if(istype(stmt.object)) //A method of an object exposed as a variable is being called, stmt.object is a /node/identifier - var/O = GetVariable(stmt.object.id_name) //Gets a reference to the object which is the target of the function call. - if(!O) return //Error already thrown in GetVariable() - def = Eval(O) - - if(!def) return - - cur_recursion++ // add recursion - if(istype(def)) - if(curFunction) functions.Push(curFunction) - var/scope/S = CreateScope(def.block) - for(var/i=1 to def.parameters.len) - var/val - if(stmt.parameters.len>=i) - val = stmt.parameters[i] - //else - // unspecified param - AssignVariable(def.parameters[i], new/node/expression/value/literal(Eval(val)), S) - curFunction=stmt - RunBlock(def.block, S) - //Handle return value - . = returnVal - status &= ~RETURNING - returnVal=null - curFunction=functions.Pop() - cur_recursion-- - else - cur_recursion-- - var/list/params=new - for(var/node/expression/P in stmt.parameters) - params+=list(Eval(P)) - if(isobject(def)) //def is an object which is the target of a function call - if( !hascall(def, stmt.func_name) ) - RaiseError(new/runtimeError/UndefinedFunction("[stmt.object.id_name].[stmt.func_name]")) - return - return call(def, stmt.func_name)(arglist(params)) - else //def is a path to a global proc - return call(def)(arglist(params)) - //else - // RaiseError(new/runtimeError/UnknownInstruction()) - -/* -Proc: RunIf -Checks a condition and runs either the if block or else block. -*/ -/n_Interpreter/proc/RunIf(node/statement/IfStatement/stmt) - if(Eval(stmt.cond)) - RunBlock(stmt.block) - else if(stmt.else_block) - RunBlock(stmt.else_block) - -/* -Proc: RunWhile -Runs a while loop. -*/ -/n_Interpreter/proc/RunWhile(node/statement/WhileLoop/stmt) - var/i=1 - while(Eval(stmt.cond) && Iterate(stmt.block, i++)) - continue - status &= ~BREAKING - -/* -Proc:Iterate -Runs a single iteration of a loop. Returns a value indicating whether or not to continue looping. -*/ -/n_Interpreter/proc/Iterate(node/BlockDefinition/block, count) - RunBlock(block) - if(max_iterations > 0 && count >= max_iterations) - RaiseError(new/runtimeError/IterationLimitReached()) - return 0 - if(status & (BREAKING|RETURNING)) - return 0 - status &= ~CONTINUING - return 1 - -/* -Proc: GetFunction -Finds a function in an accessible scope with the given name. Returns a . -*/ -/n_Interpreter/proc/GetFunction(name) - var/scope/S = curScope - while(S) - if(S.functions.Find(name)) - return S.functions[name] - S = S.parent - RaiseError(new/runtimeError/UndefinedFunction(name)) - -/* -Proc: GetVariable -Finds a variable in an accessible scope and returns its value. -*/ -/n_Interpreter/proc/GetVariable(name) - var/scope/S = curScope - while(S) - if(S.variables.Find(name)) - return S.variables[name] - S = S.parent - RaiseError(new/runtimeError/UndefinedVariable(name)) - -/n_Interpreter/proc/GetVariableScope(name) //needed for when you reassign a variable in a higher scope - var/scope/S = curScope - while(S) - if(S.variables.Find(name)) - return S - S = S.parent - - -/n_Interpreter/proc/IsVariableAccessible(name) - var/scope/S = curScope - while(S) - if(S.variables.Find(name)) - return TRUE - S = S.parent - return FALSE - - -/* -Proc: AssignVariable -Assigns a value to a variable in a specific block. - -Parameters: -name - The name of the variable to assign. -value - The value to assign to it. -S - The scope the variable resides in. If it is null, a scope with the variable already existing is found. If no scopes have a variable of the given name, the current scope is used. -*/ -/n_Interpreter/proc/AssignVariable(name, node/expression/value, scope/S=null) - if(!S) S = GetVariableScope(name) - if(!S) S = curScope - if(!S) S = globalScope - ASSERT(istype(S)) - if(istext(value) || isnum(value) || isnull(value)) value = new/node/expression/value/literal(value) - else if(!istype(value) && isobject(value)) value = new/node/expression/value/reference(value) - //TODO: check for invalid name - S.variables["[name]"] = value - diff --git a/code/modules/scripting/Interpreter/Scope.dm b/code/modules/scripting/Interpreter/Scope.dm deleted file mode 100644 index d768e74bf16..00000000000 --- a/code/modules/scripting/Interpreter/Scope.dm +++ /dev/null @@ -1,16 +0,0 @@ -/* - Class: scope - A runtime instance of a block. Used internally by the interpreter. -*/ -/scope/ - var/scope/parent = null - var/node/BlockDefinition/block - var/list/functions - var/list/variables - -/scope/New(node/BlockDefinition/B, scope/parent) - src.block = B - src.parent = parent - src.variables = B.initial_variables.Copy() - src.functions = B.functions.Copy() - .=..() \ No newline at end of file diff --git a/code/modules/scripting/Options.dm b/code/modules/scripting/Options.dm deleted file mode 100644 index a839cf9183d..00000000000 --- a/code/modules/scripting/Options.dm +++ /dev/null @@ -1,99 +0,0 @@ -/* -File: Options -*/ -var/global/const/ascii_A =65 -var/global/const/ascii_Z =90 -var/global/const/ascii_a =97 -var/global/const/ascii_z =122 -var/global/const/ascii_DOLLAR = 36 // $ -var/global/const/ascii_ZERO=48 -var/global/const/ascii_NINE=57 -var/global/const/ascii_UNDERSCORE=95 // _ - -/* - Class: n_scriptOptions -*/ -/n_scriptOptions/proc/CanStartID(char) //returns true if the character can start a variable, function, or keyword name (by default letters or an underscore) - if(!isnum(char))char=text2ascii(char) - return (char in ascii_A to ascii_Z) || (char in ascii_a to ascii_z) || char==ascii_UNDERSCORE || char==ascii_DOLLAR - -/n_scriptOptions/proc/IsValidIDChar(char) //returns true if the character can be in the body of a variable, function, or keyword name (by default letters, numbers, and underscore) - if(!isnum(char))char=text2ascii(char) - return CanStartID(char) || IsDigit(char) - -/n_scriptOptions/proc/IsDigit(char) - if(!isnum(char))char=text2ascii(char) - return char in ascii_ZERO to ascii_NINE - -/n_scriptOptions/proc/IsValidID(id) //returns true if all the characters in the string are okay to be in an identifier name - if(!CanStartID(id)) //don't need to grab first char in id, since text2ascii does it automatically - return 0 - if(length(id)==1) return 1 - for(var/i=2 to length(id)) - if(!IsValidIDChar(copytext(id, i, i+1))) - return 0 - return 1 - -/* - Class: nS_Options - An implementation of for the n_Script language. -*/ -/n_scriptOptions/nS_Options - var/list/symbols = list("(", ")", "\[", "]", ";", ",", "{", "}") //scanner - Characters that can be in symbols -/* -Var: keywords -An associative list used by the parser to parse keywords. Indices are strings which will trigger the keyword when parsed and the -associated values are types of which the proc will be called. -*/ - var/list/keywords = list( - "if" = /n_Keyword/nS_Keyword/kwIf, - "else" = /n_Keyword/nS_Keyword/kwElse, - "while" = /n_Keyword/nS_Keyword/kwWhile, - "break" = /n_Keyword/nS_Keyword/kwBreak, - "continue" = /n_Keyword/nS_Keyword/kwContinue, - "return" = /n_Keyword/nS_Keyword/kwReturn, - "def" = /n_Keyword/nS_Keyword/kwDef - ) - - var/list/assign_operators = list( - "=" = null, - "&=" = "&", - "|=" = "|", - "`=" = "`", - "+=" = "+", - "-=" = "-", - "*=" = "*", - "/=" = "/", - "^=" = "^", - "%=" = "%" - ) - - var/list/unary_operators =list( - "!" = /node/expression/operator/unary/LogicalNot, - "~" = /node/expression/operator/unary/BitwiseNot, - "-" = /node/expression/operator/unary/Minus - ) - - var/list/binary_operators=list( - "==" = /node/expression/operator/binary/Equal, - "!=" = /node/expression/operator/binary/NotEqual, - ">" = /node/expression/operator/binary/Greater, - "<" = /node/expression/operator/binary/Less, - ">=" = /node/expression/operator/binary/GreaterOrEqual, - "<=" = /node/expression/operator/binary/LessOrEqual, - "&&" = /node/expression/operator/binary/LogicalAnd, - "||" = /node/expression/operator/binary/LogicalOr, - "&" = /node/expression/operator/binary/BitwiseAnd, - "|" = /node/expression/operator/binary/BitwiseOr, - "`" = /node/expression/operator/binary/BitwiseXor, - "+" = /node/expression/operator/binary/Add, - "-" = /node/expression/operator/binary/Subtract, - "*" = /node/expression/operator/binary/Multiply, - "/" = /node/expression/operator/binary/Divide, - "^" = /node/expression/operator/binary/Power, - "%" = /node/expression/operator/binary/Modulo) - -/n_scriptOptions/nS_Options/New() - .=..() - for(var/O in assign_operators+binary_operators+unary_operators) - if(!symbols.Find(O)) symbols+=O \ No newline at end of file diff --git a/code/modules/scripting/Parser/Expressions.dm b/code/modules/scripting/Parser/Expressions.dm deleted file mode 100644 index eddfdbf679c..00000000000 --- a/code/modules/scripting/Parser/Expressions.dm +++ /dev/null @@ -1,310 +0,0 @@ -/* - File: Expressions - Procedures for parsing expressions. -*/ - -/* - Macros: Expression Macros - OPERATOR - A value indicating the parser currently expects a binary operator. - VALUE - A value indicating the parser currently expects a value. - SHIFT - Tells the parser to push the current operator onto the stack. - REDUCE - Tells the parser to reduce the stack. -*/ -#define OPERATOR 1 -#define VALUE 2 -#define SHIFT 0 -#define REDUCE 1 - -/* - Class: nS_Parser -*/ -/n_Parser/nS_Parser -/* - Var: expecting - A variable which keeps track of whether an operator or value is expected. It should be either or . See - for more information. -*/ - var/expecting=VALUE - -/* - Proc: Precedence - Compares two operators, decides which is higher in the order of operations, and returns or . -*/ -/n_Parser/nS_Parser/proc/Precedence(node/expression/operator/top, node/expression/operator/input) - if(istype(top)) - top=top.precedence - if(istype(input)) - input=input:precedence - if(top>=input) - return REDUCE - return SHIFT - -/* -Proc: GetExpression -Takes a token expected to represent a value and returns an node. -*/ -/n_Parser/nS_Parser/proc/GetExpression(token/T) - if(!T) return - if(istype(T, /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)) - S.Push(A) - A=A.object - ASSERT(istext(A.object)) - - while(A) - var/node/expression/value/variable/V=new() - V.id=new(A.member) - if(E) - V.object=E - else - V.object=new/node/identifier(A.object) - E=V - A=S.Pop() - return E - - if(/token/number, /token/string) - return new/node/expression/value/literal(T.value) - -/* -Proc: GetOperator -Gets a path related to a token or string and returns an instance of the given type. This is used to get an instance of either a binary or unary -operator from a token. - -Parameters: -O - The input value. If this is a token, O is reset to the token's value. - When O is a string and is in L, its associated value is used as the path to instantiate. -type - The desired type of the returned object. -L - The list in which to search for O. - -See Also: -- -- -*/ -/n_Parser/nS_Parser/proc/GetOperator(O, type=/node/expression/operator, 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(istext(O)) //sets O to path - if(L.Find(O)) O=L[O] - else return null - if(ispath(O))O=new O //catches path from last check - else return null //Unknown type - return O - -/* -Proc: GetBinaryOperator -Uses to search for an instance of a binary operator type with which the given string is associated. For example, if -O is set to "+", an node is returned. - -See Also: -- -- -*/ -/n_Parser/nS_Parser/proc/GetBinaryOperator(O) - return GetOperator(O, /node/expression/operator/binary, options.binary_operators) - -/* -Proc: GetUnaryOperator -Uses to search for an instance of a unary operator type with which the given string is associated. For example, if -O is set to "!", a node is returned. - -See Also: -- -- -*/ -/n_Parser/nS_Parser/proc/GetUnaryOperator(O) - return GetOperator(O, /node/expression/operator/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/operator/O=opr.Pop() - if(!O) return - if(!istype(O)) - errors+=new/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/operator/binary)) - var/node/expression/operator/binary/B=O - B.exp2=val.Pop() - B.exp =val.Pop() - val.Push(B) - else - O.exp=val.Pop() - val.Push(O) - -/* -Proc: EndOfExpression -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[]) - if(!curToken) - return 1 - if(istype(curToken, /token/symbol) && end.Find(curToken.value)) - return 1 - if(istype(curToken, /token/end) && end.Find(/token/end)) - return 1 - return 0 - -/* -Proc: ParseExpression -Uses the Shunting-yard algorithm to parse expressions. - -Notes: -- When an opening parenthesis is found, then is called to handle it. -- The variable helps distinguish unary operators from binary operators (for cases like the - operator, which can be either). - -Articles: -- -- - -See Also: -- -- -- -*/ -/n_Parser/nS_Parser/proc/ParseExpression(list/end=list(/token/end), list/ErrChars=list("{", "}")) - var/stack/opr=new - var/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) - break - - - if(index>tokens.len) //End of File - errors+=new/scriptError/EndOfFile() - break - var/token/ntok - if(index+1<=tokens.len) - ntok=tokens[index+1] - - if(istype(curToken, /token/symbol) && curToken.value=="(") //Parse parentheses expression - if(expecting!=VALUE) - errors+=new/scriptError/ExpectedToken("operator", curToken) - NextToken() - continue - val.Push(ParseParenExpression()) - else if(istype(curToken, /token/symbol)) //Operator found. - var/node/expression/operator/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) - NextToken() - continue - else - curOperator=GetUnaryOperator(curToken) - if(!curOperator) //given symbol isn't a unary operator - errors+=new/scriptError/ExpectedToken("expression", curToken) - NextToken() - continue - - if(opr.Top() && Precedence(opr.Top(), curOperator)==REDUCE) //Check order of operations and reduce if necessary - Reduce(opr, val) - 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 - var/old_expect=src.expecting - var/fex=ParseFunctionExpression() - if(old_expect!=VALUE) - errors+=new/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] - 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) - NextToken() - continue - else - if(expecting!=VALUE) - errors+=new/scriptError/ExpectedToken("operator", curToken) - NextToken() - continue - val.Push(GetExpression(curToken)) - src.expecting=OPERATOR - NextToken() - - 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()].") - return null - -/* -Proc: ParseFunctionExpression -Parses a function call inside of an expression. - -See Also: -- -*/ -/n_Parser/nS_Parser/proc/ParseFunctionExpression() - var/node/expression/FunctionCall/exp=new - exp.func_name=curToken.value - NextToken() //skip function name - NextToken() //skip open parenthesis, already found - var/loops = 0 - - while(TRUE) - loops++ - if(loops>=1000) - CRASH("Something TERRIBLE has gone wrong in ParseFunctionExpression ;__;") - - if(istype(curToken, /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(")") - return exp - -/* -Proc: ParseParenExpression -Parses an expression that ends with a close parenthesis. This is used for parsing expressions inside of parentheses. - -See Also: -- -*/ -/n_Parser/nS_Parser/proc/ParseParenExpression() - if(!CheckToken("(", /token/symbol)) - return - return new/node/expression/operator/unary/group(ParseExpression(list(")"))) - -/* -Proc: ParseParamExpression -Parses an expression that ends with either a comma or close parenthesis. This is used for parsing the parameters passed to a function call. - -See Also: -- -*/ -/n_Parser/nS_Parser/proc/ParseParamExpression() - return ParseExpression(list(",", ")")) \ No newline at end of file diff --git a/code/modules/scripting/Parser/Keywords.dm b/code/modules/scripting/Parser/Keywords.dm deleted file mode 100644 index 2965b452743..00000000000 --- a/code/modules/scripting/Parser/Keywords.dm +++ /dev/null @@ -1,158 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 - -/* - File: Keywords -*/ -var/global/const/KW_FAIL = 0 //Fatal error; stop parsing entire script. -var/global/const/KW_PASS = 1 //OK -var/global/const/KW_ERR = 2 //Non-fatal error, keyword couldn't be handled properly. Ignore keyword but continue on. -var/global/const/KW_WARN = 3 //Warning - -/* -var/global/const/Class: n_Keyword -var/global/const/Represents a special statement in the code triggered by a keyword. -*/ - -/* - 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 - var/inline -/n_Keyword/New(inline=FALSE) - src.inline=inline - return ..() - -/* - Proc: Parse - Called when the parser finds a keyword in the code. - - Parameters: - 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) - -/* - Class: nS_Keyword - A keyword in n_Script. By default these include return, if, else, while, and def. To enable or disable a keyword, change the - list. - - Behavior: - When a parser is expecting a new statement, and a keyword listed in is found, it will call the keyword's - proc. -*/ -// -/n_Keyword/nS_Keyword/New(inline=0) - if(inline) - qdel(src) - -/n_Keyword/nS_Keyword/kwReturn/Parse(n_Parser/nS_Parser/parser) - .=KW_PASS - if(istype(parser.curBlock, /node/BlockDefinition/GlobalBlock)) - parser.errors+=new/scriptError/BadReturn(parser.curToken) - . = KW_WARN - var/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) - .=KW_PASS - var/node/statement/IfStatement/stmt=new - parser.NextToken() //skip 'if' token - stmt.cond=parser.ParseParenExpression() - if(!parser.CheckToken(")", /token/symbol)) - return KW_FAIL - if(!parser.CheckToken("{", /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) - .=KW_PASS - var/list/L=parser.curBlock.statements - var/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) - return KW_FAIL - parser.NextToken() //skip 'else' token - if(!parser.CheckToken("{", /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) - .=KW_PASS - var/node/statement/WhileLoop/stmt=new - parser.NextToken() //skip 'while' token - stmt.cond=parser.ParseParenExpression() - if(!parser.CheckToken(")", /token/symbol)) - return KW_FAIL - if(!parser.CheckToken("{", /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) - .=KW_PASS - if(istype(parser.curBlock, /node/BlockDefinition/GlobalBlock)) - parser.errors+=new/scriptError/BadToken(parser.curToken) - . = KW_WARN - var/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) - .=KW_PASS - if(istype(parser.curBlock, /node/BlockDefinition/GlobalBlock)) - parser.errors+=new/scriptError/BadToken(parser.curToken) - . = KW_WARN - var/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) - .=KW_PASS - var/node/statement/FunctionDefinition/def=new - parser.NextToken() //skip 'def' token - if(!parser.options.IsValidID(parser.curToken.value)) - parser.errors+=new/scriptError/InvalidID(parser.curToken) - return KW_FAIL - def.func_name=parser.curToken.value - parser.NextToken() - if(!parser.CheckToken("(", /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)) - switch(parser.curToken.value) - if(",") - parser.NextToken() - if(")") - break - else - parser.errors+=new/scriptError/BadToken(parser.curToken) - return KW_ERR - - else if(istype(parser.curToken, /token/word)) - def.parameters+=parser.curToken.value - parser.NextToken() - else - parser.errors+=new/scriptError/InvalidID(parser.curToken) - return KW_ERR - if(!parser.CheckToken(")", /token/symbol)) - return KW_FAIL - - if(istype(parser.curToken, /token/end)) //Function prototype - parser.curBlock.statements+=def - else if(parser.curToken.value=="{" && istype(parser.curToken, /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) - return KW_FAIL diff --git a/code/modules/scripting/Parser/Parser.dm b/code/modules/scripting/Parser/Parser.dm deleted file mode 100644 index ab4d6805e70..00000000000 --- a/code/modules/scripting/Parser/Parser.dm +++ /dev/null @@ -1,182 +0,0 @@ -/* - File: Parser -*/ -/* - Class: n_Parser - An object that reads tokens and produces an AST (abstract syntax tree). -*/ -/n_Parser - var/index = 1 -/* - Var: index - The parser's current position in the token's list. -*/ -/* - Var: tokens - A list of tokens in the source code generated by a scanner. -*/ - var/list/tokens = new -/* - Var: errors - A list of fatal errors found by the parser. If there are any items in this list, then it is not safe to run the returned AST. - - See Also: - - -*/ - var/list/errors = new -/* - Var: warnings - A list of non-fatal problems in the script. -*/ - var/list/warnings = new -/* - Var: curToken - The token at in . -*/ - var/token/curToken - var/stack/blocks=new - var/node/BlockDefinition/GlobalBlock/global_block=new - var/node/BlockDefinition/curBlock - -/* - Proc: Parse - Reads the tokens and returns the AST's node. Be sure to populate the tokens list before calling this procedure. -*/ -/n_Parser/proc/Parse() - -/* - Proc: NextToken - Sets to the next token in the list, or null if there are no more tokens. -*/ -/n_Parser/proc/NextToken() - if(index>=tokens.len) - curToken=null - else - curToken=tokens[++index] - return curToken - -/* - Class: nS_Parser - An implmentation of a parser for n_Script. -*/ -/n_Parser/nS_Parser - var/n_scriptOptions/nS_Options/options -/* - Constructor: New - - Parameters: - tokens - A list of tokens to parse. - options - An object used for configuration. -*/ -/n_Parser/nS_Parser/New(tokens[], n_scriptOptions/options) - src.tokens=tokens - src.options=options - curBlock=global_block - return ..() - -/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] - kw=new kw() - if(kw) - if(!kw.Parse(src)) - return - if(/token/word) - var/token/ntok - if(index+1>tokens.len) - errors+=new/scriptError/BadToken(curToken) - continue - ntok=tokens[index+1] - if(!istype(ntok, /token/symbol)) - errors+=new/scriptError/BadToken(ntok) - continue - if(ntok.value=="(") - ParseFunctionStatement() - else if(options.assign_operators.Find(ntok.value)) - ParseAssignment() - else - errors+=new/scriptError/BadToken(ntok) - continue - if(!istype(curToken, /token/end)) - errors+=new/scriptError/ExpectedToken(";", curToken) - continue - if(/token/symbol) - if(curToken.value=="}") - if(!EndBlock()) - errors+=new/scriptError/BadToken(curToken) - continue - else - errors+=new/scriptError/BadToken(curToken) - continue - if(/token/end) - warnings+=new/scriptError/BadToken(curToken) - continue - else - errors+=new/scriptError/BadToken(curToken) - return - return global_block - -/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) - return 0 - if(skip)NextToken() - return 1 - -/n_Parser/nS_Parser/proc/AddBlock(node/BlockDefinition/B) - blocks.Push(curBlock) - curBlock=B - -/n_Parser/nS_Parser/proc/EndBlock() - if(curBlock==global_block) return 0 - curBlock=blocks.Pop() - return 1 - -/n_Parser/nS_Parser/proc/ParseAssignment() - var/name=curToken.value - if(!options.IsValidID(name)) - errors+=new/scriptError/InvalidID(curToken) - return - NextToken() - var/t=options.binary_operators[options.assign_operators[curToken.value]] - var/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: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.") - return - var/node/statement/FunctionCall/stmt=new - stmt.func_name=curToken.value - NextToken() //skip function name - if(!CheckToken("(", /token/symbol)) //Check for and skip open parenthesis - return - var/loops = 0 - while(TRUE) - loops++ - if(loops>=6000) - CRASH("Something TERRIBLE has gone wrong in ParseFunctionStatement ;__;") - - if(!curToken) - errors+=new/scriptError/EndOfFile() - return - if(istype(curToken, /token/symbol) && curToken.value==")") - curBlock.statements+=stmt - NextToken() //Skip close parenthesis - return - var/node/expression/P=ParseParamExpression() - stmt.parameters+=P - if(istype(curToken, /token/symbol) && curToken.value==",") NextToken() \ No newline at end of file diff --git a/code/modules/scripting/Scanner/Scanner.dm b/code/modules/scripting/Scanner/Scanner.dm deleted file mode 100644 index 919bb82a488..00000000000 --- a/code/modules/scripting/Scanner/Scanner.dm +++ /dev/null @@ -1,273 +0,0 @@ -/* - File: Scanner -*/ -/* - Class: n_Scanner - An object responsible for breaking up source code into tokens for use by the parser. -*/ -/n_Scanner - var/code -/* - Var: errors - A list of fatal errors found by the scanner. If there are any items in this list, then it is not safe to parse the returned tokens. - - See Also: - - -*/ - var/list/errors = new -/* - Var: warnings - A list of non-fatal problems in the source code found by the scanner. -*/ - var/list/warnings = new - -/* - Proc: LoadCode - Loads source code. -*/ -/n_Scanner/proc/LoadCode(c) - code=c - -/* - Proc: LoadCodeFromFile - Gets the code from a file and calls . -*/ -/n_Scanner/proc/LoadCodeFromFile(f) - LoadCode(file2text(f)) - -/* - Proc: Scan - Runs the scanner and returns the resulting list of tokens. Ensure that has been called first. -*/ -/n_Scanner/proc/Scan() - -/* - Class: nS_Scanner - A scanner implementation for n_Script. -*/ -/n_Scanner/nS_Scanner - -/* - Variable: codepos - The scanner's position in the source code. -*/ - var/codepos = 1 - var/line = 1 - var/linepos = 0 //column=codepos-linepos - var/n_scriptOptions/nS_Options/options - var/commenting = 0 /// 1 is a single-line comment, 2 is a multi-line comment -/* - Variable: ignore - A list of characters that are ignored by the scanner. - - Default Value: - Whitespace -*/ - var/list/ignore = list(" ", "\t", "\n") //Don't add tokens for whitespace -/* - Variable: end_stmt - A list of characters that end a statement. Each item may only be one character long. - - Default Value: - Semicolon -*/ - var/list/end_stmt = list(";") -/* - Variable: string_delim - A list of characters that can start and end strings. - - Default Value: - Double and single quotes. -*/ - var/list/string_delim = list("\"", "'") -/* - Variable: delim - A list of characters that denote the start of a new token. This list is automatically populated. -*/ - var/list/delim = new - -/* - Macro: COL - The current column number. -*/ - #define COL codepos-linepos - -/* - Constructor: New - Parameters: - code - The source code to tokenize. - options - An object used to configure the scanner. -*/ -/n_Scanner/nS_Scanner/New(code, n_scriptOptions/nS_Options/options) - .=..() - ignore+= ascii2text(13) //Carriage return - delim += ignore + options.symbols + end_stmt + string_delim - src.options=options - LoadCode(code) - -/n_Scanner/nS_Scanner/Scan() //Creates a list of tokens from source code - var/list/tokens=new - for(, src.codepos<=length(code), src.codepos++) - - var/char=copytext(code, codepos, codepos+1) - if(char=="\n") - line++ - linepos=codepos - - if(ignore.Find(char)) - continue - else if(char == "/") - ReadComment() - else if(end_stmt.Find(char)) - tokens+=new /token/end(char, line, COL) - else if(string_delim.Find(char)) - codepos++ //skip string delimiter - tokens+=ReadString(char) - else if(options.CanStartID(char)) - tokens+=ReadWord() - else if(options.IsDigit(char)) - tokens+=ReadNumber() - else if(options.symbols.Find(char)) - tokens+=ReadSymbol() - - - codepos=initial(codepos) - line=initial(line) - linepos=initial(linepos) - return tokens - -/* - Proc: ReadString - Reads a string in the source code into a token. - - Parameters: - start - The character used to start the string. -*/ -/n_Scanner/nS_Scanner/proc/ReadString(start) - var/buf - for(, codepos <= length(code), codepos++)//codepos to length(code)) - var/char=copytext(code, codepos, codepos+1) - switch(char) - if("\\") //Backslash (\) encountered in string - codepos++ //Skip next character in string, since it was escaped by a backslash - char=copytext(code, codepos, codepos+1) - switch(char) - if("\\") //Double backslash - buf+="\\" - if("n") //\n Newline - buf+="\n" - else - if(char==start) //\" Doublequote - buf+=start - else //Unknown escaped text - buf+=char - if("\n") - . = new/token/string(buf, line, COL) - errors+=new/scriptError("Unterminated string. Newline reached.", .) - line++ - linepos=codepos - break - else - if(char==start) //string delimiter found, end string - break - else - buf+=char //Just a normal character in a string - if(!.) return new/token/string(buf, line, COL) - -/* -Proc: ReadWord -Reads characters separated by an item in into a token. -*/ -/n_Scanner/nS_Scanner/proc/ReadWord() - var/char=copytext(code, codepos, codepos+1) - var/buf - while(!delim.Find(char) && codepos<=length(code)) - buf+=char - char=copytext(code, ++codepos, codepos+1) - codepos-- //allow main Scan() proc to read the delimiter - if(options.keywords.Find(buf)) - return new /token/keyword(buf, line, COL) - else - return new /token/word(buf, line, COL) - -/* -Proc: ReadSymbol -Reads a symbol into a token. -*/ -/n_Scanner/nS_Scanner/proc/ReadSymbol() - var/char=copytext(code, codepos, codepos+1) - var/buf - - while(options.symbols.Find(buf+char)) - buf+=char - if(++codepos>length(code)) break - char=copytext(code, codepos, codepos+1) - - codepos-- //allow main Scan() proc to read the next character - return new /token/symbol(buf, line, COL) - -/* -Proc: ReadNumber -Reads a number into a token. -*/ -/n_Scanner/nS_Scanner/proc/ReadNumber() - var/char=copytext(code, codepos, codepos+1) - var/buf - var/dec=0 - - while(options.IsDigit(char) || (char=="." && !dec)) - if(char==".") dec=1 - buf+=char - codepos++ - char=copytext(code, codepos, codepos+1) - var/token/number/T=new(buf, line, COL) - if(isnull(text2num(buf))) - errors+=new/scriptError("Bad number: ", T) - T.value=0 - codepos-- //allow main Scan() proc to read the next character - return T - -/* -Proc: ReadComment -Reads a comment and outputs the type of comment -*/ - -/n_Scanner/nS_Scanner/proc/ReadComment() - var/char=copytext(code, codepos, codepos+1) - var/nextchar=copytext(code, codepos+1, codepos+2) - var/charstring = char+nextchar - var/comm = 1 - // 1: single-line comment - // 2: multi-line comment - var/expectedend = 0 - - if(charstring == "//" || charstring == "/*") - if(charstring == "/*") - comm = 2 // starts a multi-line comment - - while(comm) - if(++codepos>length(code)) break - - if(expectedend) // ending statement expected... - char = copytext(code, codepos, codepos+1) - if(char == "/") // ending statement found - beak the comment - comm = 0 - break - - if(comm == 2) - // multi-line comments are broken by ending statements - char = copytext(code, codepos, codepos+1) - if(char == "*") - expectedend = 1 - continue - else - char = copytext(code, codepos, codepos+1) - if(char == "\n") - comm = 0 - break - - if(expectedend) expectedend = 0 - - if(comm == 2) - errors+=new/scriptError/UnterminatedComment() - diff --git a/code/modules/scripting/Scanner/Tokens.dm b/code/modules/scripting/Scanner/Tokens.dm deleted file mode 100644 index 5068e97c5ac..00000000000 --- a/code/modules/scripting/Scanner/Tokens.dm +++ /dev/null @@ -1,37 +0,0 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 - -/* - Class: Token - Represents an entity and position in the source code. -*/ -/token - var/value - var/line - var/column - -/token/New(v, l=0, c=0) - value=v - line=l - column=c - -/token/string -/token/symbol -/token/word -/token/keyword -/token/number/New() - .=..() - if(!isnum(value)) - value=text2num(value) - ASSERT(!isnull(value)) -/token/accessor - var/object - var/member - -/token/accessor/New(object, member, l=0, c=0) - src.object=object - src.member=member - src.value="[object].[member]" //for debugging only - src.line=l - src.column=c - -/token/end diff --git a/code/modules/scripting/stack.dm b/code/modules/scripting/stack.dm deleted file mode 100644 index 3c7fa52ac72..00000000000 --- a/code/modules/scripting/stack.dm +++ /dev/null @@ -1,21 +0,0 @@ -/stack - var/list/contents=new -/stack/proc/Push(value) - contents+=value - -/stack/proc/Pop() - if(!contents.len) return null - . = contents[contents.len] - contents.len-- - -/stack/proc/Top() //returns the item on the top of the stack without removing it - if(!contents.len) return null - return contents[contents.len] - -/stack/proc/Copy() - var/stack/S=new() - S.contents=src.contents.Copy() - return S - -/stack/proc/Clear() - contents.Cut() \ No newline at end of file diff --git a/polaris.dme b/polaris.dme index 9428e9170f6..751ad22b961 100644 --- a/polaris.dme +++ b/polaris.dme @@ -816,7 +816,6 @@ #include "code\game\machinery\telecomms\server.dm" #include "code\game\machinery\telecomms\telecomms.dm" #include "code\game\machinery\telecomms\telemonitor.dm" -#include "code\game\machinery\telecomms\traffic_control.dm" #include "code\game\machinery\virtual_reality\ar_console.dm" #include "code\game\machinery\virtual_reality\vr_console.dm" #include "code\game\magic\Uristrunes.dm" @@ -3062,26 +3061,6 @@ #include "code\modules\research\designs\circuits\ai_modules.dm" #include "code\modules\research\designs\circuits\circuits.dm" #include "code\modules\research\designs\circuits\disks.dm" -#include "code\modules\scripting\Errors.dm" -#include "code\modules\scripting\IDE.dm" -#include "code\modules\scripting\Options.dm" -#include "code\modules\scripting\stack.dm" -#include "code\modules\scripting\AST\AST Nodes.dm" -#include "code\modules\scripting\AST\Blocks.dm" -#include "code\modules\scripting\AST\Statements.dm" -#include "code\modules\scripting\AST\Operators\Binary Operators.dm" -#include "code\modules\scripting\AST\Operators\Unary Operators.dm" -#include "code\modules\scripting\Implementations\_Logic.dm" -#include "code\modules\scripting\Implementations\Telecomms.dm" -#include "code\modules\scripting\Interpreter\Evaluation.dm" -#include "code\modules\scripting\Interpreter\Interaction.dm" -#include "code\modules\scripting\Interpreter\Interpreter.dm" -#include "code\modules\scripting\Interpreter\Scope.dm" -#include "code\modules\scripting\Parser\Expressions.dm" -#include "code\modules\scripting\Parser\Keywords.dm" -#include "code\modules\scripting\Parser\Parser.dm" -#include "code\modules\scripting\Scanner\Scanner.dm" -#include "code\modules\scripting\Scanner\Tokens.dm" #include "code\modules\security levels\keycard authentication.dm" #include "code\modules\security levels\security levels.dm" #include "code\modules\shieldgen\directional_shield.dm"