import string fun null_symbol(): symbol { var toRet.construct(string::string("$NULL"), false, string::string("$NULL$")): symbol return toRet } fun symbol(nameIn: *char, terminalIn: bool): symbol { var toRet.construct(string::string(nameIn), terminalIn, string::string("no_value")): symbol return toRet } fun symbol(nameIn: string::string, terminalIn: bool): symbol { var toRet.construct(nameIn, terminalIn, string::string("no_value")): symbol return toRet } fun symbol(nameIn: *char, terminalIn: bool, dataIn: *char): symbol { var toRet.construct(string::string(nameIn), terminalIn, string::string(dataIn)): symbol return toRet } fun symbol(nameIn: string::string, terminalIn: bool, dataIn: string::string): symbol { var toRet.construct(nameIn, terminalIn, dataIn): symbol return toRet } obj symbol (Object) { var data: string::string var name: string::string var terminal: bool fun construct(): *symbol { data.construct() name.construct() return this } fun construct(nameIn: string::string, terminalIn: bool, dataIn: string::string): *symbol { name.construct(nameIn) terminal = terminalIn data.construct(dataIn) return this } fun destruct() { data.destruct() name.destruct() } fun copy_construct(old: *symbol) { data.copy_construct(&old->data) name.copy_construct(&old->name) terminal = old->terminal } fun operator=(old: symbol) { destruct() copy_construct(&old) } fun operator==(other: symbol): bool { return data == other.data && name == other.name && terminal == other.terminal; } fun to_string(): string::string { var terminalString: *char if (terminal) terminalString = "true" else terminalString = "false" return name + ": " + data + " " + terminalString } }