From fdf0339e167208b8eb62b59ab45fc73163cd1f32 Mon Sep 17 00:00:00 2001 From: Simon Forman Date: Mon, 2 Dec 2019 14:26:07 -0800 Subject: [PATCH] Make parser REs into module-level "constants". --- joy/parser.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/joy/parser.py b/joy/parser.py index 3307c6b..3d92f7a 100644 --- a/joy/parser.py +++ b/joy/parser.py @@ -36,11 +36,20 @@ brackets. Terms must be separated by blanks, which can be omitted around square brackets. ''' -#TODO: explain the details of float lits and strings. from re import Scanner from .utils.stack import list_to_stack +#TODO: explain the details of float lits and strings. +FLOAT = r'-?\d+\.\d*' +INT = r'-?\d+' +SYMBOL = r'[•\w!@$%^&*()_+<>?|\/;:`~,.=-]+' +BRACKETS = r'\[|\]' +STRING_DOUBLE_QUOTED = r'"(?:[^"\\]|\\.)*"' +STRING_SINGLE_QUOTED = r"'(?:[^'\\]|\\.)*'" +BLANKS = r'\s+' + + class Symbol(str): '''A string class that represents Joy function names.''' __repr__ = str.__str__ @@ -105,11 +114,11 @@ def _parse(tokens): _scanner = Scanner([ - (r'-?\d+\.\d*', lambda _, token: float(token)), - (r'-?\d+', lambda _, token: int(token)), - (r'[•\w!@$%^&*()_+<>?|\/;:`~,.=-]+', lambda _, token: Symbol(token)), - (r'\[|\]', lambda _, token: token), - (r'"(?:[^"\\]|\\.)*"', lambda _, token: token[1:-1].replace('\\"', '"')), - (r"'(?:[^'\\]|\\.)*'", lambda _, token: token[1:-1].replace("\\'", "'")), - (r'\s+', None), + (FLOAT, lambda _, token: float(token)), + (INT, lambda _, token: int(token)), + (SYMBOL, lambda _, token: Symbol(token)), + (BRACKETS, lambda _, token: token), + (STRING_DOUBLE_QUOTED, lambda _, token: token[1:-1].replace('\\"', '"')), + (STRING_SINGLE_QUOTED, lambda _, token: token[1:-1].replace("\\'", "'")), + (BLANKS, None), ])