Return formatted code from the parser so it can be used in error messages.

master
BodgeMaster 2022-11-06 03:51:31 +01:00
parent 12dd5f50d6
commit f9f454625b
1 changed files with 25 additions and 25 deletions

View File

@ -280,7 +280,7 @@ def parse_code(code, allowed_commands, allowed_conditions, unformatted_code=True
debug_message("Formatted code: "+code) debug_message("Formatted code: "+code)
parse_position = 0 parse_position = 0
parsed_code = [[], [], -1, ""] parsed_code = [[], [], -1, "", code]
while parse_position < len(code): while parse_position < len(code):
# find next command # find next command
next_space = code.find(' ', parse_position) next_space = code.find(' ', parse_position)
@ -305,16 +305,16 @@ def parse_code(code, allowed_commands, allowed_conditions, unformatted_code=True
elif next_command == "take": elif next_command == "take":
parsed_code[0].append(command_take) parsed_code[0].append(command_take)
elif next_command == "repeat": elif next_command == "repeat":
return [[], [], next_space, "Syntax error: Condition missing"] return [[], [], next_space, "Syntax error: Condition missing", code]
elif next_command == "while": elif next_command == "while":
return [[], [], next_space, "Syntax error: Condition missing"] return [[], [], next_space, "Syntax error: Condition missing", code]
elif next_command == "if": elif next_command == "if":
return [[], [], next_space, "Syntax error: Condition missing"] return [[], [], next_space, "Syntax error: Condition missing", code]
elif next_command == "else": elif next_command[0:4] == "else":
return [[], [], parse_position, "Syntax error: Else without if statement"] return [[], [], parse_position, "Syntax error: Else without if statement", code]
else: else:
#TODO: better error message (especially when special chars are detected inside next_command or a known command) #TODO: better error message (especially when special chars are detected inside next_command or a known command)
return [[], [], parse_position, "Unknown command: "+next_command] return [[], [], parse_position, "Unknown command: "+next_command, code]
parse_position = next_space+1 parse_position = next_space+1
else: else:
debug_message("Found control structure...") debug_message("Found control structure...")
@ -325,28 +325,28 @@ def parse_code(code, allowed_commands, allowed_conditions, unformatted_code=True
repetitions_length = get_length_of_condition(code[parse_position:]) repetitions_length = get_length_of_condition(code[parse_position:])
if repetitions_length == -2: if repetitions_length == -2:
debug_message(" Mismatched <>") debug_message(" Mismatched <>")
return [[], [], parse_position, "Syntax error: Cannot not find matching '>' for this '<'"] return [[], [], parse_position, "Syntax error: Cannot not find matching '>' for this '<'", code]
repetitions = code[parse_position:parse_position+repetitions_length] repetitions = code[parse_position:parse_position+repetitions_length]
debug_message(" Number of repetitions: "+repetitions) debug_message(" Number of repetitions: "+repetitions)
repetitions_int = 0 repetitions_int = 0
try: try:
repetitions_int = int(repetitions[1:-1]) repetitions_int = int(repetitions[1:-1])
except ValueError: except ValueError:
return [[], [], parse_position, "Not a valid number: "+repetitions[1:-1]] return [[], [], parse_position, "Not a valid number: "+repetitions[1:-1], code]
parse_position = parse_position+len(repetitions) parse_position = parse_position+len(repetitions)
contained_code_length = get_length_of_contained_code(code[parse_position:]) contained_code_length = get_length_of_contained_code(code[parse_position:])
if contained_code_length == -1: if contained_code_length == -1:
debug_message(" Missing (") debug_message(" Missing (")
return [[], [], parse_position, "Syntax error: Cannot not find '(' for contained code"] return [[], [], parse_position, "Syntax error: Cannot not find '(' for contained code", code]
if contained_code_length == -2: if contained_code_length == -2:
debug_message(" Mismatched ()") debug_message(" Mismatched ()")
return [[], [], parse_position, "Syntax error: Cannot not find matching ')' for this '('"] return [[], [], parse_position, "Syntax error: Cannot not find matching ')' for this '('", code]
contained_code = code[parse_position:parse_position+contained_code_length] contained_code = code[parse_position:parse_position+contained_code_length]
debug_message(" Contained code: "+contained_code) debug_message(" Contained code: "+contained_code)
parsed_contained_code = parse_code(contained_code[1:-1], allowed_commands, allowed_conditions, unformatted_code=False) parsed_contained_code = parse_code(contained_code[1:-1], allowed_commands, allowed_conditions, unformatted_code=False)
if not parsed_contained_code[2]==-1: if not parsed_contained_code[2]==-1:
debug_message(" Error while parsing contained code") debug_message(" Error while parsing contained code")
return [[], [], parse_position+1+parsed_contained_code[2], parsed_contained_code[3]] return [[], [], parse_position+1+parsed_contained_code[2], parsed_contained_code[3], code]
parse_position = parse_position+contained_code_length+1 parse_position = parse_position+contained_code_length+1
parsed_code[1].append((repetitions_int, parsed_contained_code)) parsed_code[1].append((repetitions_int, parsed_contained_code))
@ -358,26 +358,26 @@ def parse_code(code, allowed_commands, allowed_conditions, unformatted_code=True
condition_length = get_length_of_condition(code[parse_position:]) condition_length = get_length_of_condition(code[parse_position:])
if condition_length == -2: if condition_length == -2:
debug_message(" Mismatched <>") debug_message(" Mismatched <>")
return [[], [], parse_position, "Syntax error: Cannot not find matching '>' for this '<'"] return [[], [], parse_position, "Syntax error: Cannot not find matching '>' for this '<'", code]
condition = code[parse_position:parse_position+condition_length] condition = code[parse_position:parse_position+condition_length]
debug_message(" Condition is: "+condition) debug_message(" Condition is: "+condition)
parsed_condition = parse_condition(condition[1:-1], allowed_conditions) parsed_condition = parse_condition(condition[1:-1], allowed_conditions)
if not parsed_condition[2]=="": if not parsed_condition[2]=="":
return [[], [], parse_position, parsed_condition[2]] return [[], [], parse_position, parsed_condition[2], code]
parse_position = parse_position+len(condition) parse_position = parse_position+len(condition)
then_code_length = get_length_of_contained_code(code[parse_position:]) then_code_length = get_length_of_contained_code(code[parse_position:])
if then_code_length == -1: if then_code_length == -1:
debug_message(" Missing (") debug_message(" Missing (")
return [[], [], parse_position, "Syntax error: Cannot not find '(' for then-code"] return [[], [], parse_position, "Syntax error: Cannot not find '(' for then-code", code]
if then_code_length == -2: if then_code_length == -2:
debug_message(" Mismatched ()") debug_message(" Mismatched ()")
return [[], [], parse_position, "Syntax error: Cannot not find matching ')' for this '('"] return [[], [], parse_position, "Syntax error: Cannot not find matching ')' for this '('", code]
then_code = code[parse_position:parse_position+then_code_length] then_code = code[parse_position:parse_position+then_code_length]
debug_message(" Then-code: "+then_code) debug_message(" Then-code: "+then_code)
parsed_then_code = parse_code(then_code[1:-1], allowed_commands, allowed_conditions, unformatted_code=False) parsed_then_code = parse_code(then_code[1:-1], allowed_commands, allowed_conditions, unformatted_code=False)
if not parsed_then_code[2]==-1: if not parsed_then_code[2]==-1:
debug_message(" Error while parsing then-code") debug_message(" Error while parsing then-code")
return [[], [], parse_position+1+parsed_then_code[2], parsed_then_code[3]] return [[], [], parse_position+1+parsed_then_code[2], parsed_then_code[3], code]
parse_position = parse_position+then_code_length+1 parse_position = parse_position+then_code_length+1
parsed_else_code = None parsed_else_code = None
if parse_position<len(code)+4 and code[parse_position:parse_position+4]=="else": if parse_position<len(code)+4 and code[parse_position:parse_position+4]=="else":
@ -385,10 +385,10 @@ def parse_code(code, allowed_commands, allowed_conditions, unformatted_code=True
else_code_length = get_length_of_contained_code(code[parse_position:]) else_code_length = get_length_of_contained_code(code[parse_position:])
if else_code_length == -1: if else_code_length == -1:
debug_message(" Missing (") debug_message(" Missing (")
return [[], [], parse_position, "Syntax error: Cannot not find '(' for else-code"] return [[], [], parse_position, "Syntax error: Cannot not find '(' for else-code", code]
if else_code_length == -2: if else_code_length == -2:
debug_message(" Mismatched ()") debug_message(" Mismatched ()")
return [[], [], parse_position, "Syntax error: Cannot not find matching ')' for this '('"] return [[], [], parse_position, "Syntax error: Cannot not find matching ')' for this '('", code]
else_code = code[parse_position:parse_position+else_code_length] else_code = code[parse_position:parse_position+else_code_length]
debug_message(" Else-code: "+else_code) debug_message(" Else-code: "+else_code)
parsed_else_code = parse_code(else_code[1:-1], allowed_commands, allowed_conditions, unformatted_code=False) parsed_else_code = parse_code(else_code[1:-1], allowed_commands, allowed_conditions, unformatted_code=False)
@ -403,26 +403,26 @@ def parse_code(code, allowed_commands, allowed_conditions, unformatted_code=True
condition_length = get_length_of_condition(code[parse_position:]) condition_length = get_length_of_condition(code[parse_position:])
if condition_length == -2: if condition_length == -2:
debug_message(" Mismatched <>") debug_message(" Mismatched <>")
return [[], [], parse_position, "Syntax error: Cannot not find matching '>' for this '<'"] return [[], [], parse_position, "Syntax error: Cannot not find matching '>' for this '<'", code]
condition = code[parse_position:parse_position+condition_length] condition = code[parse_position:parse_position+condition_length]
debug_message(" Condition is: "+condition) debug_message(" Condition is: "+condition)
parsed_condition = parse_condition(condition[1:-1], allowed_conditions) parsed_condition = parse_condition(condition[1:-1], allowed_conditions)
if not parsed_condition[2]=="": if not parsed_condition[2]=="":
return [[], [], parse_position, parsed_condition[2]] return [[], [], parse_position, parsed_condition[2], code]
parse_position = parse_position+len(condition) parse_position = parse_position+len(condition)
contained_code_length = get_length_of_contained_code(code[parse_position:]) contained_code_length = get_length_of_contained_code(code[parse_position:])
if contained_code_length == -1: if contained_code_length == -1:
debug_message(" Missing (") debug_message(" Missing (")
return [[], [], parse_position, "Syntax error: Cannot not find '(' for contained code"] return [[], [], parse_position, "Syntax error: Cannot not find '(' for contained code", code]
if contained_code_length == -2: if contained_code_length == -2:
debug_message(" Mismatched ()") debug_message(" Mismatched ()")
return [[], [], parse_position, "Syntax error: Cannot not find matching ')' for this '('"] return [[], [], parse_position, "Syntax error: Cannot not find matching ')' for this '('", code]
contained_code = code[parse_position:parse_position+contained_code_length] contained_code = code[parse_position:parse_position+contained_code_length]
debug_message(" Contained code: "+contained_code) debug_message(" Contained code: "+contained_code)
parsed_contained_code = parse_code(contained_code[1:-1], allowed_commands, allowed_conditions, unformatted_code=False) parsed_contained_code = parse_code(contained_code[1:-1], allowed_commands, allowed_conditions, unformatted_code=False)
if not parsed_contained_code[2]==-1: if not parsed_contained_code[2]==-1:
debug_message(" Error while parsing contained code") debug_message(" Error while parsing contained code")
return [[], [], parse_position+1+parsed_contained_code[2], parsed_contained_code[3]] return [[], [], parse_position+1+parsed_contained_code[2], parsed_contained_code[3], code]
parse_position = parse_position+contained_code_length+1 parse_position = parse_position+contained_code_length+1
parsed_code[1].append((parsed_condition, parsed_contained_code)) parsed_code[1].append((parsed_condition, parsed_contained_code))
@ -430,7 +430,7 @@ def parse_code(code, allowed_commands, allowed_conditions, unformatted_code=True
else: else:
debug_message(" Type: unknown control structure: "+control_structure) debug_message(" Type: unknown control structure: "+control_structure)
#TODO: better error message (especially when special chars are detected inside control_structure or a known command) #TODO: better error message (especially when special chars are detected inside control_structure or a known command)
return [[], [], parse_position, "Syntax error: Unknown control structure: "+control_structure] return [[], [], parse_position, "Syntax error: Unknown control structure: "+control_structure, code]
return parsed_code return parsed_code
# returns success or error message # returns success or error message