Prevent assignment to a builtin variable
authorDavid Kerkeslager <kerkeslager@gmail.com>
Sat, 12 Aug 2017 18:44:01 +0000 (14:44 -0400)
committerDavid Kerkeslager <kerkeslager@gmail.com>
Sat, 12 Aug 2017 18:44:01 +0000 (14:44 -0400)
parsing.py

index 82c6528..91098f9 100644 (file)
@@ -327,18 +327,28 @@ def _expression_statement_parser(index, tokens):
 
     return (True, index, FurExpressionStatement(expression=expression))
 
+BUILTINS = {'print', 'pow'}
+
 def _assignment_statement_parser(index, tokens):
-    # TODO Use a FurSymbolExpression for the target? Maybe this is actually not a good idea
     failure = (False, index, None)
 
-    if tokens[index].type != 'symbol':
+    if tokens[index].type == 'symbol':
+        target = tokens[index].match
+        target_assignment_line = tokens[index].line
+
+        index += 1
+    else:
         return failure
-    target = tokens[index].match
-    index += 1
 
-    if tokens[index].type != 'assignment_operator':
+
+    if tokens[index].type == 'assignment_operator':
+        if target in BUILTINS:
+            raise Exception(
+                'Trying to assign to builtin "{}" on line {}'.format(target, target_assignment_line),
+            )
+        assignment_operator_index = index
+    else:
         return failure
-    assignment_operator_index = index
 
     success, index, expression = _expression_parser(index + 1, tokens)