fix(parser): Allow parenthesis in query and filter terms - #788

Merged
msukkari merged 3 commits into
mainfrom
michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error
Jan 23, 2026
Merged

fix(parser): Allow parenthesis in query and filter terms#788
msukkari merged 3 commits into
mainfrom
michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error

Conversation

@msukkari

@msukkarimsukkari commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

The parser was previously not allowing words to include parenthesis. This is a problem because it caused queries like test( to fail when in reality this is valid. It also caused issues like #771 when parenthesis were present in filter expressions as well.

This PR fixes that by modifying the lexer/parser do allow words to include parenthesis. The reason this is really complicated is because parenthesis are picked up to detect groupings (i.e. in queries like (foo bar)). Lexers don't like this because it requires them to look ahead to determine what the token produced should be. For examples should (foo bar) be a ParenExpr or two words (foo and bar)?

Needless to say this took a lot of prompting with cursor and claude to arrive at a working solution. Thankfully we have an extensive test suite so we can be pretty sure that no existing functionality has broken

Also fixes#771

Summary by CodeRabbit

  • New Features

    • Improved support for parentheses and grouped expressions in queries
    • More context-aware tokenization for OR, negation, and word-like terms to reduce mis-parsing
  • Bug Fixes

    • Better distinction between parentheses used for grouping vs. part of terms, reducing incorrect ASTs
  • Tests

    • Added extensive parenthesis-focused test cases and updated operator expectations
  • Documentation

    • Changelog entry noting parentheses support in queries

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

Externalized and refined tokenization for parentheses, words, OR, and negation; updated LR parser state/token tables and term name mappings; grammar now uses external tokens for ParenExpr; added extensive parenthesis parsing tests and adjusted OR-related expectations.

Changes

Cohort / File(s)Summary
Parser term constants & config
packages/queryLanguage/src/parser.terms.ts, packages/queryLanguage/src/parser.ts
Added exported term constants openParen, word, closeParen, or. Replaced serialized parser configuration (states, stateData, goto, tokenData), updated tokenizers to include parenToken, wordToken, closeParenToken, orToken, and revised termNames index mappings.
Grammar & tokenizer implementations
packages/queryLanguage/src/query.grammar, packages/queryLanguage/src/tokens.ts
query.grammar now imports external tokens (parenToken, wordToken, closeParenToken, orToken) and uses them in ParenExpr; inline word/or rules removed. tokens.ts introduces context-aware tokenizers: parenToken, closeParenToken, wordToken, orToken, and a refined negateToken, plus helpers for whitespace, prefix detection, and balanced-paren logic.
Tests & expectations
packages/queryLanguage/test/operators.txt, packages/queryLanguage/test/parenthesis.txt
Adjusted two operator expectations to produce AndExpr(Term,Term) instead of warning placeholder; added parenthesis.txt with comprehensive parenthesis/prefix parsing cases and expected AST outputs.
Changelog
CHANGELOG.md
Notes support for parentheses in query/filter terms (Unreleased).

Sequence Diagram(s)

sequenceDiagram
participant Input as InputStream
participant Tokenizers as Tokenizer chain (tokens.ts)
participant Parser as LRParser (parser.ts)
participant AST as AST builder / semantic actions
Input->>Tokenizers: read characters
Tokenizers->>Tokenizers: apply rules (balanced-paren, prefixes, OR/negation)
Tokenizers-->>Parser: emit tokens (openParen, word, closeParen, or, negate, ...)
Parser->>Parser: consult states / tokenData / goto
Parser-->>AST: invoke reductions → build Program / Expr nodes
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 75.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically describes the main change: allowing parentheses in query and filter terms, which directly addresses the parser modifications shown across multiple files.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

brendan-kellam
brendan-kellam previously approved these changes Jan 23, 2026

@brendan-kellambrendan-kellam left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@msukkari
msukkari merged commit 507fc8b into mainJan 23, 2026
9 checks passed
@msukkari
msukkari deleted the michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error branch January 23, 2026 05:11
@github-actionsgithub-actionsBot mentioned this pull request Jan 23, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Ask cannot handle files with special characters

2 participants

@msukkari@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(parser): Allow parenthesis in query and filter terms - #788

Merged
msukkari merged 3 commits into
mainfrom
michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error
Jan 23, 2026
Merged

fix(parser): Allow parenthesis in query and filter terms#788
msukkari merged 3 commits into
mainfrom
michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error

Conversation

@msukkari

@msukkarimsukkari commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

The parser was previously not allowing words to include parenthesis. This is a problem because it caused queries like test( to fail when in reality this is valid. It also caused issues like #771 when parenthesis were present in filter expressions as well.

This PR fixes that by modifying the lexer/parser do allow words to include parenthesis. The reason this is really complicated is because parenthesis are picked up to detect groupings (i.e. in queries like (foo bar)). Lexers don't like this because it requires them to look ahead to determine what the token produced should be. For examples should (foo bar) be a ParenExpr or two words (foo and bar)?

Needless to say this took a lot of prompting with cursor and claude to arrive at a working solution. Thankfully we have an extensive test suite so we can be pretty sure that no existing functionality has broken

Also fixes#771

Summary by CodeRabbit

  • New Features

    • Improved support for parentheses and grouped expressions in queries
    • More context-aware tokenization for OR, negation, and word-like terms to reduce mis-parsing
  • Bug Fixes

    • Better distinction between parentheses used for grouping vs. part of terms, reducing incorrect ASTs
  • Tests

    • Added extensive parenthesis-focused test cases and updated operator expectations
  • Documentation

    • Changelog entry noting parentheses support in queries

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

Externalized and refined tokenization for parentheses, words, OR, and negation; updated LR parser state/token tables and term name mappings; grammar now uses external tokens for ParenExpr; added extensive parenthesis parsing tests and adjusted OR-related expectations.

Changes

Cohort / File(s)Summary
Parser term constants & config
packages/queryLanguage/src/parser.terms.ts, packages/queryLanguage/src/parser.ts
Added exported term constants openParen, word, closeParen, or. Replaced serialized parser configuration (states, stateData, goto, tokenData), updated tokenizers to include parenToken, wordToken, closeParenToken, orToken, and revised termNames index mappings.
Grammar & tokenizer implementations
packages/queryLanguage/src/query.grammar, packages/queryLanguage/src/tokens.ts
query.grammar now imports external tokens (parenToken, wordToken, closeParenToken, orToken) and uses them in ParenExpr; inline word/or rules removed. tokens.ts introduces context-aware tokenizers: parenToken, closeParenToken, wordToken, orToken, and a refined negateToken, plus helpers for whitespace, prefix detection, and balanced-paren logic.
Tests & expectations
packages/queryLanguage/test/operators.txt, packages/queryLanguage/test/parenthesis.txt
Adjusted two operator expectations to produce AndExpr(Term,Term) instead of warning placeholder; added parenthesis.txt with comprehensive parenthesis/prefix parsing cases and expected AST outputs.
Changelog
CHANGELOG.md
Notes support for parentheses in query/filter terms (Unreleased).

Sequence Diagram(s)

sequenceDiagram
participant Input as InputStream
participant Tokenizers as Tokenizer chain (tokens.ts)
participant Parser as LRParser (parser.ts)
participant AST as AST builder / semantic actions
Input->>Tokenizers: read characters
Tokenizers->>Tokenizers: apply rules (balanced-paren, prefixes, OR/negation)
Tokenizers-->>Parser: emit tokens (openParen, word, closeParen, or, negate, ...)
Parser->>Parser: consult states / tokenData / goto
Parser-->>AST: invoke reductions → build Program / Expr nodes
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 75.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically describes the main change: allowing parentheses in query and filter terms, which directly addresses the parser modifications shown across multiple files.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

brendan-kellam
brendan-kellam previously approved these changes Jan 23, 2026

@brendan-kellambrendan-kellam left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@msukkari
msukkari merged commit 507fc8b into mainJan 23, 2026
9 checks passed
@msukkari
msukkari deleted the michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error branch January 23, 2026 05:11
@github-actionsgithub-actionsBot mentioned this pull request Jan 23, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Ask cannot handle files with special characters

2 participants

@msukkari@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(parser): Allow parenthesis in query and filter terms - #788

Merged
msukkari merged 3 commits into
mainfrom
michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error
Jan 23, 2026
Merged

fix(parser): Allow parenthesis in query and filter terms#788
msukkari merged 3 commits into
mainfrom
michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error

Conversation

@msukkari

@msukkarimsukkari commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

The parser was previously not allowing words to include parenthesis. This is a problem because it caused queries like test( to fail when in reality this is valid. It also caused issues like #771 when parenthesis were present in filter expressions as well.

This PR fixes that by modifying the lexer/parser do allow words to include parenthesis. The reason this is really complicated is because parenthesis are picked up to detect groupings (i.e. in queries like (foo bar)). Lexers don't like this because it requires them to look ahead to determine what the token produced should be. For examples should (foo bar) be a ParenExpr or two words (foo and bar)?

Needless to say this took a lot of prompting with cursor and claude to arrive at a working solution. Thankfully we have an extensive test suite so we can be pretty sure that no existing functionality has broken

Also fixes#771

Summary by CodeRabbit

  • New Features

    • Improved support for parentheses and grouped expressions in queries
    • More context-aware tokenization for OR, negation, and word-like terms to reduce mis-parsing
  • Bug Fixes

    • Better distinction between parentheses used for grouping vs. part of terms, reducing incorrect ASTs
  • Tests

    • Added extensive parenthesis-focused test cases and updated operator expectations
  • Documentation

    • Changelog entry noting parentheses support in queries

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

Externalized and refined tokenization for parentheses, words, OR, and negation; updated LR parser state/token tables and term name mappings; grammar now uses external tokens for ParenExpr; added extensive parenthesis parsing tests and adjusted OR-related expectations.

Changes

Cohort / File(s)Summary
Parser term constants & config
packages/queryLanguage/src/parser.terms.ts, packages/queryLanguage/src/parser.ts
Added exported term constants openParen, word, closeParen, or. Replaced serialized parser configuration (states, stateData, goto, tokenData), updated tokenizers to include parenToken, wordToken, closeParenToken, orToken, and revised termNames index mappings.
Grammar & tokenizer implementations
packages/queryLanguage/src/query.grammar, packages/queryLanguage/src/tokens.ts
query.grammar now imports external tokens (parenToken, wordToken, closeParenToken, orToken) and uses them in ParenExpr; inline word/or rules removed. tokens.ts introduces context-aware tokenizers: parenToken, closeParenToken, wordToken, orToken, and a refined negateToken, plus helpers for whitespace, prefix detection, and balanced-paren logic.
Tests & expectations
packages/queryLanguage/test/operators.txt, packages/queryLanguage/test/parenthesis.txt
Adjusted two operator expectations to produce AndExpr(Term,Term) instead of warning placeholder; added parenthesis.txt with comprehensive parenthesis/prefix parsing cases and expected AST outputs.
Changelog
CHANGELOG.md
Notes support for parentheses in query/filter terms (Unreleased).

Sequence Diagram(s)

sequenceDiagram
participant Input as InputStream
participant Tokenizers as Tokenizer chain (tokens.ts)
participant Parser as LRParser (parser.ts)
participant AST as AST builder / semantic actions
Input->>Tokenizers: read characters
Tokenizers->>Tokenizers: apply rules (balanced-paren, prefixes, OR/negation)
Tokenizers-->>Parser: emit tokens (openParen, word, closeParen, or, negate, ...)
Parser->>Parser: consult states / tokenData / goto
Parser-->>AST: invoke reductions → build Program / Expr nodes
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 75.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically describes the main change: allowing parentheses in query and filter terms, which directly addresses the parser modifications shown across multiple files.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

brendan-kellam
brendan-kellam previously approved these changes Jan 23, 2026

@brendan-kellambrendan-kellam left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@msukkari
msukkari merged commit 507fc8b into mainJan 23, 2026
9 checks passed
@msukkari
msukkari deleted the michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error branch January 23, 2026 05:11
@github-actionsgithub-actionsBot mentioned this pull request Jan 23, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Ask cannot handle files with special characters

2 participants

@msukkari@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(parser): Allow parenthesis in query and filter terms - #788

Merged
msukkari merged 3 commits into
mainfrom
michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error
Jan 23, 2026
Merged

fix(parser): Allow parenthesis in query and filter terms#788
msukkari merged 3 commits into
mainfrom
michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error

Conversation

@msukkari

@msukkarimsukkari commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

The parser was previously not allowing words to include parenthesis. This is a problem because it caused queries like test( to fail when in reality this is valid. It also caused issues like #771 when parenthesis were present in filter expressions as well.

This PR fixes that by modifying the lexer/parser do allow words to include parenthesis. The reason this is really complicated is because parenthesis are picked up to detect groupings (i.e. in queries like (foo bar)). Lexers don't like this because it requires them to look ahead to determine what the token produced should be. For examples should (foo bar) be a ParenExpr or two words (foo and bar)?

Needless to say this took a lot of prompting with cursor and claude to arrive at a working solution. Thankfully we have an extensive test suite so we can be pretty sure that no existing functionality has broken

Also fixes#771

Summary by CodeRabbit

  • New Features

    • Improved support for parentheses and grouped expressions in queries
    • More context-aware tokenization for OR, negation, and word-like terms to reduce mis-parsing
  • Bug Fixes

    • Better distinction between parentheses used for grouping vs. part of terms, reducing incorrect ASTs
  • Tests

    • Added extensive parenthesis-focused test cases and updated operator expectations
  • Documentation

    • Changelog entry noting parentheses support in queries

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

Externalized and refined tokenization for parentheses, words, OR, and negation; updated LR parser state/token tables and term name mappings; grammar now uses external tokens for ParenExpr; added extensive parenthesis parsing tests and adjusted OR-related expectations.

Changes

Cohort / File(s)Summary
Parser term constants & config
packages/queryLanguage/src/parser.terms.ts, packages/queryLanguage/src/parser.ts
Added exported term constants openParen, word, closeParen, or. Replaced serialized parser configuration (states, stateData, goto, tokenData), updated tokenizers to include parenToken, wordToken, closeParenToken, orToken, and revised termNames index mappings.
Grammar & tokenizer implementations
packages/queryLanguage/src/query.grammar, packages/queryLanguage/src/tokens.ts
query.grammar now imports external tokens (parenToken, wordToken, closeParenToken, orToken) and uses them in ParenExpr; inline word/or rules removed. tokens.ts introduces context-aware tokenizers: parenToken, closeParenToken, wordToken, orToken, and a refined negateToken, plus helpers for whitespace, prefix detection, and balanced-paren logic.
Tests & expectations
packages/queryLanguage/test/operators.txt, packages/queryLanguage/test/parenthesis.txt
Adjusted two operator expectations to produce AndExpr(Term,Term) instead of warning placeholder; added parenthesis.txt with comprehensive parenthesis/prefix parsing cases and expected AST outputs.
Changelog
CHANGELOG.md
Notes support for parentheses in query/filter terms (Unreleased).

Sequence Diagram(s)

sequenceDiagram
participant Input as InputStream
participant Tokenizers as Tokenizer chain (tokens.ts)
participant Parser as LRParser (parser.ts)
participant AST as AST builder / semantic actions
Input->>Tokenizers: read characters
Tokenizers->>Tokenizers: apply rules (balanced-paren, prefixes, OR/negation)
Tokenizers-->>Parser: emit tokens (openParen, word, closeParen, or, negate, ...)
Parser->>Parser: consult states / tokenData / goto
Parser-->>AST: invoke reductions → build Program / Expr nodes
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 75.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically describes the main change: allowing parentheses in query and filter terms, which directly addresses the parser modifications shown across multiple files.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

brendan-kellam
brendan-kellam previously approved these changes Jan 23, 2026

@brendan-kellambrendan-kellam left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@msukkari
msukkari merged commit 507fc8b into mainJan 23, 2026
9 checks passed
@msukkari
msukkari deleted the michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error branch January 23, 2026 05:11
@github-actionsgithub-actionsBot mentioned this pull request Jan 23, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Ask cannot handle files with special characters

2 participants

@msukkari@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(parser): Allow parenthesis in query and filter terms - #788

Merged
msukkari merged 3 commits into
mainfrom
michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error
Jan 23, 2026
Merged

fix(parser): Allow parenthesis in query and filter terms#788
msukkari merged 3 commits into
mainfrom
michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error

Conversation

@msukkari

@msukkarimsukkari commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

The parser was previously not allowing words to include parenthesis. This is a problem because it caused queries like test( to fail when in reality this is valid. It also caused issues like #771 when parenthesis were present in filter expressions as well.

This PR fixes that by modifying the lexer/parser do allow words to include parenthesis. The reason this is really complicated is because parenthesis are picked up to detect groupings (i.e. in queries like (foo bar)). Lexers don't like this because it requires them to look ahead to determine what the token produced should be. For examples should (foo bar) be a ParenExpr or two words (foo and bar)?

Needless to say this took a lot of prompting with cursor and claude to arrive at a working solution. Thankfully we have an extensive test suite so we can be pretty sure that no existing functionality has broken

Also fixes#771

Summary by CodeRabbit

  • New Features

    • Improved support for parentheses and grouped expressions in queries
    • More context-aware tokenization for OR, negation, and word-like terms to reduce mis-parsing
  • Bug Fixes

    • Better distinction between parentheses used for grouping vs. part of terms, reducing incorrect ASTs
  • Tests

    • Added extensive parenthesis-focused test cases and updated operator expectations
  • Documentation

    • Changelog entry noting parentheses support in queries

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

Externalized and refined tokenization for parentheses, words, OR, and negation; updated LR parser state/token tables and term name mappings; grammar now uses external tokens for ParenExpr; added extensive parenthesis parsing tests and adjusted OR-related expectations.

Changes

Cohort / File(s)Summary
Parser term constants & config
packages/queryLanguage/src/parser.terms.ts, packages/queryLanguage/src/parser.ts
Added exported term constants openParen, word, closeParen, or. Replaced serialized parser configuration (states, stateData, goto, tokenData), updated tokenizers to include parenToken, wordToken, closeParenToken, orToken, and revised termNames index mappings.
Grammar & tokenizer implementations
packages/queryLanguage/src/query.grammar, packages/queryLanguage/src/tokens.ts
query.grammar now imports external tokens (parenToken, wordToken, closeParenToken, orToken) and uses them in ParenExpr; inline word/or rules removed. tokens.ts introduces context-aware tokenizers: parenToken, closeParenToken, wordToken, orToken, and a refined negateToken, plus helpers for whitespace, prefix detection, and balanced-paren logic.
Tests & expectations
packages/queryLanguage/test/operators.txt, packages/queryLanguage/test/parenthesis.txt
Adjusted two operator expectations to produce AndExpr(Term,Term) instead of warning placeholder; added parenthesis.txt with comprehensive parenthesis/prefix parsing cases and expected AST outputs.
Changelog
CHANGELOG.md
Notes support for parentheses in query/filter terms (Unreleased).

Sequence Diagram(s)

sequenceDiagram
participant Input as InputStream
participant Tokenizers as Tokenizer chain (tokens.ts)
participant Parser as LRParser (parser.ts)
participant AST as AST builder / semantic actions
Input->>Tokenizers: read characters
Tokenizers->>Tokenizers: apply rules (balanced-paren, prefixes, OR/negation)
Tokenizers-->>Parser: emit tokens (openParen, word, closeParen, or, negate, ...)
Parser->>Parser: consult states / tokenData / goto
Parser-->>AST: invoke reductions → build Program / Expr nodes
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 75.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically describes the main change: allowing parentheses in query and filter terms, which directly addresses the parser modifications shown across multiple files.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

brendan-kellam
brendan-kellam previously approved these changes Jan 23, 2026

@brendan-kellambrendan-kellam left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@msukkari
msukkari merged commit 507fc8b into mainJan 23, 2026
9 checks passed
@msukkari
msukkari deleted the michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error branch January 23, 2026 05:11
@github-actionsgithub-actionsBot mentioned this pull request Jan 23, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Ask cannot handle files with special characters

2 participants

@msukkari@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(parser): Allow parenthesis in query and filter terms - #788

Merged
msukkari merged 3 commits into
mainfrom
michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error
Jan 23, 2026
Merged

fix(parser): Allow parenthesis in query and filter terms#788
msukkari merged 3 commits into
mainfrom
michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error

Conversation

@msukkari

@msukkarimsukkari commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

The parser was previously not allowing words to include parenthesis. This is a problem because it caused queries like test( to fail when in reality this is valid. It also caused issues like #771 when parenthesis were present in filter expressions as well.

This PR fixes that by modifying the lexer/parser do allow words to include parenthesis. The reason this is really complicated is because parenthesis are picked up to detect groupings (i.e. in queries like (foo bar)). Lexers don't like this because it requires them to look ahead to determine what the token produced should be. For examples should (foo bar) be a ParenExpr or two words (foo and bar)?

Needless to say this took a lot of prompting with cursor and claude to arrive at a working solution. Thankfully we have an extensive test suite so we can be pretty sure that no existing functionality has broken

Also fixes#771

Summary by CodeRabbit

  • New Features

    • Improved support for parentheses and grouped expressions in queries
    • More context-aware tokenization for OR, negation, and word-like terms to reduce mis-parsing
  • Bug Fixes

    • Better distinction between parentheses used for grouping vs. part of terms, reducing incorrect ASTs
  • Tests

    • Added extensive parenthesis-focused test cases and updated operator expectations
  • Documentation

    • Changelog entry noting parentheses support in queries

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

Externalized and refined tokenization for parentheses, words, OR, and negation; updated LR parser state/token tables and term name mappings; grammar now uses external tokens for ParenExpr; added extensive parenthesis parsing tests and adjusted OR-related expectations.

Changes

Cohort / File(s)Summary
Parser term constants & config
packages/queryLanguage/src/parser.terms.ts, packages/queryLanguage/src/parser.ts
Added exported term constants openParen, word, closeParen, or. Replaced serialized parser configuration (states, stateData, goto, tokenData), updated tokenizers to include parenToken, wordToken, closeParenToken, orToken, and revised termNames index mappings.
Grammar & tokenizer implementations
packages/queryLanguage/src/query.grammar, packages/queryLanguage/src/tokens.ts
query.grammar now imports external tokens (parenToken, wordToken, closeParenToken, orToken) and uses them in ParenExpr; inline word/or rules removed. tokens.ts introduces context-aware tokenizers: parenToken, closeParenToken, wordToken, orToken, and a refined negateToken, plus helpers for whitespace, prefix detection, and balanced-paren logic.
Tests & expectations
packages/queryLanguage/test/operators.txt, packages/queryLanguage/test/parenthesis.txt
Adjusted two operator expectations to produce AndExpr(Term,Term) instead of warning placeholder; added parenthesis.txt with comprehensive parenthesis/prefix parsing cases and expected AST outputs.
Changelog
CHANGELOG.md
Notes support for parentheses in query/filter terms (Unreleased).

Sequence Diagram(s)

sequenceDiagram
participant Input as InputStream
participant Tokenizers as Tokenizer chain (tokens.ts)
participant Parser as LRParser (parser.ts)
participant AST as AST builder / semantic actions
Input->>Tokenizers: read characters
Tokenizers->>Tokenizers: apply rules (balanced-paren, prefixes, OR/negation)
Tokenizers-->>Parser: emit tokens (openParen, word, closeParen, or, negate, ...)
Parser->>Parser: consult states / tokenData / goto
Parser-->>AST: invoke reductions → build Program / Expr nodes
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 75.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically describes the main change: allowing parentheses in query and filter terms, which directly addresses the parser modifications shown across multiple files.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

brendan-kellam
brendan-kellam previously approved these changes Jan 23, 2026

@brendan-kellambrendan-kellam left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@msukkari
msukkari merged commit 507fc8b into mainJan 23, 2026
9 checks passed
@msukkari
msukkari deleted the michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error branch January 23, 2026 05:11
@github-actionsgithub-actionsBot mentioned this pull request Jan 23, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Ask cannot handle files with special characters

2 participants

@msukkari@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(parser): Allow parenthesis in query and filter terms - #788

Merged
msukkari merged 3 commits into
mainfrom
michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error
Jan 23, 2026
Merged

fix(parser): Allow parenthesis in query and filter terms#788
msukkari merged 3 commits into
mainfrom
michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error

Conversation

@msukkari

@msukkarimsukkari commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

The parser was previously not allowing words to include parenthesis. This is a problem because it caused queries like test( to fail when in reality this is valid. It also caused issues like #771 when parenthesis were present in filter expressions as well.

This PR fixes that by modifying the lexer/parser do allow words to include parenthesis. The reason this is really complicated is because parenthesis are picked up to detect groupings (i.e. in queries like (foo bar)). Lexers don't like this because it requires them to look ahead to determine what the token produced should be. For examples should (foo bar) be a ParenExpr or two words (foo and bar)?

Needless to say this took a lot of prompting with cursor and claude to arrive at a working solution. Thankfully we have an extensive test suite so we can be pretty sure that no existing functionality has broken

Also fixes#771

Summary by CodeRabbit

  • New Features

    • Improved support for parentheses and grouped expressions in queries
    • More context-aware tokenization for OR, negation, and word-like terms to reduce mis-parsing
  • Bug Fixes

    • Better distinction between parentheses used for grouping vs. part of terms, reducing incorrect ASTs
  • Tests

    • Added extensive parenthesis-focused test cases and updated operator expectations
  • Documentation

    • Changelog entry noting parentheses support in queries

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

Externalized and refined tokenization for parentheses, words, OR, and negation; updated LR parser state/token tables and term name mappings; grammar now uses external tokens for ParenExpr; added extensive parenthesis parsing tests and adjusted OR-related expectations.

Changes

Cohort / File(s)Summary
Parser term constants & config
packages/queryLanguage/src/parser.terms.ts, packages/queryLanguage/src/parser.ts
Added exported term constants openParen, word, closeParen, or. Replaced serialized parser configuration (states, stateData, goto, tokenData), updated tokenizers to include parenToken, wordToken, closeParenToken, orToken, and revised termNames index mappings.
Grammar & tokenizer implementations
packages/queryLanguage/src/query.grammar, packages/queryLanguage/src/tokens.ts
query.grammar now imports external tokens (parenToken, wordToken, closeParenToken, orToken) and uses them in ParenExpr; inline word/or rules removed. tokens.ts introduces context-aware tokenizers: parenToken, closeParenToken, wordToken, orToken, and a refined negateToken, plus helpers for whitespace, prefix detection, and balanced-paren logic.
Tests & expectations
packages/queryLanguage/test/operators.txt, packages/queryLanguage/test/parenthesis.txt
Adjusted two operator expectations to produce AndExpr(Term,Term) instead of warning placeholder; added parenthesis.txt with comprehensive parenthesis/prefix parsing cases and expected AST outputs.
Changelog
CHANGELOG.md
Notes support for parentheses in query/filter terms (Unreleased).

Sequence Diagram(s)

sequenceDiagram
participant Input as InputStream
participant Tokenizers as Tokenizer chain (tokens.ts)
participant Parser as LRParser (parser.ts)
participant AST as AST builder / semantic actions
Input->>Tokenizers: read characters
Tokenizers->>Tokenizers: apply rules (balanced-paren, prefixes, OR/negation)
Tokenizers-->>Parser: emit tokens (openParen, word, closeParen, or, negate, ...)
Parser->>Parser: consult states / tokenData / goto
Parser-->>AST: invoke reductions → build Program / Expr nodes
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 75.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically describes the main change: allowing parentheses in query and filter terms, which directly addresses the parser modifications shown across multiple files.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

brendan-kellam
brendan-kellam previously approved these changes Jan 23, 2026

@brendan-kellambrendan-kellam left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@msukkari
msukkari merged commit 507fc8b into mainJan 23, 2026
9 checks passed
@msukkari
msukkari deleted the michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error branch January 23, 2026 05:11
@github-actionsgithub-actionsBot mentioned this pull request Jan 23, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Ask cannot handle files with special characters

2 participants

@msukkari@brendan-kellam
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(parser): Allow parenthesis in query and filter terms - #788

Merged
msukkari merged 3 commits into
mainfrom
michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error
Jan 23, 2026
Merged

fix(parser): Allow parenthesis in query and filter terms#788
msukkari merged 3 commits into
mainfrom
michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error

Conversation

@msukkari

@msukkarimsukkari commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

The parser was previously not allowing words to include parenthesis. This is a problem because it caused queries like test( to fail when in reality this is valid. It also caused issues like #771 when parenthesis were present in filter expressions as well.

This PR fixes that by modifying the lexer/parser do allow words to include parenthesis. The reason this is really complicated is because parenthesis are picked up to detect groupings (i.e. in queries like (foo bar)). Lexers don't like this because it requires them to look ahead to determine what the token produced should be. For examples should (foo bar) be a ParenExpr or two words (foo and bar)?

Needless to say this took a lot of prompting with cursor and claude to arrive at a working solution. Thankfully we have an extensive test suite so we can be pretty sure that no existing functionality has broken

Also fixes#771

Summary by CodeRabbit

  • New Features

    • Improved support for parentheses and grouped expressions in queries
    • More context-aware tokenization for OR, negation, and word-like terms to reduce mis-parsing
  • Bug Fixes

    • Better distinction between parentheses used for grouping vs. part of terms, reducing incorrect ASTs
  • Tests

    • Added extensive parenthesis-focused test cases and updated operator expectations
  • Documentation

    • Changelog entry noting parentheses support in queries

✏️ Tip: You can customize this high-level summary in your review settings.

@github-actions

This comment has been minimized.

@coderabbitai

coderabbitaiBot commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

Externalized and refined tokenization for parentheses, words, OR, and negation; updated LR parser state/token tables and term name mappings; grammar now uses external tokens for ParenExpr; added extensive parenthesis parsing tests and adjusted OR-related expectations.

Changes

Cohort / File(s)Summary
Parser term constants & config
packages/queryLanguage/src/parser.terms.ts, packages/queryLanguage/src/parser.ts
Added exported term constants openParen, word, closeParen, or. Replaced serialized parser configuration (states, stateData, goto, tokenData), updated tokenizers to include parenToken, wordToken, closeParenToken, orToken, and revised termNames index mappings.
Grammar & tokenizer implementations
packages/queryLanguage/src/query.grammar, packages/queryLanguage/src/tokens.ts
query.grammar now imports external tokens (parenToken, wordToken, closeParenToken, orToken) and uses them in ParenExpr; inline word/or rules removed. tokens.ts introduces context-aware tokenizers: parenToken, closeParenToken, wordToken, orToken, and a refined negateToken, plus helpers for whitespace, prefix detection, and balanced-paren logic.
Tests & expectations
packages/queryLanguage/test/operators.txt, packages/queryLanguage/test/parenthesis.txt
Adjusted two operator expectations to produce AndExpr(Term,Term) instead of warning placeholder; added parenthesis.txt with comprehensive parenthesis/prefix parsing cases and expected AST outputs.
Changelog
CHANGELOG.md
Notes support for parentheses in query/filter terms (Unreleased).

Sequence Diagram(s)

sequenceDiagram
participant Input as InputStream
participant Tokenizers as Tokenizer chain (tokens.ts)
participant Parser as LRParser (parser.ts)
participant AST as AST builder / semantic actions
Input->>Tokenizers: read characters
Tokenizers->>Tokenizers: apply rules (balanced-paren, prefixes, OR/negation)
Tokenizers-->>Parser: emit tokens (openParen, word, closeParen, or, negate, ...)
Parser->>Parser: consult states / tokenData / goto
Parser-->>AST: invoke reductions → build Program / Expr nodes
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 75.00% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title clearly and specifically describes the main change: allowing parentheses in query and filter terms, which directly addresses the parser modifications shown across multiple files.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

brendan-kellam
brendan-kellam previously approved these changes Jan 23, 2026

@brendan-kellambrendan-kellam left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm

@msukkari
msukkari merged commit 507fc8b into mainJan 23, 2026
9 checks passed
@msukkari
msukkari deleted the michael/sou-259-bug-parenthesis-in-search-term-causes-parse-error branch January 23, 2026 05:11
@github-actionsgithub-actionsBot mentioned this pull request Jan 23, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] Ask cannot handle files with special characters

2 participants

@msukkari@brendan-kellam