Commit 3c80fe3b authored by Christopher Happe's avatar Christopher Happe
Browse files

Refactor: Einhaeitliche Verwendung von '' anstatt ""

parent 9fa55601
......@@ -56,13 +56,13 @@ class GOTOInterpreter:
def process_assignment(self, identifier_token_1):
identifier_1 = identifier_token_1.v
if not self.next_nonempty_token('Zuweisung', ':=').k == 'ALLOCATION':
self.error_handler.handle_error(":= in Zuweisung erwartet.")
self.error_handler.handle_error(':= in Zuweisung erwartet.')
identifier_token_2 = self.next_nonempty_token('Zuweisung', 'IDENTIFIER (x0, x1, ...) oder NUMBER')
if identifier_token_2.k == 'NUMBER':
value_1 = int(identifier_token_2.v)
self.values.update({identifier_token_1.v: value_1})
if not self.next_nonempty_token("Zuweisung", "SEMICOLON").k == 'SEMICOLON':
self.error_handler.handle_error("SEMICOLON zum Abschluss einer Zuweisung erwartet.")
if not self.next_nonempty_token('Zuweisung', 'SEMICOLON').k == 'SEMICOLON':
self.error_handler.handle_error('SEMICOLON zum Abschluss einer Zuweisung erwartet.')
return self.next_token()
if not identifier_token_2.k == 'IDENTIFIER':
self.error_handler.handle_error('IDENTIFIER in Zuweisung erwartet.')
......@@ -84,28 +84,28 @@ class GOTOInterpreter:
self.error_handler.handle_error('NUMBER in Zuweisung erwartet.')
value_1 = max(0, op(value_2, int(number_token.v)))
self.values.update({identifier_1: value_1})
if not self.next_nonempty_token("Zuweisung", "SEMICOLON").k == 'SEMICOLON':
self.error_handler.handle_error("SEMICOLON zum Abschluss einer Zuweisung erwartet.")
if not self.next_nonempty_token('Zuweisung', 'SEMICOLON').k == 'SEMICOLON':
self.error_handler.handle_error('SEMICOLON zum Abschluss einer Zuweisung erwartet.')
return self.next_token()
def verify_assignment(self, identifier_token_1):
if not self.next_nonempty_token("Zuweisung", ":=").k == 'ALLOCATION':
self.error_handler.handle_error(":= in Zuweisung erwartet.")
if not self.next_nonempty_token('Zuweisung', ':=').k == 'ALLOCATION':
self.error_handler.handle_error(':= in Zuweisung erwartet.')
identifier_token_2 = self.next_nonempty_token("Zuweisung", "IDENTIFIER (x0, x1, ...) oder NUMBER")
identifier_token_2 = self.next_nonempty_token('Zuweisung', 'IDENTIFIER (x0, x1, ...) oder NUMBER')
if identifier_token_2.k == 'NUMBER':
if not self.next_nonempty_token("Zuweisung", "SEMICOLON").k == 'SEMICOLON':
self.error_handler.handle_error("SEMICOLON zum Abschluss einer Zuweisung erwartet.")
if not self.next_nonempty_token('Zuweisung', 'SEMICOLON').k == 'SEMICOLON':
self.error_handler.handle_error('SEMICOLON zum Abschluss einer Zuweisung erwartet.')
return self.next_token()
if not identifier_token_2.k == 'IDENTIFIER':
self.error_handler.handle_error("IDENTIFIER in Zuweisung erwartet.")
if self.next_nonempty_token("Zuweisung", "+ oder -").k not in ['PLUS', 'MINUS']:
self.error_handler.handle_error("+ oder - in Zuweisung erwartet.")
if not self.next_nonempty_token("Zuweisung", "NUMBER").k == 'NUMBER':
self.error_handler.handle_error("NUMBER in Zuweisung erwartet.")
if not self.next_nonempty_token("Zuweisung", "SEMICOLON").k == 'SEMICOLON':
self.error_handler.handle_error("SEMICOLON zum Abschluss einer Zuweisung erwartet.")
self.error_handler.handle_error('IDENTIFIER in Zuweisung erwartet.')
if self.next_nonempty_token('Zuweisung', '+ oder -').k not in ['PLUS', 'MINUS']:
self.error_handler.handle_error('+ oder - in Zuweisung erwartet.')
if not self.next_nonempty_token('Zuweisung', 'NUMBER').k == 'NUMBER':
self.error_handler.handle_error('NUMBER in Zuweisung erwartet.')
if not self.next_nonempty_token('Zuweisung', 'SEMICOLON').k == 'SEMICOLON':
self.error_handler.handle_error('SEMICOLON zum Abschluss einer Zuweisung erwartet.')
return self.next_token()
def process_goto(self, goto_token):
......
......@@ -25,8 +25,8 @@ class Lexer:
new_position = match.span()[1]
break
if self.current_position == new_position:
msg = ['Fehler in Zeile ' + str(self.program.count("\n", 0, self.current_position) + 1) + ':',
msg = ['Fehler in Zeile ' + str(self.program.count('\n', 0, self.current_position) + 1) + ':',
'Unbekannter String: ' + re.compile(r'[^\n]*').match(self.program, self.current_position).group()]
raise SyntaxError("\n".join(msg))
raise SyntaxError('\n'.join(msg))
self.current_position = new_position
return next_token
......@@ -12,20 +12,20 @@ class ErrorHandler:
self.interpreter = interpreter
def handle_error(self, message):
msg = ["Fehler in Zeile " + str(self.line_number + 1),
self.program.split("\n")[self.line_number],
msg = ['Fehler in Zeile ' + str(self.line_number + 1),
self.program.split('\n')[self.line_number],
message]
raise SyntaxError("\n".join(msg)) from None
raise SyntaxError('\n'.join(msg)) from None
def increase_line(self, value):
self.line_number += value
def handle_break(self):
print("BREAK in Zeile " + str(self.line_number))
print("Aktueller Zustand:")
print('BREAK in Zeile ' + str(self.line_number))
print('Aktueller Zustand:')
for k, v in self.interpreter.values.items():
print("Variable " + k + ": " + str(v))
user_input = input("Drücke ENTER zum Fotfahren oder schreibe EXIT zum Beenden:")
print('Variable ' + k + ': ' + str(v))
user_input = input('Drücke ENTER zum Fotfahren oder schreibe EXIT zum Beenden:')
if user_input.lower() == 'exit':
raise KeyboardInterrupt
......@@ -51,36 +51,36 @@ class LOOPInterpreter:
def process_assignment(self, forbidden_identifiers, identifier_token_1):
identifier_1 = identifier_token_1.v
if identifier_1 in forbidden_identifiers:
self.error_handler.handle_error("Identifier " + identifier_1 +
" ist bereits in Loop vorhanden und darf nicht verwendet werden.")
if not self.next_nonempty_token("Zuweisung", ":=").k == 'ALLOCATION':
self.error_handler.handle_error(":= in Zuweisung erwartet.")
identifier_token_2 = self.next_nonempty_token("Zuweisung", "IDENTIFIER (x0, x1, ...) oder NUMBER")
self.error_handler.handle_error('Identifier ' + identifier_1 +
' ist bereits in Loop vorhanden und darf nicht verwendet werden.')
if not self.next_nonempty_token('Zuweisung', ':=').k == 'ALLOCATION':
self.error_handler.handle_error(':= in Zuweisung erwartet.')
identifier_token_2 = self.next_nonempty_token('Zuweisung', 'IDENTIFIER (x0, x1, ...) oder NUMBER')
if identifier_token_2.k == 'NUMBER':
value_1 = int(identifier_token_2.v)
self.values.update({identifier_token_1.v: value_1})
return self.next_token()
if not identifier_token_2.k == 'IDENTIFIER':
self.error_handler.handle_error("IDENTIFIER in Zuweisung erwartet.")
self.error_handler.handle_error('IDENTIFIER in Zuweisung erwartet.')
identifier_2 = identifier_token_2.v
if identifier_2 in forbidden_identifiers:
self.error_handler.handle_error("Identifier " + identifier_2 +
" ist bereits in Loop vorhanden und darf nicht verwendet werden.")
self.error_handler.handle_error('Identifier ' + identifier_2 +
' ist bereits in Loop vorhanden und darf nicht verwendet werden.')
if identifier_2 in self.values:
value_2 = self.values.get(identifier_2)
else:
value_2 = 0
operator_token = self.next_nonempty_token("Zuweisung", "+ oder -")
operator_token = self.next_nonempty_token('Zuweisung', '+ oder -')
op = None
if operator_token.k == 'PLUS':
op = operator.__add__
elif operator_token.k == 'MINUS':
op = operator.__sub__
else:
self.error_handler.handle_error("+ oder - in Zuweisung erwartet.")
number_token = self.next_nonempty_token("Zuweisung", "NUMBER")
self.error_handler.handle_error('+ oder - in Zuweisung erwartet.')
number_token = self.next_nonempty_token('Zuweisung', 'NUMBER')
if not number_token.k == 'NUMBER':
self.error_handler.handle_error("NUMBER in Zuweisung erwartet.")
self.error_handler.handle_error('NUMBER in Zuweisung erwartet.')
value_1 = max(0, op(value_2, int(number_token.v)))
self.values.update({identifier_1: value_1})
return self.next_token()
......@@ -88,26 +88,26 @@ class LOOPInterpreter:
def verify_assignment(self, forbidden_identifiers, identifier_token_1):
identifier_1 = identifier_token_1.v
if identifier_1 in forbidden_identifiers:
self.error_handler.handle_error("Identifier " + identifier_1 +
" ist bereits in Loop vorhanden und darf nicht verwendet werden.")
if not self.next_nonempty_token("Zuweisung", ":=").k == 'ALLOCATION':
self.error_handler.handle_error(":= in Zuweisung erwartet.")
self.error_handler.handle_error('Identifier ' + identifier_1 +
' ist bereits in Loop vorhanden und darf nicht verwendet werden.')
if not self.next_nonempty_token('Zuweisung', ':=').k == 'ALLOCATION':
self.error_handler.handle_error(':= in Zuweisung erwartet.')
identifier_token_2 = self.next_nonempty_token("Zuweisung", "IDENTIFIER (x0, x1, ...) oder NUMBER")
identifier_token_2 = self.next_nonempty_token('Zuweisung', 'IDENTIFIER (x0, x1, ...) oder NUMBER')
if identifier_token_2.k == 'NUMBER':
return self.next_token()
if not identifier_token_2.k == 'IDENTIFIER':
self.error_handler.handle_error("IDENTIFIER in Zuweisung erwartet.")
self.error_handler.handle_error('IDENTIFIER in Zuweisung erwartet.')
identifier_2 = identifier_token_2.v
if identifier_2 in forbidden_identifiers:
self.error_handler.handle_error("Identifier " + identifier_2 +
" ist bereits in Loop vorhanden und darf nicht verwendet werden.")
self.error_handler.handle_error('Identifier ' + identifier_2 +
' ist bereits in Loop vorhanden und darf nicht verwendet werden.')
if self.next_nonempty_token("Zuweisung", "+ oder -").k not in ['PLUS', 'MINUS']:
self.error_handler.handle_error("+ oder - in Zuweisung erwartet.")
if not self.next_nonempty_token("Zuweisung", "NUMBER").k == 'NUMBER':
self.error_handler.handle_error("NUMBER in Zuweisung erwartet.")
if self.next_nonempty_token('Zuweisung', '+ oder -').k not in ['PLUS', 'MINUS']:
self.error_handler.handle_error('+ oder - in Zuweisung erwartet.')
if not self.next_nonempty_token('Zuweisung', 'NUMBER').k == 'NUMBER':
self.error_handler.handle_error('NUMBER in Zuweisung erwartet.')
return self.next_token()
......@@ -118,7 +118,7 @@ class LOOPInterpreter:
if identifier_token.v in forbidden_identifiers:
self.error_handler.handle_error('Identifier ' + identifier_token.v +
' ist bereits in Loop vorhanden und darf nicht verwendet werden.')
if not self.next_nonempty_token("LOOP", "DO").k == 'DO':
if not self.next_nonempty_token('LOOP', 'DO').k == 'DO':
self.error_handler.handle_error('DO in LOOP erwartet.')
if identifier_token.v in self.values:
......@@ -135,7 +135,7 @@ class LOOPInterpreter:
while not end_found:
token = self.verify_program(forbidden_identifiers, self.next_token())
if token is None or token.k not in ['SEMICOLON', 'END']:
self.error_handler.handle_error("SEMICOLON oder END in LOOP erwartet.")
self.error_handler.handle_error('SEMICOLON oder END in LOOP erwartet.')
elif token.k == 'SEMICOLON':
continue
elif token.k == 'END':
......@@ -148,7 +148,7 @@ class LOOPInterpreter:
while not end_found:
token = self.process_program(forbidden_identifiers, self.next_token())
if token is None or token.k not in ['SEMICOLON', 'END']:
self.error_handler.handle_error("SEMICOLON oder END in LOOP erwartet.")
self.error_handler.handle_error('SEMICOLON oder END in LOOP erwartet.')
elif token.k == 'SEMICOLON':
continue
elif token.k == 'END':
......@@ -158,13 +158,13 @@ class LOOPInterpreter:
return self.next_token()
def verify_loop(self, forbidden_identifiers, loop_token):
identifier_token = self.next_nonempty_token("LOOP", "IDENTIFIER")
identifier_token = self.next_nonempty_token('LOOP', 'IDENTIFIER')
if not identifier_token.k == 'IDENTIFIER':
self.error_handler.handle_error('IDENTIFIER in LOOP erwartet.')
if identifier_token.v in forbidden_identifiers:
self.error_handler.handle_error("Identifier " + identifier_token.v +
" ist bereits in Loop vorhanden und darf nicht verwendet werden.")
if not self.next_nonempty_token("LOOP", "DO").k == 'DO':
self.error_handler.handle_error('Identifier ' + identifier_token.v +
' ist bereits in Loop vorhanden und darf nicht verwendet werden.')
if not self.next_nonempty_token('LOOP', 'DO').k == 'DO':
self.error_handler.handle_error('DO in LOOP erwartet.')
forbidden_identifiers.append(identifier_token.v)
......@@ -173,7 +173,7 @@ class LOOPInterpreter:
while not end_found:
token = self.verify_program(forbidden_identifiers, self.next_token())
if token is None or token.k not in ['SEMICOLON', 'END']:
self.error_handler.handle_error("SEMICOLON oder END in LOOP erwartet.")
self.error_handler.handle_error('SEMICOLON oder END in LOOP erwartet.')
elif token.k == 'SEMICOLON':
continue
elif token.k == 'END':
......@@ -184,8 +184,8 @@ class LOOPInterpreter:
def process_program(self, forbidden_identifiers, current_token):
if current_token is None or current_token.k not in ['IDENTIFIER', 'LOOP']:
self.error_handler.handle_error("Keine passende Anweisung gefunden\n" +
"Erwartet: IDENTIFIER (x0, x1, ...) oder LOOP")
self.error_handler.handle_error('Keine passende Anweisung gefunden\n' +
'Erwartet: IDENTIFIER (x0, x1, ...) oder LOOP')
elif current_token.k == 'IDENTIFIER':
current_token = self.process_assignment(forbidden_identifiers, current_token)
elif current_token.k == 'LOOP':
......@@ -194,8 +194,8 @@ class LOOPInterpreter:
def verify_program(self, forbidden_identifiers, current_token):
if current_token is None or current_token.k not in ['IDENTIFIER', 'LOOP']:
self.error_handler.handle_error("Keine passende Anweisung gefunden\n" +
"Erwartet: IDENTIFIER (x0, x1, ...) oder LOOP")
self.error_handler.handle_error('Keine passende Anweisung gefunden\n' +
'Erwartet: IDENTIFIER (x0, x1, ...) oder LOOP')
elif current_token.k == 'IDENTIFIER':
current_token = self.verify_assignment(forbidden_identifiers, current_token)
elif current_token.k == 'LOOP':
......@@ -220,7 +220,7 @@ class LOOPInterpreter:
token = self.next_token()
if token is None:
self.error_handler.handle_error(
"Frühzeitiges Ende von " + current_function + "\n" + "Erwartet: " + expected_token)
'Frühzeitiges Ende von ' + current_function + '\n' + 'Erwartet: ' + expected_token)
return token
def interpret(self, program):
......@@ -234,13 +234,13 @@ class LOOPInterpreter:
current_token = self.process_program(forbidden_identifiers, current_token)
if current_token is not None:
if not current_token.k == 'SEMICOLON':
self.error_handler.handle_error("Semicolon erwartet")
self.error_handler.handle_error('Semicolon erwartet')
current_token = self.next_token()
if current_token is None:
self.error_handler.handle_error("Semikolons werden nur zur Trennung und nicht zum " +
"Abschluss von Programmen verwendet")
if "x0" in self.values:
return self.values.get("x0")
self.error_handler.handle_error('Semikolons werden nur zur Trennung und nicht zum ' +
'Abschluss von Programmen verwendet')
if 'x0' in self.values:
return self.values.get('x0')
return 0
except KeyboardInterrupt:
return -1
......
......@@ -4,11 +4,11 @@ from unittest import TestCase
def input_continue(prompt):
return ""
return ''
def input_exit(prompt):
return "EXIT"
return 'EXIT'
class GOTOInterpreterTest(TestCase):
......
......@@ -4,11 +4,11 @@ from unittest import mock
def input_exit(prompt):
return "EXIT"
return 'EXIT'
def input_continue(prompt):
return ""
return ''
def init_without_tokens(self, regex_to_token, program):
......@@ -29,8 +29,8 @@ class LOOPInterpreterTest(unittest.TestCase):
self.assertEqual(0, interpret('x0:=x2-6'))
def test_assignment_number(self):
self.assertEqual(5, interpret("x0:=5"))
self.assertEqual(2, interpret("x0:=2"))
self.assertEqual(5, interpret('x0:=5'))
self.assertEqual(2, interpret('x0:=2'))
self.assertEqual(3, interpret('x0:=3'))
def test_assignment_variable(self):
......@@ -220,11 +220,11 @@ class LOOPInterpreterTest(unittest.TestCase):
def test_syntax_missing_identifier(self):
with self.assertRaises(SyntaxError):
interpret("x1:=; LOOP x1 DO x2:=2 END")
interpret('x1:=; LOOP x1 DO x2:=2 END')
with self.assertRaises(SyntaxError):
interpret("LOOP x1 DO x2:= END")
interpret('LOOP x1 DO x2:= END')
with self.assertRaises(SyntaxError):
interpret("LOOP x1 DO x2:=x0+ END")
interpret('LOOP x1 DO x2:=x0+ END')
with self.assertRaises(SyntaxError):
interpret('LOOP x0 DO LOOP DO x1:=x2+0 END END')
......
......@@ -4,7 +4,7 @@ from unittest import mock
def str_yes(prompt):
return "J"
return 'J'
class WHILEInterpreterTest(LOOPInterpreterTest):
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment