Added some scripts
This commit is contained in:
102
original_code_parsing_reconstr.py
Normal file
102
original_code_parsing_reconstr.py
Normal file
@@ -0,0 +1,102 @@
|
||||
code = "{@STRING(\"TEST\", \"\");@IF(\"2+3*4'\"2+3*4\"&&1'1\",\"{@RETURN(\"TRUE\");}\",\"{@RETURN(\"FALSE\");}\");@RETURN(TEST);}"
|
||||
|
||||
def prepare_input(code: str) -> str:
|
||||
# original used right and left instructions for striping code from braces (yeah, they are unnecessary)
|
||||
code = code.strip()
|
||||
if code[0] == '{':
|
||||
code = code[1::]
|
||||
if code[-1] == '}':
|
||||
code = code[:-1]
|
||||
code = code.strip() # yep, another strip to remove spaces after removing braces
|
||||
return code
|
||||
|
||||
def initializeBehaviours(code: str) -> str:
|
||||
code_lines = []
|
||||
|
||||
depth = 0
|
||||
tmp_buffer = ""
|
||||
for i, c in enumerate(code):
|
||||
if c == '(':
|
||||
depth += 1
|
||||
tmp_buffer += c
|
||||
continue
|
||||
elif c == ')':
|
||||
depth -= 1
|
||||
tmp_buffer += c
|
||||
continue
|
||||
elif c == ';':
|
||||
if depth == 0:
|
||||
code_lines.append(tmp_buffer)
|
||||
tmp_buffer = ""
|
||||
continue
|
||||
else:
|
||||
tmp_buffer += c
|
||||
continue
|
||||
elif c == ' ':
|
||||
continue
|
||||
else:
|
||||
tmp_buffer += c
|
||||
|
||||
return code_lines
|
||||
|
||||
def parse_line(line: str):
|
||||
if line.endswith(';'):
|
||||
line = line[:-1] # make sure to remove the trailing semicolon if it still exists
|
||||
|
||||
current_char = line[0]
|
||||
|
||||
left_paren_index = line.find('(')
|
||||
|
||||
if current_char == '@': # special instruction
|
||||
# get the instruction name
|
||||
if left_paren_index == -1:
|
||||
left_paren_index = 1
|
||||
|
||||
instruction_name = line[1:left_paren_index]
|
||||
|
||||
# assign runner (not implemented here, just a placeholder)
|
||||
# goto LABEL_40
|
||||
|
||||
elif current_char == "*":
|
||||
close_bracket_index = line.find(']') + 1
|
||||
caret_index = line.find('^', close_bracket_index)
|
||||
|
||||
if close_bracket_index >= left_paren_index:
|
||||
caret_index = line.find('^')
|
||||
else:
|
||||
left_paren_index = line.find('(', caret_index)
|
||||
|
||||
target_name = line[1:caret_index]
|
||||
|
||||
if target_name[0] == "[":
|
||||
target_name = target_name[1:-1] # remove the brackets
|
||||
|
||||
# object = new CMC_Expression
|
||||
else:
|
||||
# object = CMC_ObjectsContainer::getObject
|
||||
pass
|
||||
|
||||
method_name = line[caret_index + 1:left_paren_index]
|
||||
# goto LABEL_40
|
||||
|
||||
elif line.startswith("THIS"):
|
||||
method_name = line[5:left_paren_index]
|
||||
# goto LABEL_40
|
||||
|
||||
pass
|
||||
|
||||
if __name__ == '__main__':
|
||||
prepared_code = prepare_input(code)
|
||||
|
||||
print("Prepared code:")
|
||||
print(prepared_code)
|
||||
|
||||
print("\nCode lines:")
|
||||
code_lines = initializeBehaviours(prepared_code)
|
||||
for line in code_lines:
|
||||
print(line)
|
||||
|
||||
for line in code_lines:
|
||||
parse_line(line)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user