ANTLR grammar performance optimization
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 72/100
Direzione di ricerca
Start with grammar/Kql.g4, focusing on equalityExpression and functionCallOrPathExpression and their referenced rules. Compare the proposed left-factored grammar with the current parser behavior, then run the Python parsing benchmark used in testing; done means equivalent parsing with the reported cold-start improvement.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
equalityExpression and functionCallOrPathExpression in the grammar/Kql.g4 each have several alternatives that begin with the same prefix, forcing ANTLR to parse entire expressions before finding the correct one. During testing in Python, left-factoring both improved cold-start parse time by ~7x.
Four of the five alternatives in equalityExpression begin with relationalExpression:
equalityExpression:
relationalExpression
| equalsEqualityExpression
| listEqualityExpression
| betweenEqualityExpression
| starEqualityExpression
;
equalsEqualityExpression:
Left=relationalExpression OperatorToken=('==' | '<>' | '!=') Right=relationalExpression;
listEqualityExpression:
Left=relationalExpression OperatorToken=(IN | NOT_IN | IN_CI | NOT_IN_CI | HAS_ANY | HAS_ALL) '(' Expressions+=invocationExpression (',' Expressions+=invocationExpression)* ')';
betweenEqualityExpression:
Left=relationalExpression OperatorToken=(BETWEEN | NOT_BETWEEN) '(' StartExpression=invocationExpression '..' EndExpression=invocationExpression ')';
Two of the three alternatives in functionCallOrPathExpression begin with functionCallOrPathRoot:
functionCallOrPathExpression:
functionCallOrPathRoot
| functionCallOrPathPathExpression
| toTableExpression
;
functionCallOrPathPathExpression:
Expression=functionCallOrPathRoot (Operations+=functionCallOrPathOperation)+;
Proposed patch:
--- upstream/Kql.g4 2026-09-20 13:35:23.381480187 +0000
+++ upstream_patched/Kql.g4 2026-09-20 13:36:24.993425830 +0000
@@ -896,21 +896,15 @@
AND Right=equalityExpression;
equalityExpression:
- relationalExpression
- | equalsEqualityExpression
- | listEqualityExpression
- | betweenEqualityExpression
- | starEqualityExpression
+ starEqualityExpression
+ | Left=relationalExpression (Tail=equalityExpressionTail)?
;
-equalsEqualityExpression:
- Left=relationalExpression OperatorToken=('==' | '<>' | '!=') Right=relationalExpression;
-
-listEqualityExpression:
- Left=relationalExpression OperatorToken=(IN | NOT_IN | IN_CI | NOT_IN_CI | HAS_ANY | HAS_ALL) '(' Expressions+=invocationExpression (',' Expressions+=invocationExpression)* ')';
-
-betweenEqualityExpression:
- Left=relationalExpression OperatorToken=(BETWEEN | NOT_BETWEEN) '(' StartExpression=invocationExpression '..' EndExpression=invocationExpression ')';
+equalityExpressionTail:
+ OperatorToken=('==' | '<>' | '!=') Right=relationalExpression # equalsEqualityExpression
+ | OperatorToken=(IN | NOT_IN | IN_CI | NOT_IN_CI | HAS_ANY | HAS_ALL) '(' Expressions+=invocationExpression (',' Expressions+=invocationExpression)* ')' # listEqualityExpression
+ | OperatorToken=(BETWEEN | NOT_BETWEEN) '(' StartExpression=invocationExpression '..' EndExpression=invocationExpression ')' # betweenEqualityExpression
+ ;
starEqualityExpression:
'*' '==' Expression=relationalExpression;
@@ -987,9 +981,8 @@
(OperatorToken=('+' | '-'))? Expression=functionCallOrPathExpression;
functionCallOrPathExpression:
- functionCallOrPathRoot
- | functionCallOrPathPathExpression
- | toTableExpression
+ toTableExpression # toTablePathExpression
+ | Expression=functionCallOrPathRoot (Operations+=functionCallOrPathOperation)* # functionCallOrPathPathExpression
;
functionCallOrPathRoot:
@@ -998,9 +991,6 @@
| toScalarExpression
;
-functionCallOrPathPathExpression:
- Expression=functionCallOrPathRoot (Operations+=functionCallOrPathOperation)+;
-
functionCallOrPathOperation:
functionCallOrPathPathOperation
| functionCallOrPathElementOperation
- Lingua principale
- C#
- Stelle
- 684
- Fork
- 122
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di microsoft/Kusto-Query-Language
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 68/100
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 68/100
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 72/100
microsoft/Kusto-Query-Language#194 · 3 commenti ·
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 52/100
microsoft/Kusto-Query-Language#189 · 1 reazione ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 48/100
microsoft/Kusto-Query-Language#188 · 1 commento ·
Tutte le issue di microsoft/Kusto-Query-Language
Issue simili
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 66/100
swisstopo/swissgeol-boreholes-suite#3086 ·
I maintainer di solito rispondono entro 1 giorno
-
byte类型在条件中的解析BUGAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
dotnetcore/FreeSql#2290 ·
-
status:waiting-for-triage type:bug
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 84/100
microsoftgraph/msgraph-sdk-dotnet#3194 ·
I maintainer di solito rispondono entro 1 giorno
-
Backend enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
I maintainer di solito rispondono entro 1 giorno
-
UI: money shows the minus sign next to the number, not before the currency (IL -3.0m, not -IL 3.0m)Apertaarea: sim area: unity enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
eyalgolan/statecraft-israel#1107 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno