From: David Kerkeslager Date: Sat, 12 Aug 2017 18:44:01 +0000 (-0400) Subject: Prevent assignment to a builtin variable X-Git-Url: https://code.kerkeslager.com/?a=commitdiff_plain;h=22577cbe31443795595635ea03eefb504738b0c2;p=fur Prevent assignment to a builtin variable --- diff --git a/parsing.py b/parsing.py index 82c6528..91098f9 100644 --- a/parsing.py +++ b/parsing.py @@ -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)