diff --git a/grammars/silver/compiler/definition/core/QName.sv b/grammars/silver/compiler/definition/core/QName.sv
index f46fb2ea8..b7d0fa433 100644
--- a/grammars/silver/compiler/definition/core/QName.sv
+++ b/grammars/silver/compiler/definition/core/QName.sv
@@ -67,6 +67,7 @@ top::QName ::= msg::[Message]
top.lookupAttribute = decorate errorLookup(msg) with {};
}
+
nonterminal QNameLookup with fullName, typeScheme, errors, dcls, dcl, found;
synthesized attribute lookupValue :: Decorated QNameLookup occurs on QName;
diff --git a/grammars/silver/compiler/extension/convenience/Lists.sv b/grammars/silver/compiler/extension/convenience/Lists.sv
index 700be4edc..871135638 100644
--- a/grammars/silver/compiler/extension/convenience/Lists.sv
+++ b/grammars/silver/compiler/extension/convenience/Lists.sv
@@ -51,6 +51,14 @@ top::QNames ::= id1::QNameWithTL ',' id2::QNames
top.qnames = [id1] ++ id2.qnames;
}
+abstract production qNamesError
+top::QNames ::= msg::[Message]
+{
+ top.unparse = "";
+ top.qnames = [];
+
+}
+
--------------------------------------------------------------------------------
function makeOccursDcls
diff --git a/grammars/silver/compiler/extension/silverconstruction/Syntax.sv b/grammars/silver/compiler/extension/silverconstruction/Syntax.sv
index d52d02729..bf70a2f97 100644
--- a/grammars/silver/compiler/extension/silverconstruction/Syntax.sv
+++ b/grammars/silver/compiler/extension/silverconstruction/Syntax.sv
@@ -7,6 +7,7 @@ imports silver:compiler:definition:env;
imports silver:compiler:definition:type:syntax;
imports silver:compiler:modification:list;
imports silver:compiler:extension:patternmatching;
+imports silver:compiler:extension:convenience;
concrete production quoteAGDcl
top::Expr ::= 'Silver_AGDcl' '{' ast::AGDcl '}'
@@ -117,6 +118,15 @@ top::QName ::= '$QName' '{' e::Expr '}'
location=top.location);
}
+concrete production antiquoteQNames
+top::QNames ::= '$QNames' '{' e::Expr '}'
+{
+ top.unparse = s"$$QNames{${e.unparse}}";
+ forwards to
+ qNamesError(
+ [err(e.location, "$QNames should not occur outside of quoted Silver literal")]);
+}
+
concrete production antiquoteQNameAttrOccur
top::QNameAttrOccur ::= '$QNameAttrOccur' '{' e::Expr '}'
{
diff --git a/grammars/silver/compiler/extension/silverconstruction/Terminals.sv b/grammars/silver/compiler/extension/silverconstruction/Terminals.sv
index 6a4c46217..0acaa6a21 100644
--- a/grammars/silver/compiler/extension/silverconstruction/Terminals.sv
+++ b/grammars/silver/compiler/extension/silverconstruction/Terminals.sv
@@ -16,6 +16,7 @@ terminal AntiquotePattern_t '$Pattern' lexer classes {Antiqu
terminal AntiquoteAspectRHS_t '$AspectRHS' lexer classes {Antiquote};
terminal AntiquoteProductionStmt_t '$ProductionStmt' lexer classes {Antiquote};
terminal AntiquoteQName_t '$QName' lexer classes {Antiquote};
+terminal AntiquoteQNames_t '$QNames' lexer classes {Antiquote};
terminal AntiquoteQNameAttrOccur_t '$QNameAttrOccur' lexer classes {Antiquote};
terminal AntiquoteName_t '$Name' lexer classes {Antiquote};
terminal Antiquote_qName_t '$qName' lexer classes {Antiquote};
diff --git a/grammars/silver/compiler/extension/silverconstruction/Translation.sv b/grammars/silver/compiler/extension/silverconstruction/Translation.sv
index 33a990a55..8a27d4e48 100644
--- a/grammars/silver/compiler/extension/silverconstruction/Translation.sv
+++ b/grammars/silver/compiler/extension/silverconstruction/Translation.sv
@@ -14,6 +14,7 @@ top::AST ::= prodName::String children::ASTs annotations::NamedASTs
"silver:compiler:extension:silverconstruction:antiquoteAspectRHS",
"silver:compiler:extension:silverconstruction:antiquoteProductionStmt",
"silver:compiler:extension:silverconstruction:antiquoteQName",
+ "silver:compiler:extension:silverconstruction:antiquoteQNames",
"silver:compiler:extension:silverconstruction:antiquoteQNameAttrOccur",
"silver:compiler:extension:silverconstruction:antiquoteName"];