diff --git a/packages/queryLanguage/src/parser.terms.ts b/packages/queryLanguage/src/parser.terms.ts
index 1682bb04..c093620e 100644
--- a/packages/queryLanguage/src/parser.terms.ts
+++ b/packages/queryLanguage/src/parser.terms.ts
@@ -1,6 +1,6 @@
// This file was generated by lezer-generator. You probably shouldn't edit it.
export const
- negate = 22,
+ negate = 23,
Program = 1,
OrExpr = 2,
AndExpr = 3,
@@ -18,4 +18,5 @@ export const
SymExpr = 15,
RepoSetExpr = 16,
ParenExpr = 17,
- Term = 18
+ QuotedTerm = 18,
+ Term = 19
diff --git a/packages/queryLanguage/src/parser.ts b/packages/queryLanguage/src/parser.ts
index fb867c4f..a254524c 100644
--- a/packages/queryLanguage/src/parser.ts
+++ b/packages/queryLanguage/src/parser.ts
@@ -3,16 +3,16 @@ import {LRParser} from "@lezer/lr"
import {negateToken} from "./tokens"
export const parser = LRParser.deserialize({
version: 14,
- states: "'[OVQROOO!WQQO'#CcO!WQQO'#CdO!WQQO'#CeO!WQQO'#CfO!`QSO'#CgO!kQSO'#ChO!WQQO'#CiO!WQQO'#CjO!WQQO'#CkO!WQQO'#ClOOQP'#Ca'#CaOVQRO'#CmO!vQQO'#C`OOQP'#Cn'#CnOOQP'#Cw'#CwO#nQRO'#CvO#{QQO'#CvO$WQQO'#C^OOQO'#Cu'#CuQOQQOOO!`QSO'#CbOOQP'#C}'#C}OOQP,58},58}OOQP,59O,59OOOQP,59P,59POOQP,59Q,59QOOQP'#DU'#DUOOQP,59R,59ROOQP'#DW'#DWOOQP,59S,59SOOQP,59T,59TOOQP,59U,59UOOQP,59V,59VOOQP,59W,59WO$]QQO,59XOOQP,58z,58zOOQP'#Co'#CoO$bQRO,58yOVQRO'#CpO$oQQO,58xOOQP,58|,58|OOQP1G.s1G.sOOQP-E6m-E6mO$zQRO'#CvOOQO'#Cv'#CvOOQO,59[,59[OOQO-E6n-E6n",
- stateData: "%i~OhOS~Of]OleOpPOr^Os^OtQOuROvSOwTOyUO!OVO!PWO!QXO!RYO!S[O~OrfOsfO~OmkOnkOokO~O{mO|mO}mO~OleOpPOtQOuROvSOwTOyUO!OVO!PWO!QXO!RYO!S[O~OeiX!UjX!TiX~PVOeiX!UjX!TiX~O!UwO~O!TzO~OeRa!URa!TRa~PVO!UwOeQa!TQa~OejX!UjX!TjX~PVOrlptuvwy!O!P!Q!R!Usy~",
- goto: "$`{PP|!Q!X!a!l!l!l!l!l!l!l!l!l!l!l!a!X!u!|PPPP#S#Y#aPPPPP#mPPPPPP$VP$]TcO[SaO[R}w]_O[`vw|[_O[`vw|Rt]_ZO[]`vw|Sv`|R{vQxbR!PxQdORs[SbO[R!OwS`O[Uu`v|R|wQgPQhQQiRQjSQoVQpWQqXRrYQlTRyeRnU",
- nodeNames: "⚠ Program OrExpr AndExpr NegateExpr PrefixExpr ArchivedExpr RevisionExpr ContentExpr ContextExpr FileExpr ForkExpr VisibilityExpr RepoExpr LangExpr SymExpr RepoSetExpr ParenExpr Term",
- maxTerm: 52,
+ states: "'hOVQROOO!WQQO'#CcO!WQQO'#CdO!WQQO'#CeO!WQQO'#CfO!`QSO'#CgO!kQSO'#ChO!WQQO'#CiO!WQQO'#CjO!WQQO'#CkO!WQQO'#ClOOQP'#Ca'#CaO!vQRO'#CmO!}QQO'#C`OOQP'#Cn'#CnOOQP'#Co'#CoOOQP'#Cx'#CxO#uQRO'#CwO$SQQO'#CwO$_QQO'#C^OOQO'#Cv'#CvQOQQOOO!`QSO'#CbOOQP'#DO'#DOOOQP,58},58}OOQP,59O,59OOOQP,59P,59POOQP,59Q,59QOOQP'#DV'#DVOOQP,59R,59ROOQP'#DX'#DXOOQP,59S,59SOOQP,59T,59TOOQP,59U,59UOOQP,59V,59VOOQP,59W,59WOOQP,59X,59XO$dQQO,59XOOQP,58z,58zOOQP'#Cp'#CpO$iQRO,58yOVQRO'#CqO$vQQO,58xOOQP,58|,58|OOQP1G.s1G.sOOQP-E6n-E6nO%RQRO'#CwOOQO'#Cw'#CwOOQO,59],59]OOQO-E6o-E6o",
+ stateData: "%p~OiOS~Og]OmfOqPOs^Ot_OuQOvROwSOxTOzUO!PVO!QWO!RXO!SYO!T[O~OsgOtgO~OnlOolOplO~O|nO}nO!OnO~O!UtO~PVOmfOqPOuQOvROwSOxTOzUO!PVO!QWO!RXO!SYO!T[O~OfjX!VkX!UjX~PVOfjX!VkX!UjX~O!VyO~O!U|O~OfRa!VRa!URa~PVO!VyOfQa!UQa~OfkX!VkX!UkX~PVOsmquvwxz!P!Q!R!S!Vtz~",
+ goto: "$a|PP}!R!Y!b!m!m!m!m!m!m!m!m!m!m!m!b!Y!Y!v!}PPPP#T#Z#bPPPPP#nPPPPPP$WP$^TdO[SbO[R!Py]`O[axy!O[`O[axy!ORv]_ZO[]axy!OSxa!OR}xQzcR!RzQeORu[ScO[R!QySaO[Uwax!OR!OyQhPQiQQjRQkSQpVQqWQrXRsYQmTR{fRoU",
+ nodeNames: "⚠ Program OrExpr AndExpr NegateExpr PrefixExpr ArchivedExpr RevisionExpr ContentExpr ContextExpr FileExpr ForkExpr VisibilityExpr RepoExpr LangExpr SymExpr RepoSetExpr ParenExpr QuotedTerm Term",
+ maxTerm: 53,
skippedNodes: [0],
repeatNodeCount: 2,
- tokenData: "!Hc~RpOX#VXY$TYZ$TZp#Vpq$Tqr#Vrs$csx#Vxy&Vyz&[z#T#V#T#U&a#U#V#V#V#W0q#W#Y#V#Y#Z:{#Z#`#V#`#aCZ#a#b#V#b#cGu#c#dIm#d#e!!V#e#f#V#f#g!-k#g#h!7q#h#j#V#j#k!;_#k#m#V#m#n!Em#n;'S#V;'S;=`#}<%lO#VP#[ZsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#VP$QP;=`<%l#V~$YRh~XY$TYZ$Tpq$T~$fWOY$cZr$crs%Os#O$c#O#P%T#P;'S$c;'S;=`&P<%lO$c~%TOr~~%WRO;'S$c;'S;=`%a;=`O$c~%dXOY$cZr$crs%Os#O$c#O#P%T#P;'S$c;'S;=`&P;=`<%l$c<%lO$c~&SP;=`<%l$c~&[O!S~~&aO!T~~&f_sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#b#V#b#c'e#c#f#V#f#g)]#g;'S#V;'S;=`#}<%lO#VR'j]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#m#V#m#n(c#n;'S#V;'S;=`#}<%lO#VR(jZ}QsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~)b]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#V#V#V#W*Z#W;'S#V;'S;=`#}<%lO#V~*`]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#[#V#[#]+X#];'S#V;'S;=`#}<%lO#V~+^]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^,V#^;'S#V;'S;=`#}<%lO#V~,[]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#j#V#j#k-T#k;'S#V;'S;=`#}<%lO#V~-Y]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y.R#Y;'S#V;'S;=`#}<%lO#V~.W]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#W#V#W#X/P#X;'S#V;'S;=`#}<%lO#V~/UZsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]/w!];'S#V;'S;=`#}<%lO#V~0OZl~sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~0v]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]1o!]#c#V#c#d2i#d;'S#V;'S;=`#}<%lO#V~1vZt~sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~2n]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#b#V#b#c3g#c;'S#V;'S;=`#}<%lO#V~3l]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i4e#i;'S#V;'S;=`#}<%lO#V~4j]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y5c#Y;'S#V;'S;=`#}<%lO#V~5h_sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#b#V#b#c6g#c#l#V#l#m8]#m;'S#V;'S;=`#}<%lO#V~6l]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i7e#i;'S#V;'S;=`#}<%lO#V~7jZsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]1o!];'S#V;'S;=`#}<%lO#V~8b]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i9Z#i;'S#V;'S;=`#}<%lO#V~9`ZsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]:R!];'S#V;'S;=`#}<%lO#V~:YZu~sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V~;Q_sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]
u#Y;'S#V;'S;=`#}<%lO#V~>zZsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]
X#^;'S#V;'S;=`#}<%lO#V~!>^]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#U#V#U#V!?V#V;'S#V;'S;=`#}<%lO#V~!?[]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^!@T#^;'S#V;'S;=`#}<%lO#V~!@Y]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#`#V#`#a!AR#a;'S#V;'S;=`#}<%lO#V~!AW]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^!BP#^;'S#V;'S;=`#}<%lO#V~!BU]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i!B}#i;'S#V;'S;=`#}<%lO#V~!CS]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#m#V#m#n!C{#n;'S#V;'S;=`#}<%lO#V~!DQZsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]!Ds!];'S#V;'S;=`#}<%lO#V~!DzZy~sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#VR!Er]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y!Fk#Y;'S#V;'S;=`#}<%lO#VR!Fp]sPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!]#g#V#g#h!Gi#h;'S#V;'S;=`#}<%lO#VR!GpZmQsPOX#VZp#Vqr#Vsx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#}<%lO#V",
+ tokenData: "!Fj~RpOX#VXY$QYZ$QZp#Vpq$Qqr#Vrs$`sx#Vxy)zyz*Pz#T#V#T#U*U#U#V#V#V#W3s#W#Y#V#Y#Z=[#Z#`#V#`#aD}#a#b#V#b#cIY#c#dJz#d#e!!}#e#f#V#f#g!-m#g#h!7Q#h#j#V#j#k!:b#k#m#V#m#n!C}#n;'S#V;'S;=`#z<%lO#VP#[YtPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#VP#}P;=`<%l#V~$VRi~XY$QYZ$Qpq$Q~$eatPOX$`XY%jZp$`pq%jqr$`rs'^sx$`xz%jz}$`}!O$`!O![$`![!]$`!]#O$`#O#P(T#P;'S$`;'S;=`)t<%lO$`~%mWOY%jZr%jrs&Vs#O%j#O#P&[#P;'S%j;'S;=`'W<%lO%j~&[Os~~&_RO;'S%j;'S;=`&h;=`O%j~&kXOY%jZr%jrs&Vs#O%j#O#P&[#P;'S%j;'S;=`'W;=`<%l%j<%lO%j~'ZP;=`<%l%j~'eYs~tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#V~(Y^tPOX$`XZ%jZp$`pq%jqx$`xz%jz}$`}!O$`!O![$`![!]$`!];'S$`;'S;=`)U;=`<%l%j<%lO$`~)XXOY%jZr%jrs&Vs#O%j#O#P&[#P;'S%j;'S;=`'W;=`<%l$`<%lO%j~)wP;=`<%l$`~*PO!T~~*UO!U~~*Z^tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#b#V#b#c+V#c#f#V#f#g,w#g;'S#V;'S;=`#z<%lO#VR+[[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#m#V#m#n,Q#n;'S#V;'S;=`#z<%lO#VR,XY!OQtPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#V~,|[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#V#V#V#W-r#W;'S#V;'S;=`#z<%lO#V~-w[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#[#V#[#].m#];'S#V;'S;=`#z<%lO#V~.r[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^/h#^;'S#V;'S;=`#z<%lO#V~/m[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#j#V#j#k0c#k;'S#V;'S;=`#z<%lO#V~0h[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y1^#Y;'S#V;'S;=`#z<%lO#V~1c[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#W#V#W#X2X#X;'S#V;'S;=`#z<%lO#V~2^YtPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]2|!];'S#V;'S;=`#z<%lO#V~3TYm~tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#V~3x[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]4n!]#c#V#c#d5e#d;'S#V;'S;=`#z<%lO#V~4uYu~tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#V~5j[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#b#V#b#c6`#c;'S#V;'S;=`#z<%lO#V~6e[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i7Z#i;'S#V;'S;=`#z<%lO#V~7`[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y8U#Y;'S#V;'S;=`#z<%lO#V~8Z^tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#b#V#b#c9V#c#l#V#l#m:u#m;'S#V;'S;=`#z<%lO#V~9[[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i:Q#i;'S#V;'S;=`#z<%lO#V~:VYtPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]4n!];'S#V;'S;=`#z<%lO#V~:z[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i;p#i;'S#V;'S;=`#z<%lO#V~;uYtPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]]!]#]#V#]#^?S#^#c#V#c#dAm#d;'S#V;'S;=`#z<%lO#V~>dYw~tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#V~?X[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#`#V#`#a?}#a;'S#V;'S;=`#z<%lO#V~@S[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y@x#Y;'S#V;'S;=`#z<%lO#V~@}YtPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]>]!];'S#V;'S;=`#z<%lO#V~Ar[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#f#V#f#gBh#g;'S#V;'S;=`#z<%lO#V~Bm[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#_#V#_#`Cc#`;'S#V;'S;=`#z<%lO#V~ChYtPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]DW!];'S#V;'S;=`#z<%lO#V~D_Yx~tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#V~ES[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#T#V#T#UEx#U;'S#V;'S;=`#z<%lO#V~E}[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#b#V#b#cFs#c;'S#V;'S;=`#z<%lO#V~Fx[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#Z#V#Z#[Gn#[;'S#V;'S;=`#z<%lO#V~GsYtPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]Hc!];'S#V;'S;=`#z<%lO#V~HjY!Q~tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#VRI_[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#c#V#c#dJT#d;'S#V;'S;=`#z<%lO#VRJ[YoQtPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#V~KP^tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#b#V#b#cK{#c#f#V#f#gNh#g;'S#V;'S;=`#z<%lO#VRLQ[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#`#V#`#aLv#a;'S#V;'S;=`#z<%lO#VRL{[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#m#V#m#nMq#n;'S#V;'S;=`#z<%lO#VRMxYpQtPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#V~NmdtPOX! {XZ!!rZp! {pq!!rqx! {xz!!rz}! {}!O! {!O!Q! {!Q![#V![!]! {!]!c! {!c!}#V!}#R! {#R#S#V#S#T! {#T#o#V#o;'S! {;'S;=`!!w<%lO! {~!!SY!V~tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#V~!!wO!V~~!!zP;=`<%l! {R!#S^tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#f#V#f#g!$O#g#i#V#i#j!)[#j;'S#V;'S;=`#z<%lO#VR!$T[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^!$y#^;'S#V;'S;=`#z<%lO#VR!%O[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#j#V#j#k!%t#k;'S#V;'S;=`#z<%lO#VR!%y[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#T#V#T#U!&o#U;'S#V;'S;=`#z<%lO#VR!&t[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i!'j#i;'S#V;'S;=`#z<%lO#VR!'o[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y!(e#Y;'S#V;'S;=`#z<%lO#VR!(lY}QtPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#VR!)a[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#U#V#U#V!*V#V;'S#V;'S;=`#z<%lO#VR!*[[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#`#V#`#a!+Q#a;'S#V;'S;=`#z<%lO#VR!+V[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^!+{#^;'S#V;'S;=`#z<%lO#VR!,Q[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#V#V#V#W!,v#W;'S#V;'S;=`#z<%lO#VR!,}Y|QtPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#V~!-r[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]!.h!]#X#V#X#Y!/_#Y;'S#V;'S;=`#z<%lO#V~!.oY!P~tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#V~!/d^tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#d#V#d#e!0`#e#j#V#j#k!5f#k;'S#V;'S;=`#z<%lO#V~!0e[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#c#V#c#d!1Z#d;'S#V;'S;=`#z<%lO#V~!1`[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]!.h!]#g#V#g#h!2U#h;'S#V;'S;=`#z<%lO#V~!2Z[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y!3P#Y;'S#V;'S;=`#z<%lO#V~!3U[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i!3z#i;'S#V;'S;=`#z<%lO#V~!4PYtPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]!4o!];'S#V;'S;=`#z<%lO#V~!4vY!S~tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#V~!5kYtPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]!6Z!];'S#V;'S;=`#z<%lO#V~!6bYq~tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#V~!7V[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#m#V#m#n!7{#n;'S#V;'S;=`#z<%lO#V~!8Q[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#a#V#a#b!8v#b;'S#V;'S;=`#z<%lO#V~!8{YtPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]!9k!];'S#V;'S;=`#z<%lO#V~!9rY!R~tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#V~!:g[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^!;]#^;'S#V;'S;=`#z<%lO#V~!;b[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#g#V#g#h!R[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^!>w#^;'S#V;'S;=`#z<%lO#V~!>|[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#`#V#`#a!?r#a;'S#V;'S;=`#z<%lO#V~!?w[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#]#V#]#^!@m#^;'S#V;'S;=`#z<%lO#V~!@r[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#h#V#h#i!Ah#i;'S#V;'S;=`#z<%lO#V~!Am[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#m#V#m#n!Bc#n;'S#V;'S;=`#z<%lO#V~!BhYtPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]!CW!];'S#V;'S;=`#z<%lO#V~!C_Yz~tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#VR!DS[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#X#V#X#Y!Dx#Y;'S#V;'S;=`#z<%lO#VR!D}[tPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!]#g#V#g#h!Es#h;'S#V;'S;=`#z<%lO#VR!EzYnQtPOX#VZp#Vqx#Vz}#V}!O#V!O![#V![!]#V!];'S#V;'S;=`#z<%lO#V",
tokenizers: [negateToken, 0, 1],
topRules: {"Program":[0,1]},
- tokenPrec: 193,
- termNames: {"0":"⚠","1":"@top","2":"OrExpr","3":"AndExpr","4":"NegateExpr","5":"PrefixExpr","6":"ArchivedExpr","7":"RevisionExpr","8":"ContentExpr","9":"ContextExpr","10":"FileExpr","11":"ForkExpr","12":"VisibilityExpr","13":"RepoExpr","14":"LangExpr","15":"SymExpr","16":"RepoSetExpr","17":"ParenExpr","18":"Term","19":"expr+","20":"(or andExpr)+","21":"␄","22":"negate","23":"%mainskip","24":"space","25":"query","26":"andExpr","27":"expr","28":"archivedKw","29":"\"yes\"","30":"\"no\"","31":"\"only\"","32":"revisionKw","33":"value","34":"quotedString","35":"word","36":"contentKw","37":"contextKw","38":"fileKw","39":"forkKw","40":"forkValue","41":"visibilityKw","42":"visibilityValue","43":"\"public\"","44":"\"private\"","45":"\"any\"","46":"repoKw","47":"langKw","48":"symKw","49":"reposetKw","50":"\"(\"","51":"\")\"","52":"or"}
+ tokenPrec: 200,
+ termNames: {"0":"⚠","1":"@top","2":"OrExpr","3":"AndExpr","4":"NegateExpr","5":"PrefixExpr","6":"ArchivedExpr","7":"RevisionExpr","8":"ContentExpr","9":"ContextExpr","10":"FileExpr","11":"ForkExpr","12":"VisibilityExpr","13":"RepoExpr","14":"LangExpr","15":"SymExpr","16":"RepoSetExpr","17":"ParenExpr","18":"QuotedTerm","19":"Term","20":"expr+","21":"(or andExpr)+","22":"␄","23":"negate","24":"%mainskip","25":"space","26":"query","27":"andExpr","28":"expr","29":"archivedKw","30":"\"yes\"","31":"\"no\"","32":"\"only\"","33":"revisionKw","34":"value","35":"quotedString","36":"word","37":"contentKw","38":"contextKw","39":"fileKw","40":"forkKw","41":"forkValue","42":"visibilityKw","43":"visibilityValue","44":"\"public\"","45":"\"private\"","46":"\"any\"","47":"repoKw","48":"langKw","49":"symKw","50":"reposetKw","51":"\"(\"","52":"\")\"","53":"or"}
})
diff --git a/packages/queryLanguage/src/query.grammar b/packages/queryLanguage/src/query.grammar
index 66c0ee83..f42b21b4 100644
--- a/packages/queryLanguage/src/query.grammar
+++ b/packages/queryLanguage/src/query.grammar
@@ -24,12 +24,13 @@ expr {
NegateExpr |
ParenExpr |
PrefixExpr |
+ QuotedTerm |
Term
}
NegateExpr { !negate negate (PrefixExpr | ParenExpr) }
-ParenExpr { "(" query ")" }
+ParenExpr { "(" query? ")" }
PrefixExpr {
ArchivedExpr |
@@ -63,7 +64,8 @@ archivedValue { "yes" | "no" | "only" }
forkValue { "yes" | "no" | "only" }
visibilityValue { "public" | "private" | "any" }
-Term { quotedString | word }
+QuotedTerm { quotedString }
+Term { word }
value { quotedString | word }
@@ -86,9 +88,7 @@ value { quotedString | word }
quotedString { '"' (!["\\\n] | "\\" _)* '"' }
- // Allow almost anything in a word except spaces, parens, quotes
- // Colons and dashes are allowed anywhere in words (including at the start)
- word { (![ \t\n()"]) (![ \t\n()":] | ":" | "-")* }
+ word { (![ \t\n()]) (![ \t\n():] | ":" | "-")* }
space { $[ \t\n]+ }
diff --git a/packages/queryLanguage/test/grouping.txt b/packages/queryLanguage/test/grouping.txt
index e8c7798e..1c1c084b 100644
--- a/packages/queryLanguage/test/grouping.txt
+++ b/packages/queryLanguage/test/grouping.txt
@@ -4,7 +4,7 @@
==>
-Program(ParenExpr(Term(⚠)))
+Program(ParenExpr)
# Simple grouping
diff --git a/packages/queryLanguage/test/negation.txt b/packages/queryLanguage/test/negation.txt
index 716da115..c229324c 100644
--- a/packages/queryLanguage/test/negation.txt
+++ b/packages/queryLanguage/test/negation.txt
@@ -12,7 +12,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Dash in middle
@@ -244,7 +244,7 @@ Program(NegateExpr(ParenExpr(AndExpr(PrefixExpr(FileExpr),PrefixExpr(LangExpr)))
==>
-Program(NegateExpr(ParenExpr(Term(⚠))))
+Program(NegateExpr(ParenExpr))
# Negate with space after dash
diff --git a/packages/queryLanguage/test/operators.txt b/packages/queryLanguage/test/operators.txt
index 0ff1f6d8..d3c7061a 100644
--- a/packages/queryLanguage/test/operators.txt
+++ b/packages/queryLanguage/test/operators.txt
@@ -36,7 +36,7 @@ Program(OrExpr(Term,NegateExpr(PrefixExpr(FileExpr))))
==>
-Program(OrExpr(Term,Term))
+Program(OrExpr(QuotedTerm,QuotedTerm))
# OR with different prefixes
@@ -260,7 +260,7 @@ Program(OrExpr(PrefixExpr(FileExpr),PrefixExpr(FileExpr)))
==>
-Program(OrExpr(ParenExpr(Term(⚠)),ParenExpr(Term(⚠))))
+Program(OrExpr(ParenExpr,ParenExpr))
# OR with negated groups
diff --git a/packages/queryLanguage/test/precedence.txt b/packages/queryLanguage/test/precedence.txt
index d43e5b34..f25d3db9 100644
--- a/packages/queryLanguage/test/precedence.txt
+++ b/packages/queryLanguage/test/precedence.txt
@@ -156,7 +156,7 @@ Program(AndExpr(ParenExpr(OrExpr(Term,Term)),ParenExpr(OrExpr(Term,Term))))
==>
-Program(Term)
+Program(QuotedTerm)
# Prefix with OR value doesn't split
@@ -188,7 +188,7 @@ Program(OrExpr(Term,ParenExpr(AndExpr(Term,Term))))
==>
-Program(OrExpr(ParenExpr(Term(⚠)),AndExpr(Term,Term)))
+Program(OrExpr(ParenExpr,AndExpr(Term,Term)))
# Negation of empty group
@@ -196,5 +196,5 @@ Program(OrExpr(ParenExpr(Term(⚠)),AndExpr(Term,Term)))
==>
-Program(AndExpr(NegateExpr(ParenExpr(Term(⚠))),Term))
+Program(AndExpr(NegateExpr(ParenExpr),Term))
diff --git a/packages/queryLanguage/test/quoted.txt b/packages/queryLanguage/test/quoted.txt
index 088ed0d3..b918ea04 100644
--- a/packages/queryLanguage/test/quoted.txt
+++ b/packages/queryLanguage/test/quoted.txt
@@ -4,6 +4,22 @@
==>
+Program(QuotedTerm)
+
+# Leading unclosed quote
+
+"hello
+
+==>
+
+Program(Term)
+
+# Trailing unclosed quote
+
+hello"
+
+==>
+
Program(Term)
# Quoted string with spaces
@@ -12,7 +28,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Multiple words in quotes
@@ -20,7 +36,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with escaped quote
@@ -28,7 +44,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with escaped backslash
@@ -36,7 +52,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Double backslash
@@ -44,7 +60,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Multiple escaped quotes
@@ -52,7 +68,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Mixed escaped characters
@@ -60,7 +76,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Empty quoted string
@@ -68,7 +84,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with only spaces
@@ -76,7 +92,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string in file prefix
@@ -116,7 +132,7 @@ Program(PrefixExpr(RevisionExpr))
==>
-Program(AndExpr(Term,Term))
+Program(AndExpr(QuotedTerm,QuotedTerm))
# Quoted and unquoted mixed
@@ -124,7 +140,7 @@ unquoted "quoted string" another
==>
-Program(AndExpr(Term,Term,Term))
+Program(AndExpr(Term,QuotedTerm,Term))
# Quoted string with parentheses inside
@@ -132,7 +148,7 @@ Program(AndExpr(Term,Term,Term))
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with brackets
@@ -140,7 +156,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with special chars
@@ -148,7 +164,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with colons
@@ -156,7 +172,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with dashes
@@ -164,7 +180,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with dots
@@ -172,7 +188,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with regex pattern
@@ -180,7 +196,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with forward slashes
@@ -188,7 +204,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with underscores
@@ -196,7 +212,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with numbers
@@ -204,7 +220,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with mixed case
@@ -212,7 +228,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted prefix value with spaces
@@ -236,7 +252,7 @@ Program(AndExpr(PrefixExpr(FileExpr),PrefixExpr(RepoExpr)))
==>
-Program(ParenExpr(Term))
+Program(ParenExpr(QuotedTerm))
# Multiple quoted in parentheses
@@ -244,7 +260,7 @@ Program(ParenExpr(Term))
==>
-Program(ParenExpr(AndExpr(Term,Term)))
+Program(ParenExpr(AndExpr(QuotedTerm,QuotedTerm)))
# Quoted with escaped newline
@@ -252,7 +268,7 @@ Program(ParenExpr(AndExpr(Term,Term)))
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted with tab character
@@ -260,7 +276,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Lang prefix with quoted value
@@ -292,7 +308,7 @@ Program(PrefixExpr(ContentExpr))
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with hash
@@ -300,7 +316,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with dollar sign
@@ -308,7 +324,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with percent
@@ -316,7 +332,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with ampersand
@@ -324,7 +340,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with asterisk
@@ -332,7 +348,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with plus
@@ -340,7 +356,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with equals
@@ -348,7 +364,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with angle brackets
@@ -356,7 +372,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with pipe
@@ -364,7 +380,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with tilde
@@ -372,7 +388,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with backtick
@@ -380,7 +396,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with question mark
@@ -388,7 +404,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with exclamation
@@ -396,7 +412,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with semicolon
@@ -404,7 +420,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted string with comma
@@ -412,7 +428,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Multiple quotes in content
@@ -428,7 +444,7 @@ Program(PrefixExpr(ContentExpr))
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted file prefix as literal
@@ -436,7 +452,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted lang prefix as literal
@@ -444,7 +460,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted partial prefix
@@ -452,7 +468,7 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
# Mix of quoted prefix and real prefix
@@ -460,7 +476,7 @@ Program(Term)
==>
-Program(AndExpr(Term,PrefixExpr(FileExpr)))
+Program(AndExpr(QuotedTerm,PrefixExpr(FileExpr)))
# Quoted short form prefix
@@ -468,7 +484,7 @@ Program(AndExpr(Term,PrefixExpr(FileExpr)))
==>
-Program(Term)
+Program(QuotedTerm)
# Quoted revision prefix
@@ -476,4 +492,12 @@ Program(Term)
==>
-Program(Term)
+Program(QuotedTerm)
+
+# Quotes can be used within words
+
+name\s*=\s*"projectmanagementlugapi lang:HCL
+
+==>
+
+Program(AndExpr(Term, PrefixExpr(LangExpr)))
\ No newline at end of file
diff --git a/packages/web/src/features/search/parser.ts b/packages/web/src/features/search/parser.ts
index 21cf7473..e3e9d41a 100644
--- a/packages/web/src/features/search/parser.ts
+++ b/packages/web/src/features/search/parser.ts
@@ -18,6 +18,7 @@ import {
SymExpr,
SyntaxNode,
Term,
+ QuotedTerm,
Tree,
VisibilityExpr,
} from '@sourcebot/query-language';
@@ -175,8 +176,12 @@ const transformTreeToIR = async ({
// PrefixExpr contains specific prefix types
return transformPrefixExpr(node);
+ case QuotedTerm:
case Term: {
- const termText = input.substring(node.from, node.to).replace(/^"|"$/g, '');
+ const fullText = input.substring(node.from, node.to);
+ // If the term is quoted, then we remove the quotes as they are
+ // not interpreted.
+ const termText = node.type.id === QuotedTerm ? fullText.replace(/^"|"$/g, '') : fullText;
return isRegexEnabled ? {
regexp: {