[all-commits] [llvm/llvm-project] 2cc746: [pseudo] Perform unconstrained reduction prior to ...
Sam McCall via All-commits
all-commits at lists.llvm.org
Fri Aug 19 06:14:56 PDT 2022
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: 2cc7463c85c056e956ad332448189ce3e9004182
https://github.com/llvm/llvm-project/commit/2cc7463c85c056e956ad332448189ce3e9004182
Author: Sam McCall <sam.mccall at gmail.com>
Date: 2022-08-19 (Fri, 19 Aug 2022)
Changed paths:
M clang-tools-extra/pseudo/include/clang-pseudo/grammar/LRTable.h
M clang-tools-extra/pseudo/lib/GLR.cpp
M clang-tools-extra/pseudo/unittests/GLRTest.cpp
Log Message:
-----------
[pseudo] Perform unconstrained reduction prior to recovery.
Our GLR uses lookahead: only perform reductions that might be consumed by the
shift immediately following. However when shift fails and so reduce is followed
by recovery instead, this restriction is incorrect and leads to missing heads.
In turn this means certain recovery strategies can't be made to work. e.g.
```
ns := NAMESPACE { namespace-body } [recover=Skip]
ns-body := namespace_opt
```
When `namespace { namespace {` is parsed, we can recover the inner `ns` (using
the `Skip` strategy to ignore the missing `}`). However this `namespace` will
not be reduced to a `namespace-body` as EOF is not in the follow-set, and so we
are unable to recover the outer `ns`.
This patch fixes this by tracking which heads were produced by constrained
reduce, and discarding and rebuilding them before performing recovery.
This is a prerequisite for the `Skip` strategy mentioned above, though there are
some other limitations we need to address too.
Reviewed By: hokein
Differential Revision: https://reviews.llvm.org/D130523
More information about the All-commits
mailing list