removed uncapitalized ghost files
This commit is contained in:
parent
4251e63cc9
commit
369b01cd47
|
@ -1,214 +0,0 @@
|
||||||
extends Object
|
|
||||||
|
|
||||||
enum ExecutionState {
|
|
||||||
Stopped,
|
|
||||||
Running,
|
|
||||||
WaitingForOption,
|
|
||||||
Suspended
|
|
||||||
}
|
|
||||||
|
|
||||||
enum HandlerState {
|
|
||||||
PauseExecution,
|
|
||||||
ContinueExecution
|
|
||||||
}
|
|
||||||
|
|
||||||
#Compile Status return
|
|
||||||
enum CompileStatus {
|
|
||||||
Succeeded, SucceededUntaggedStrings,
|
|
||||||
}
|
|
||||||
|
|
||||||
enum ByteCode {
|
|
||||||
# opA = string: label name
|
|
||||||
Label,
|
|
||||||
# opA = string: label name
|
|
||||||
JumpTo,
|
|
||||||
# peek string from stack and jump to that label
|
|
||||||
Jump,
|
|
||||||
# opA = int: string number
|
|
||||||
RunLine,
|
|
||||||
# opA = string: command text
|
|
||||||
RunCommand,
|
|
||||||
# opA = int: string number for option to add
|
|
||||||
AddOption,
|
|
||||||
# present the current list of options, then clear the list; most recently
|
|
||||||
# selected option will be on the top of the stack
|
|
||||||
ShowOptions,
|
|
||||||
# opA = int: string number in table; push string to stack
|
|
||||||
PushString,
|
|
||||||
# opA = float: number to push to stack
|
|
||||||
PushNumber,
|
|
||||||
# opA = int (0 or 1): bool to push to stack
|
|
||||||
PushBool,
|
|
||||||
# pushes a null value onto the stack
|
|
||||||
PushNull,
|
|
||||||
# opA = string: label name if top of stack is not null, zero or false, jumps
|
|
||||||
# to that label
|
|
||||||
JumpIfFalse,
|
|
||||||
# discard top of stack
|
|
||||||
Pop,
|
|
||||||
# opA = string; looks up function, pops as many arguments as needed, result is
|
|
||||||
# pushed to stack
|
|
||||||
CallFunc,
|
|
||||||
# opA = name of variable to get value of and push to stack
|
|
||||||
PushVariable,
|
|
||||||
# opA = name of variable to store top of stack in
|
|
||||||
StoreVariable,
|
|
||||||
# stops execution
|
|
||||||
Stop,
|
|
||||||
# run the node whose name is at the top of the stack
|
|
||||||
RunNode
|
|
||||||
}
|
|
||||||
|
|
||||||
enum TokenType {
|
|
||||||
|
|
||||||
#0 Special tokens
|
|
||||||
Whitespace, Indent, Dedent, EndOfLine, EndOfInput,
|
|
||||||
|
|
||||||
#5 Numbers. Everybody loves a number
|
|
||||||
Number,
|
|
||||||
|
|
||||||
#6 Strings. Everybody also loves a string
|
|
||||||
Str,
|
|
||||||
|
|
||||||
#7 '#'
|
|
||||||
TagMarker,
|
|
||||||
|
|
||||||
#8 Command syntax ('<<foo>>')
|
|
||||||
BeginCommand, EndCommand,
|
|
||||||
|
|
||||||
ExpressionFunctionStart, # {
|
|
||||||
ExpressionFunctionEnd, # }
|
|
||||||
|
|
||||||
FormatFunctionStart, # [
|
|
||||||
FormatFunctionEnd, # ]
|
|
||||||
|
|
||||||
#10 Variables ('$foo')
|
|
||||||
Variable,
|
|
||||||
|
|
||||||
#11 Shortcut syntax ('->')
|
|
||||||
ShortcutOption,
|
|
||||||
|
|
||||||
#12 Option syntax ('[[Let's go here|Destination]]')
|
|
||||||
OptionStart, # [[
|
|
||||||
OptionDelimit, # |
|
|
||||||
OptionEnd, # ]]
|
|
||||||
|
|
||||||
#15 Command types (specially recognised command word)
|
|
||||||
IfToken, ElseIf, ElseToken, EndIf, Set,
|
|
||||||
|
|
||||||
#20 Boolean values
|
|
||||||
TrueToken, FalseToken,
|
|
||||||
|
|
||||||
#22 The null value
|
|
||||||
NullToken,
|
|
||||||
|
|
||||||
#23 Parentheses
|
|
||||||
LeftParen, RightParen,
|
|
||||||
|
|
||||||
#25 Parameter delimiters
|
|
||||||
Comma,
|
|
||||||
|
|
||||||
#26 Operators
|
|
||||||
EqualTo, # ==, eq, is
|
|
||||||
GreaterThan, # >, gt
|
|
||||||
GreaterThanOrEqualTo, # >=, gte
|
|
||||||
LessThan, # <, lt
|
|
||||||
LessThanOrEqualTo, # <=, lte
|
|
||||||
NotEqualTo, # !=, neq
|
|
||||||
|
|
||||||
#32 Logical operators
|
|
||||||
Or, # ||, or
|
|
||||||
And, # &&, and
|
|
||||||
Xor, # ^, xor
|
|
||||||
Not, # !, not
|
|
||||||
|
|
||||||
# this guy's special because '=' can mean either 'equal to'
|
|
||||||
#36 or 'becomes' depending on context
|
|
||||||
EqualToOrAssign, # =, to
|
|
||||||
|
|
||||||
#37
|
|
||||||
UnaryMinus, # -; this is differentiated from Minus
|
|
||||||
# when parsing expressions
|
|
||||||
|
|
||||||
#38
|
|
||||||
Add, # +
|
|
||||||
Minus, # -
|
|
||||||
Multiply, # *
|
|
||||||
Divide, # /
|
|
||||||
Modulo, # %
|
|
||||||
|
|
||||||
#43
|
|
||||||
AddAssign, # +=
|
|
||||||
MinusAssign, # -=
|
|
||||||
MultiplyAssign, # *=
|
|
||||||
DivideAssign, # /=
|
|
||||||
|
|
||||||
Comment, # a run of text that we ignore
|
|
||||||
|
|
||||||
Identifier, # a single word (used for functions)
|
|
||||||
|
|
||||||
Text # a run of text until we hit other syntax
|
|
||||||
}
|
|
||||||
|
|
||||||
enum ExpressionType {
|
|
||||||
Value,
|
|
||||||
FunctionCall
|
|
||||||
}
|
|
||||||
|
|
||||||
enum StatementTypes {
|
|
||||||
CustomCommand,
|
|
||||||
ShortcutOptionGroup,
|
|
||||||
Block,
|
|
||||||
IfStatement,
|
|
||||||
OptionStatement,
|
|
||||||
AssignmentStatement,
|
|
||||||
Line,
|
|
||||||
InlineExpression
|
|
||||||
}
|
|
||||||
|
|
||||||
enum ValueType {
|
|
||||||
Number,
|
|
||||||
Str,
|
|
||||||
Boolean,
|
|
||||||
Variable,
|
|
||||||
Nullean
|
|
||||||
}
|
|
||||||
|
|
||||||
static func token_type_name(value):
|
|
||||||
for key in TokenType.keys():
|
|
||||||
if TokenType[key] == value:
|
|
||||||
return key
|
|
||||||
return 'NOTVALID'
|
|
||||||
|
|
||||||
static func merge_dir(target, patch):
|
|
||||||
for key in patch:
|
|
||||||
target[key] = patch[key]
|
|
||||||
|
|
||||||
static func bytecode_name(bytecode):
|
|
||||||
return [
|
|
||||||
'Label',
|
|
||||||
'JumpTo',
|
|
||||||
'Jump',
|
|
||||||
'RunLine',
|
|
||||||
'RunCommand',
|
|
||||||
'AddOption',
|
|
||||||
'ShowOptions',
|
|
||||||
'PushString',
|
|
||||||
'PushNumber',
|
|
||||||
'PushBool',
|
|
||||||
'PushNull',
|
|
||||||
'JumpIfFalse',
|
|
||||||
'Pop',
|
|
||||||
'CallFunc',
|
|
||||||
'PushVariable',
|
|
||||||
'StoreVariable',
|
|
||||||
'Stop',
|
|
||||||
'RunNode'
|
|
||||||
][bytecode]
|
|
||||||
|
|
||||||
static func token_name(type):
|
|
||||||
for key in TokenType.keys():
|
|
||||||
if TokenType[key] == type:
|
|
||||||
return key
|
|
||||||
return ''
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
extends Object
|
|
||||||
|
|
||||||
const FunctionInfo = preload('res://addons/Wol/core/FunctionInfo.gd')
|
|
||||||
const Constants = preload('res://addons/Wol/core/Constants.gd')
|
|
||||||
|
|
||||||
var functions = {}
|
|
||||||
var virtual_machine
|
|
||||||
|
|
||||||
func get_function(name):
|
|
||||||
if functions.has(name):
|
|
||||||
return functions[name]
|
|
||||||
else :
|
|
||||||
printerr('Invalid Function: %s'% name)
|
|
||||||
return
|
|
||||||
|
|
||||||
func import_library(other):
|
|
||||||
Constants.merge_dir(functions, other.functions)
|
|
||||||
other.virtual_machine = virtual_machine
|
|
||||||
|
|
||||||
func register_function(name, parameter_count, function, returns_value):
|
|
||||||
var functionInfo = FunctionInfo.new(name, parameter_count, function, returns_value)
|
|
||||||
functions[name] = functionInfo
|
|
||||||
|
|
||||||
func deregister_function(name):
|
|
||||||
functions.erase(name)
|
|
|
@ -1,146 +0,0 @@
|
||||||
extends Object
|
|
||||||
|
|
||||||
const Constants = preload('res://addons/Wol/core/Constants.gd')
|
|
||||||
|
|
||||||
var name = ''
|
|
||||||
var filename = ''
|
|
||||||
var strings = {}
|
|
||||||
var nodes = {}
|
|
||||||
|
|
||||||
class Line:
|
|
||||||
var text = ''
|
|
||||||
var node_name = ''
|
|
||||||
var line_number = -1
|
|
||||||
var file_name = ''
|
|
||||||
var implicit = false
|
|
||||||
var substitutions = []
|
|
||||||
var meta = []
|
|
||||||
|
|
||||||
func _init(_text, _node_name, _line_number, _file_name, _implicit, _meta):
|
|
||||||
text = _text
|
|
||||||
node_name = _node_name
|
|
||||||
file_name = _file_name
|
|
||||||
implicit = _implicit
|
|
||||||
meta = _meta
|
|
||||||
|
|
||||||
func clone():
|
|
||||||
return get_script().new(text, node_name, line_number, file_name, implicit, meta)
|
|
||||||
|
|
||||||
func _to_string():
|
|
||||||
return '%s:%d: "%s"' % [file_name.get_file(), line_number, text]
|
|
||||||
|
|
||||||
class Option:
|
|
||||||
var line
|
|
||||||
var id = -1
|
|
||||||
var destination = ''
|
|
||||||
|
|
||||||
func _init(_line, _id, _destination):
|
|
||||||
line = _line
|
|
||||||
id = _id
|
|
||||||
destination = _destination
|
|
||||||
|
|
||||||
func clone():
|
|
||||||
return get_script().new(self)
|
|
||||||
|
|
||||||
class Command:
|
|
||||||
var command = ''
|
|
||||||
|
|
||||||
func _init(_command):
|
|
||||||
command = _command
|
|
||||||
|
|
||||||
class WolNode:
|
|
||||||
var name = ''
|
|
||||||
var instructions = []
|
|
||||||
var labels = {}
|
|
||||||
var tags = []
|
|
||||||
var source_id = ''
|
|
||||||
|
|
||||||
func _init(other = null):
|
|
||||||
if other != null and other.get_script() == self.get_script():
|
|
||||||
name = other.name
|
|
||||||
instructions += other.instructions
|
|
||||||
for key in other.labels.keys():
|
|
||||||
labels[key] = other.labels[key]
|
|
||||||
tags += other.tags
|
|
||||||
source_id = other.source_id
|
|
||||||
|
|
||||||
func equals(other):
|
|
||||||
if other.get_script() != get_script():
|
|
||||||
return false
|
|
||||||
if other.name != name:
|
|
||||||
return false
|
|
||||||
if other.instructions != instructions:
|
|
||||||
return false
|
|
||||||
if other.labels != labels:
|
|
||||||
return false
|
|
||||||
if other.source_id != source_id:
|
|
||||||
return false
|
|
||||||
return true
|
|
||||||
|
|
||||||
func _to_string():
|
|
||||||
return "WolNode[%s:%s]" % [name, source_id]
|
|
||||||
|
|
||||||
# TODO: Make this make sense
|
|
||||||
class Operand:
|
|
||||||
enum ValueType {
|
|
||||||
None,
|
|
||||||
StringValue,
|
|
||||||
BooleanValue,
|
|
||||||
FloatValue
|
|
||||||
}
|
|
||||||
|
|
||||||
var value
|
|
||||||
var type
|
|
||||||
|
|
||||||
func _init(_value):
|
|
||||||
if typeof(_value) == TYPE_OBJECT and _value.get_script() == get_script():
|
|
||||||
set_value(_value.value)
|
|
||||||
else:
|
|
||||||
set_value(_value)
|
|
||||||
|
|
||||||
func set_value(_value):
|
|
||||||
match typeof(_value):
|
|
||||||
TYPE_REAL,TYPE_INT:
|
|
||||||
set_number(_value)
|
|
||||||
TYPE_BOOL:
|
|
||||||
set_boolean(_value)
|
|
||||||
TYPE_STRING:
|
|
||||||
set_string(_value)
|
|
||||||
|
|
||||||
func set_boolean(_value):
|
|
||||||
value = _value
|
|
||||||
type = ValueType.BooleanValue
|
|
||||||
return self
|
|
||||||
|
|
||||||
func set_string(_value):
|
|
||||||
value = _value
|
|
||||||
type = ValueType.StringValue
|
|
||||||
return self
|
|
||||||
|
|
||||||
func set_number(_value):
|
|
||||||
value = _value
|
|
||||||
type = ValueType.FloatValue
|
|
||||||
return self
|
|
||||||
|
|
||||||
func clear_value():
|
|
||||||
type = ValueType.None
|
|
||||||
value = null
|
|
||||||
|
|
||||||
func clone():
|
|
||||||
return get_script().new(self)
|
|
||||||
|
|
||||||
func _to_string():
|
|
||||||
return "Operand[%s:%s]" % [type, value]
|
|
||||||
|
|
||||||
class Instruction:
|
|
||||||
var operation = -1
|
|
||||||
var operands = []
|
|
||||||
|
|
||||||
func _init(other = null):
|
|
||||||
if other != null and other.get_script() == self.get_script():
|
|
||||||
self.operation = other.operation
|
|
||||||
self.operands += other.operands
|
|
||||||
|
|
||||||
func _to_string():
|
|
||||||
return Constants.bytecode_name(operation) + ':' + operands as String
|
|
||||||
|
|
|
@ -1,137 +0,0 @@
|
||||||
extends Object
|
|
||||||
|
|
||||||
const Constants = preload('res://addons/Wol/core/Constants.gd')
|
|
||||||
|
|
||||||
const NANI = 'NaN'
|
|
||||||
|
|
||||||
var type = Constants.ValueType.Nullean
|
|
||||||
var number = 0
|
|
||||||
var string = ''
|
|
||||||
var variable = ''
|
|
||||||
var boolean = false
|
|
||||||
|
|
||||||
func _init(value = NANI):
|
|
||||||
if typeof(value) == TYPE_OBJECT and value.get_script() == get_script():
|
|
||||||
if value.type == Constants.ValueType.Variable:
|
|
||||||
type = value.type
|
|
||||||
variable = value.variable
|
|
||||||
else:
|
|
||||||
set_value(value)
|
|
||||||
|
|
||||||
func value():
|
|
||||||
match type:
|
|
||||||
Constants.ValueType.Number:
|
|
||||||
return number
|
|
||||||
Constants.ValueType.Str:
|
|
||||||
return string
|
|
||||||
Constants.ValueType.Boolean:
|
|
||||||
return boolean
|
|
||||||
Constants.ValueType.Variable:
|
|
||||||
return variable
|
|
||||||
return null
|
|
||||||
|
|
||||||
func as_bool():
|
|
||||||
match type:
|
|
||||||
Constants.ValueType.Number:
|
|
||||||
return number != 0
|
|
||||||
Constants.ValueType.Str:
|
|
||||||
return !string.empty()
|
|
||||||
Constants.ValueType.Boolean:
|
|
||||||
return boolean
|
|
||||||
return false
|
|
||||||
|
|
||||||
func as_string():
|
|
||||||
return '%s' % value()
|
|
||||||
|
|
||||||
func as_number():
|
|
||||||
match type:
|
|
||||||
Constants.ValueType.Number:
|
|
||||||
return number
|
|
||||||
Constants.ValueType.Str:
|
|
||||||
return float(string)
|
|
||||||
Constants.ValueType.Boolean:
|
|
||||||
return 0.0 if !boolean else 1.0
|
|
||||||
return .0
|
|
||||||
|
|
||||||
func set_value(value):
|
|
||||||
if value == null or (typeof(value) == TYPE_STRING and value == NANI):
|
|
||||||
type = Constants.ValueType.Nullean
|
|
||||||
return
|
|
||||||
|
|
||||||
match typeof(value):
|
|
||||||
TYPE_INT, TYPE_REAL:
|
|
||||||
type = Constants.ValueType.Number
|
|
||||||
number = value
|
|
||||||
TYPE_STRING:
|
|
||||||
type = Constants.ValueType.Str
|
|
||||||
string = value
|
|
||||||
TYPE_BOOL:
|
|
||||||
type = Constants.ValueType.Boolean
|
|
||||||
boolean = value
|
|
||||||
|
|
||||||
func add(other):
|
|
||||||
if type == Constants.ValueType.Str or other.type == Constants.ValueType.Str:
|
|
||||||
return get_script().new('%s%s' % [value(), other.value()])
|
|
||||||
if type == Constants.ValueType.Number and other.type == Constants.ValueType.Number:
|
|
||||||
return get_script().new(number + other.number)
|
|
||||||
return null
|
|
||||||
|
|
||||||
func equals(other):
|
|
||||||
if other.get_script() != get_script():
|
|
||||||
return false
|
|
||||||
if other.value() != value():
|
|
||||||
return false
|
|
||||||
# TODO: Add more equality cases
|
|
||||||
return true
|
|
||||||
|
|
||||||
func sub(other):
|
|
||||||
if type == Constants.ValueType.Str or other.type == Constants.ValueType.Str:
|
|
||||||
return get_script().new(str(value()).replace(str(other.value()),''))
|
|
||||||
if type == Constants.ValueType.Number and other.type == Constants.ValueType.Number:
|
|
||||||
return get_script().new(number - other.number)
|
|
||||||
return null
|
|
||||||
|
|
||||||
func mult(other):
|
|
||||||
if type == Constants.ValueType.Number and other.type == Constants.ValueType.Number:
|
|
||||||
return get_script().new(number * other.number)
|
|
||||||
return null
|
|
||||||
|
|
||||||
func div(other):
|
|
||||||
if type == Constants.ValueType.Number and other.type == Constants.ValueType.Number:
|
|
||||||
return get_script().new(number / other.number)
|
|
||||||
return null
|
|
||||||
|
|
||||||
func mod(other):
|
|
||||||
if type == Constants.ValueType.Number and other.type == Constants.ValueType.Number:
|
|
||||||
return get_script().new(number % other.number)
|
|
||||||
return null
|
|
||||||
|
|
||||||
func negative():
|
|
||||||
if type == Constants.ValueType.Number:
|
|
||||||
return get_script().new(-number)
|
|
||||||
return null
|
|
||||||
|
|
||||||
func greater(other):
|
|
||||||
if type == Constants.ValueType.Number and other.type == Constants.ValueType.Number:
|
|
||||||
return number > other.number
|
|
||||||
return false
|
|
||||||
|
|
||||||
func less(other):
|
|
||||||
if type == Constants.ValueType.Number and other.type == Constants.ValueType.Number:
|
|
||||||
return number < other.number
|
|
||||||
return false
|
|
||||||
|
|
||||||
func geq(other):
|
|
||||||
if type == Constants.ValueType.Number and other.type == Constants.ValueType.Number:
|
|
||||||
return number > other.number or equals(other)
|
|
||||||
return false
|
|
||||||
|
|
||||||
func leq(other):
|
|
||||||
if type == Constants.ValueType.Number and other.type == Constants.ValueType.Number:
|
|
||||||
return number < other.number or equals(other)
|
|
||||||
return false
|
|
||||||
|
|
||||||
func _to_string():
|
|
||||||
return 'value(type[%s]: %s)' % [type,value()]
|
|
||||||
|
|
||||||
|
|
Reference in a new issue