From fb7ec143f7a45cc260bd2849aec866dc8bbffabc Mon Sep 17 00:00:00 2001 From: Evan Hubinger Date: Wed, 24 Aug 2016 13:39:09 -0700 Subject: [PATCH] Adds EXPR_LIST and EXPR_IND_LIST --- docs/source/util.rst | 3 +++ tests/pattern/python_test.py | 36 ++++++++++++++++++++++++++++++++++++ undebt/pattern/python.py | 5 +++++ 3 files changed, 44 insertions(+) diff --git a/docs/source/util.rst b/docs/source/util.rst index 6030633..822cfc9 100644 --- a/docs/source/util.rst +++ b/docs/source/util.rst @@ -127,6 +127,9 @@ Same as `WHITE` but also matches new lines. **EXPR** Matches any valid Python expression. +**EXPR_LIST, EXPR_IND_LIST** +Matches one or more `EXPR` separated by `COMMA` for `EXPR_LIST` or `COMMA_IND` for `EXPR_IND_LIST`. + **ATOM** Matches a single valid Python atom (that is, an expression without operators). diff --git a/tests/pattern/python_test.py b/tests/pattern/python_test.py index 3d9af3a..fa9ac82 100644 --- a/tests/pattern/python_test.py +++ b/tests/pattern/python_test.py @@ -6,6 +6,8 @@ from undebt.pattern.python import ATOM from undebt.pattern.python import BINARY_OP from undebt.pattern.python import EXPR +from undebt.pattern.python import EXPR_IND_LIST +from undebt.pattern.python import EXPR_LIST from undebt.pattern.python import HEADER from undebt.pattern.python import OP from undebt.pattern.testing import assert_parse @@ -75,6 +77,40 @@ def test_EXPR(): ) +def test_EXPR_LIST(): + assert_parse( + grammar=EXPR_LIST, + text=""" + derp + herp, herp.a.derp - 1, herp[derp], + """, + tokens_list=[ + ["derp + herp, herp.a.derp - 1, herp[derp],"], + ], + interval_list=[ + (9, 50), + ], + ) + + +def test_EXPR_IND_LIST(): + assert_parse( + grammar=EXPR_IND_LIST, + text=""" + derp + herp, + herp.a.derp - 1, + herp[derp] + """, + tokens_list=[ + ["""derp + herp, + herp.a.derp - 1, + herp[derp]"""], + ], + interval_list=[ + (9, 65), + ], + ) + + def test_HEADER(): assert_parse( grammar=HEADER, diff --git a/undebt/pattern/python.py b/undebt/pattern/python.py index f2751ad..a8cd18a 100644 --- a/undebt/pattern/python.py +++ b/undebt/pattern/python.py @@ -16,6 +16,8 @@ from undebt.pattern.common import BRACES from undebt.pattern.common import BRACKETS +from undebt.pattern.common import COMMA +from undebt.pattern.common import COMMA_IND from undebt.pattern.common import DOT from undebt.pattern.common import DOTTED_NAME from undebt.pattern.common import NAME @@ -57,12 +59,15 @@ TRAILER = DOT + NAME | PARENS | BRACKETS TRAILERS = condense(ZeroOrMore(TRAILER)) + ATOM_BASE = NAME | NUM | PARENS | BRACKETS | BRACES | STRING ATOM = condense(ATOM_BASE + TRAILERS) UNARY_OP_ATOM = addspace(Optional(UNARY_OP) + ATOM) EXPR = addspace(UNARY_OP_ATOM + ZeroOrMore(BINARY_OP + UNARY_OP_ATOM)) +EXPR_LIST = condense(EXPR + ZeroOrMore(addspace(COMMA + EXPR)) + Optional(COMMA)) +EXPR_IND_LIST = originalTextFor(EXPR + ZeroOrMore(COMMA_IND + EXPR) + Optional(COMMA_IND)) HEADER = originalTextFor(START_OF_FILE + ZeroOrMore(SKIP_TO_TEXT + (