mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 10:12:45 +00:00
▫ Signals can now be rejected by Subspace broadcasters through a specific data[] parameter. ▫ Improved the log browser. ▫ Log browsers and telecommunication monitors no longer require access to use. You do need access to delete logs, however. ▫ Intercoms need power to work. They don't drain power, they just need a constant flow of equipment power. As such, that offline intercom sprite's now finally being put to use. Scripting language: ▫ Sorry about all the files; they're all necessary! It's important to notice that the basic structure of the scripting language code is not mine; I cannibalized the base structure from some obscure BYOND project. It's pretty well documented, and I'd say easier to browse through than atmos. Here's the basic deal: A compiler datum manages the relationships between the three main subsystems of a scripting language: the Scanner, the Parser, and the Interpreter. The Scanner splits raw text into token datums that the Parser can read. The Parser transforms the otherwise random bits and strings into ordered AST Trees and nodes for the Interpreter to read. The interpreter actually executes the code and handles scope/functions/code blocks. Revision: r3193 Author: vageyenaman
132 lines
2.9 KiB
Plaintext
132 lines
2.9 KiB
Plaintext
/*
|
|
File: Errors
|
|
*/
|
|
/*
|
|
Class: scriptError
|
|
An error scanning or parsing the source code.
|
|
*/
|
|
/scriptError
|
|
var
|
|
/*
|
|
Var: message
|
|
A message describing the problem.
|
|
*/
|
|
message
|
|
New(msg=null)
|
|
if(msg)message=msg
|
|
|
|
BadToken
|
|
message="Unexpected token: "
|
|
var/token/token
|
|
New(token/t)
|
|
token=t
|
|
if(t&&t.line) message="[t.line]: [message]"
|
|
if(istype(t))message+="[t.value]"
|
|
else message+="[t]"
|
|
|
|
InvalidID
|
|
parent_type=/scriptError/BadToken
|
|
message="Invalid identifier name: "
|
|
|
|
ReservedWord
|
|
parent_type=/scriptError/BadToken
|
|
message="Identifer using reserved word: "
|
|
|
|
BadNumber
|
|
parent_type=/scriptError/BadToken
|
|
message = "Bad number: "
|
|
|
|
BadReturn
|
|
var/token/token
|
|
message = "Unexpected return statement outside of a function."
|
|
New(token/t)
|
|
src.token=t
|
|
|
|
EndOfFile
|
|
message = "Unexpected end of file."
|
|
|
|
ExpectedToken
|
|
message="Expected: '"
|
|
New(id, token/T)
|
|
if(T && T.line) message="[T.line]: [message]"
|
|
message+="[id]'. "
|
|
if(T)message+="Found '[T.value]'."
|
|
|
|
|
|
UnterminatedComment
|
|
message="Unterminated multi-line comment statement: expected */"
|
|
|
|
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.
|
|
*/
|
|
message
|
|
stack/stack
|
|
|
|
proc
|
|
/*
|
|
Proc: ToString
|
|
Returns a description of the error suitable for showing to the user.
|
|
*/
|
|
ToString()
|
|
. = "[name]: [message]"
|
|
if(!stack.Top()) return
|
|
.+="\nStack:"
|
|
while(stack.Top())
|
|
var/node/statement/FunctionCall/stmt=stack.Pop()
|
|
. += "\n\t [stmt.func_name]()"
|
|
|
|
TypeMismatch
|
|
name="TypeMismatchError"
|
|
New(op, a, b)
|
|
message="Type mismatch: '[a]' [op] '[b]'"
|
|
|
|
UnexpectedReturn
|
|
name="UnexpectedReturnError"
|
|
message="Unexpected return statement."
|
|
|
|
UnknownInstruction
|
|
name="UnknownInstructionError"
|
|
message="Unknown instruction type. This may be due to incompatible compiler and interpreter versions or a lack of implementation."
|
|
|
|
UndefinedVariable
|
|
name="UndefinedVariableError"
|
|
New(variable)
|
|
message="Variable '[variable]' has not been declared."
|
|
|
|
UndefinedFunction
|
|
name="UndefinedFunctionError"
|
|
New(function)
|
|
message="Function '[function]()' has not been defined."
|
|
|
|
DuplicateVariableDeclaration
|
|
name="DuplicateVariableError"
|
|
New(variable)
|
|
message="Variable '[variable]' was already declared."
|
|
|
|
IterationLimitReached
|
|
name="MaxIterationError"
|
|
message="A loop has reached its maximum number of iterations."
|
|
|
|
RecursionLimitReached
|
|
name="MaxRecursionError"
|
|
message="The maximum amount of recursion has been reached."
|
|
|
|
DivisionByZero
|
|
name="DivideByZeroError"
|
|
message="Division by zero attempted."
|
|
|
|
MaxCPU
|
|
name="MaxComputationalUse"
|
|
message="Maximum amount of computational cycles reached (>= 1000)." |