[PATCH] D130551: [pseudo] Allow opaque nodes to represent terminals
Sam McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Jul 26 00:03:17 PDT 2022
sammccall created this revision.
sammccall added reviewers: hokein, usaxena95.
Herald added a project: All.
sammccall requested review of this revision.
Herald added subscribers: cfe-commits, alextsao1999.
Herald added a project: clang-tools-extra.
This allows incomplete code such as `namespace foo {` to be modeled as a
normal sequence with the missing } represented by an empty opaque node.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D130551
Files:
clang-tools-extra/pseudo/lib/GLR.cpp
clang-tools-extra/pseudo/unittests/GLRTest.cpp
Index: clang-tools-extra/pseudo/unittests/GLRTest.cpp
===================================================================
--- clang-tools-extra/pseudo/unittests/GLRTest.cpp
+++ clang-tools-extra/pseudo/unittests/GLRTest.cpp
@@ -604,6 +604,28 @@
"[ 5, end) └─} := tok[5]\n");
}
+TEST_F(GLRTest, RecoverTerminal) {
+ build(R"bnf(
+ _ := stmt
+
+ stmt := IDENTIFIER ; [recover=Skip]
+ )bnf");
+ TestLang.Table = LRTable::buildSLR(TestLang.G);
+ TestLang.RecoveryStrategies.try_emplace(
+ extensionID("Skip"),
+ [](Token::Index Start, const TokenStream &) { return Start + 1; });
+ clang::LangOptions LOptions;
+ TokenStream Tokens = cook(lex("foo", LOptions), LOptions);
+
+ const ForestNode &Parsed =
+ glrParse({Tokens, Arena, GSStack}, id("stmt"), TestLang);
+ EXPECT_EQ(Parsed.dumpRecursive(TestLang.G),
+ "[ 0, end) stmt := IDENTIFIER ; [recover=Skip]\n"
+ "[ 0, 1) ├─IDENTIFIER := tok[0]\n"
+ "[ 1, end) └─; := <opaque>\n");
+}
+
+
TEST_F(GLRTest, NoExplicitAccept) {
build(R"bnf(
_ := test
Index: clang-tools-extra/pseudo/lib/GLR.cpp
===================================================================
--- clang-tools-extra/pseudo/lib/GLR.cpp
+++ clang-tools-extra/pseudo/lib/GLR.cpp
@@ -182,9 +182,13 @@
for (const PlaceholderRecovery *Option : BestOptions) {
const ForestNode &Placeholder =
Params.Forest.createOpaque(Option->Symbol, RecoveryRange->Begin);
- const GSS::Node *NewHead = Params.GSStack.addNode(
- *Lang.Table.getGoToState(Option->RecoveryNode->State, Option->Symbol),
- &Placeholder, {Option->RecoveryNode});
+ LRTable::StateID OldState = Option->RecoveryNode->State;
+ LRTable::StateID NewState =
+ isToken(Option->Symbol)
+ ? *Lang.Table.getShiftState(OldState, Option->Symbol)
+ : *Lang.Table.getGoToState(OldState, Option->Symbol);
+ const GSS::Node *NewHead =
+ Params.GSStack.addNode(NewState, &Placeholder, {Option->RecoveryNode});
NewHeads.push_back(NewHead);
}
TokenIndex = RecoveryRange->End;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D130551.447584.patch
Type: text/x-patch
Size: 2119 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220726/aca20cd3/attachment-0001.bin>
More information about the cfe-commits
mailing list