diff options
author | Lysandros Nikolaou <lisandrosnik@gmail.com> | 2020-10-28 00:14:15 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-28 00:14:15 (GMT) |
commit | 24a7c298d47658295673dc04d1b6d59f2b200a7c (patch) | |
tree | 9045adac177946b15f31eb22033fbc912bbf1703 /Tools/peg_generator | |
parent | c4b58cea4771afc0ddfdb857b0fb5115b9f4bc9f (diff) | |
download | cpython-24a7c298d47658295673dc04d1b6d59f2b200a7c.zip cpython-24a7c298d47658295673dc04d1b6d59f2b200a7c.tar.gz cpython-24a7c298d47658295673dc04d1b6d59f2b200a7c.tar.bz2 |
[3.9] bpo-42123: Run the parser two times and only enable invalid rules on the second run (GH-22111) (GH-23011)
* Implement running the parser a second time for the errors messages
The first parser run is only responsible for detecting whether
there is a `SyntaxError` or not. If there isn't the AST gets returned.
Otherwise, the parser is run a second time with all the `invalid_*`
rules enabled so that all the customized error messages get produced.
(cherry picked from commit bca701403253379409dece03053dbd739c0bd059)
Diffstat (limited to 'Tools/peg_generator')
-rw-r--r-- | Tools/peg_generator/pegen/c_generator.py | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/Tools/peg_generator/pegen/c_generator.py b/Tools/peg_generator/pegen/c_generator.py index aee668c..d0abc12 100644 --- a/Tools/peg_generator/pegen/c_generator.py +++ b/Tools/peg_generator/pegen/c_generator.py @@ -730,7 +730,10 @@ class CParserGenerator(ParserGenerator, GrammarVisitor): def visit_Alt( self, node: Alt, is_loop: bool, is_gather: bool, rulename: Optional[str] ) -> None: - self.print(f"{{ // {node}") + if len(node.items) == 1 and str(node.items[0]).startswith('invalid_'): + self.print(f"if (p->call_invalid_rules) {{ // {node}") + else: + self.print(f"{{ // {node}") with self.indent(): self._check_for_errors() node_str = str(node).replace('"', '\\"') |