Skip to content
Snippets Groups Projects
Commit da836c18 authored by Chris's avatar Chris
Browse files

Zuweisung von Zahl zu Variable und LOOPs mit 0 Durchläufen funktionieren jetzt richtig

parent d1345f0b
No related branches found
No related tags found
1 merge request!1Master
...@@ -23,7 +23,7 @@ def process_assignment(token_queue, position, value_list, forbidden_identifiers) ...@@ -23,7 +23,7 @@ def process_assignment(token_queue, position, value_list, forbidden_identifiers)
value_1 = 0 value_1 = 0
if token_queue[position + 2].k == 'NUMBER': if token_queue[position + 2].k == 'NUMBER':
value_1 += int(token_queue[position + 2].v) value_1 = int(token_queue[position + 2].v)
value_list.update({identifier_1: value_1}) value_list.update({identifier_1: value_1})
return position + 3, value_list return position + 3, value_list
...@@ -31,7 +31,8 @@ def process_assignment(token_queue, position, value_list, forbidden_identifiers) ...@@ -31,7 +31,8 @@ def process_assignment(token_queue, position, value_list, forbidden_identifiers)
raise SyntaxError("IDENTIFIER in Zuweisung erwartet.") raise SyntaxError("IDENTIFIER in Zuweisung erwartet.")
identifier_2 = token_queue[position + 2].v identifier_2 = token_queue[position + 2].v
if identifier_2 in forbidden_identifiers: if identifier_2 in forbidden_identifiers:
raise Exception("Identifier " + identifier_2 + " ist bereits in Loop vorhanden und darf nicht verwendet werden.") raise Exception(
"Identifier " + identifier_2 + " ist bereits in Loop vorhanden und darf nicht verwendet werden.")
if identifier_2 in value_list: if identifier_2 in value_list:
value_2 = value_list.get(identifier_2) value_2 = value_list.get(identifier_2)
...@@ -49,29 +50,124 @@ def process_assignment(token_queue, position, value_list, forbidden_identifiers) ...@@ -49,29 +50,124 @@ def process_assignment(token_queue, position, value_list, forbidden_identifiers)
value_list.update({identifier_1: value_1}) value_list.update({identifier_1: value_1})
return position + 5, value_list return position + 5, value_list
def verify_assignment(token_queue, position, forbidden_identifiers):
identifier_1 = token_queue[position].v
if identifier_1 in forbidden_identifiers:
raise Exception("Identifier " + identifier_1 + "ist bereits in Loop vorhanden und darf nicht verwendet werden.")
if not token_queue[position + 1].k == 'EQUALS':
raise SyntaxError(":= in Zuweisung erwartet.")
if token_queue[position + 2].k == 'NUMBER':
return position + 3
if not token_queue[position + 2].k == 'IDENTIFIER':
raise SyntaxError("IDENTIFIER in Zuweisung erwartet.")
identifier_2 = token_queue[position + 2].v
if identifier_2 in forbidden_identifiers:
raise Exception(
"Identifier " + identifier_2 + " ist bereits in Loop vorhanden und darf nicht verwendet werden.")
if not token_queue[position + 4].k == 'NUMBER':
raise SyntaxError("NUMBER in Zuweisung erwartet.")
if not token_queue[position + 3].k in ['PLUS', 'MINUS']:
raise SyntaxError("PLUS oder MINUS in Zuweisung erwartet.")
return position + 5
def verify_loop(token_queue, position, forbidden_identifiers):
identifier_token = token_queue[position + 1]
if not identifier_token.k == 'IDENTIFIER':
raise SyntaxError('IDENTIFIER in LOOP erwartet.')
if identifier_token.v in forbidden_identifiers:
raise SyntaxError(
"Identifier " + identifier_token.v + "ist bereits in Loop vorhanden und darf nicht verwendet werden.")
if not token_queue[position + 2].k == 'DO':
raise SyntaxError('DO in LOOP erwartet.')
forbidden_identifiers.append(identifier_token.v)
end_found = False
while not end_found:
position = verify_program(token_queue, position, forbidden_identifiers)
if token_queue[position].k == 'SEMICOLON':
position = position + 1
continue
elif token_queue[position].k == 'END':
end_found = True
else:
raise SyntaxError("SEMICOLON oder END erwartet.")
forbidden_identifiers.remove(identifier_token.v)
return position + 1
def verify_program(token_queue, position, forbidden_identifiers):
current_key = token_queue[position].k
if current_key == 'IDENTIFIER':
try:
current_position = verify_assignment(token_queue, position, forbidden_identifiers)
except IndexError:
raise Exception("Frühzeitiges Ende einer Zuweisung.")
elif current_key == 'LOOP':
try:
current_position = verify_loop(token_queue, position, forbidden_identifiers)
except IndexError:
raise Exception("Frühzeitiges Ende eines LOOPs")
else:
raise SyntaxError("Keine passende Anweisung gefunden")
return current_position
def process_loop(token_queue, position, value_list, forbidden_identifiers): def process_loop(token_queue, position, value_list, forbidden_identifiers):
identifier_token = token_queue[position + 1] identifier_token = token_queue[position + 1]
if not identifier_token.k == 'IDENTIFIER': if not identifier_token.k == 'IDENTIFIER':
raise SyntaxError('IDENTIFIER in LOOP erwartet.') raise SyntaxError('IDENTIFIER in LOOP erwartet.')
if identifier_token.v in forbidden_identifiers:
raise SyntaxError(
"Identifier " + identifier_token.v + "ist bereits in Loop vorhanden und darf nicht verwendet werden.")
if not token_queue[position + 2].k == 'DO': if not token_queue[position + 2].k == 'DO':
raise SyntaxError('DO in LOOP erwartet.') raise SyntaxError('DO in LOOP erwartet.')
if identifier_token.v in value_list:
number_of_loops = int(value_list.get(identifier_token.v)) number_of_loops = int(value_list.get(identifier_token.v))
else:
number_of_loops = 0
saved_position = position + 3 saved_position = position + 3
forbidden_identifiers.append(identifier_token.v) forbidden_identifiers.append(identifier_token.v)
# TODO increment position without changing values when number of loops = 0
if number_of_loops == 0:
end_found = False
position = saved_position
while not end_found:
position = verify_program(token_queue, position, forbidden_identifiers)
if token_queue[position].k == 'SEMICOLON':
position = position + 1
continue
elif token_queue[position].k == 'END':
end_found = True
else:
raise SyntaxError("SEMICOLON oder END erwartet.")
for index in range(number_of_loops): for index in range(number_of_loops):
position = saved_position position = saved_position
end_found = False end_found = False
while(not end_found): while not end_found:
position, value_list = process_program(token_queue, position, value_list, forbidden_identifiers) position, value_list = process_program(token_queue, position, value_list, forbidden_identifiers)
if token_queue[position].k == 'SEMICOLON': if token_queue[position].k == 'SEMICOLON':
position = position + 1 position = position + 1
continue continue
elif token_queue[position].k == 'END': elif token_queue[position].k == 'END':
end_found = True end_found = True
else: raise SyntaxError("SEMICOLON oder END erwartet.") else:
raise SyntaxError("SEMICOLON oder END erwartet.")
forbidden_identifiers.remove(identifier_token.v)
return position + 1, value_list return position + 1, value_list
def process_program(token_queue, position, value_list, forbidden_identifiers): def process_program(token_queue, position, value_list, forbidden_identifiers):
current_key = token_queue[position].k current_key = token_queue[position].k
if current_key == 'IDENTIFIER': if current_key == 'IDENTIFIER':
...@@ -88,6 +184,7 @@ def process_program(token_queue, position, value_list, forbidden_identifiers): ...@@ -88,6 +184,7 @@ def process_program(token_queue, position, value_list, forbidden_identifiers):
raise SyntaxError("Keine passende Anweisung gefunden") raise SyntaxError("Keine passende Anweisung gefunden")
return current_position, values return current_position, values
def interpret(program): def interpret(program):
tokens = lexer.tokenize(program) tokens = lexer.tokenize(program)
current_position = 0 current_position = 0
...@@ -103,4 +200,7 @@ def interpret(program): ...@@ -103,4 +200,7 @@ def interpret(program):
return values.get("x0") return values.get("x0")
return 0 return 0
print(interpret(loop_program)) print(interpret(loop_program))
print(interpret('''x1:= 2;
LOOP x1 DO x2 := 2 END; x0 := x2 + 1'''))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment