summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Galindo <Pablogsal@gmail.com>2020-09-03 15:35:36 (GMT)
committerGitHub <noreply@github.com>2020-09-03 15:35:36 (GMT)
commit270e2492900275fe2ec93c7982fa175ed132e6b9 (patch)
tree22ca50b0dc36d8795344ec03e3913ae448fc2fd8
parentbe17295280c89771c80f317da072f6c0d016cc60 (diff)
downloadcpython-270e2492900275fe2ec93c7982fa175ed132e6b9.zip
cpython-270e2492900275fe2ec93c7982fa175ed132e6b9.tar.gz
cpython-270e2492900275fe2ec93c7982fa175ed132e6b9.tar.bz2
[3.9] Fix 'gather' rules in the python parser generator (GH-22021) (GH-22080)
Currently, empty sequences in gather rules make the conditional for gather rules fail as empty sequences evaluate as "False". We need to explicitly check for "None" (the failure condition) to avoid false negatives. (cherry picked from commit e55a0e9) Co-authored-by: Pablo Galindo <Pablogsal@gmail.com>
-rw-r--r--Lib/test/test_peg_generator/test_pegen.py16
-rw-r--r--Tools/peg_generator/pegen/python_generator.py3
2 files changed, 18 insertions, 1 deletions
diff --git a/Lib/test/test_peg_generator/test_pegen.py b/Lib/test/test_peg_generator/test_pegen.py
index 5b4e964..bcfee3f 100644
--- a/Lib/test/test_peg_generator/test_pegen.py
+++ b/Lib/test/test_peg_generator/test_pegen.py
@@ -74,7 +74,7 @@ class TestPegen(unittest.TestCase):
"Rule('term', 'int', Rhs([Alt([NamedItem(None, NameLeaf('NUMBER'))])]))"
)
- def test_repeat_with_separator_rules(self) -> None:
+ def test_gather(self) -> None:
grammar = """
start: ','.thing+ NEWLINE
thing: NUMBER
@@ -85,6 +85,20 @@ class TestPegen(unittest.TestCase):
"Rule('start', None, Rhs([Alt([NamedItem(None, Gather(StringLeaf(\"','\"), NameLeaf('thing'"
))
self.assertEqual(str(rules["thing"]), "thing: NUMBER")
+ parser_class = make_parser(grammar)
+ node = parse_string("42\n", parser_class)
+ assert node == [
+ [[TokenInfo(NUMBER, string="42", start=(1, 0), end=(1, 2), line="42\n")]],
+ TokenInfo(NEWLINE, string="\n", start=(1, 2), end=(1, 3), line="42\n"),
+ ]
+ node = parse_string("1, 2\n", parser_class)
+ assert node == [
+ [
+ [TokenInfo(NUMBER, string="1", start=(1, 0), end=(1, 1), line="1, 2\n")],
+ [TokenInfo(NUMBER, string="2", start=(1, 3), end=(1, 4), line="1, 2\n")],
+ ],
+ TokenInfo(NEWLINE, string="\n", start=(1, 4), end=(1, 5), line="1, 2\n"),
+ ]
def test_expr_grammar(self) -> None:
grammar = """
diff --git a/Tools/peg_generator/pegen/python_generator.py b/Tools/peg_generator/pegen/python_generator.py
index 45a7597..b786de7 100644
--- a/Tools/peg_generator/pegen/python_generator.py
+++ b/Tools/peg_generator/pegen/python_generator.py
@@ -217,6 +217,9 @@ class PythonParserGenerator(ParserGenerator, GrammarVisitor):
else:
self.print("and")
self.visit(item)
+ if is_gather:
+ self.print("is not None")
+
self.print("):")
with self.indent():
action = node.action