Should the parser stay ANTLR-generated? (intent of #565, needs-design)
Maintainer antworten meist innerhalb von 1 Tag
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Anfängerfreundlichkeit
- 25/100
Rechercherichtung
Beginne mit dem Lesen von Core/Antlr, AngouriMath.g, Docs/Contributing/ImproveParser.md und StringizeRoundTripTest, um den aktuellen Parser und seine Akzeptanzkriterien zu verstehen. Jeder vorgeschlagene Ersatz sollte hinsichtlich Round-Trip-Erhaltung, Fehlermeldungen, Laufzeitkosten und der Frage bewertet werden, ob Docs/Usage/Syntax.md weiterhin korrekt ist; das Issue ist abgeschlossen, wenn die Maintainer eine durch diese Prüfungen gestützte Entscheidung getroffen haben.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Splitting the intent of #565 out of the branch, which is being closed: it proposed replacing the ANTLR-generated parser with one built on Yoakke, and the question it raises is live even though the branch is not.
What the branch did
Deleted the whole of Core/Antlr — the grammar, the four generated files, the .interp/.tokens
artefacts and the bundled antlr-4.8-complete.jar — and replaced it with a hand-assembled parser:
+740 / −7185 across 26 files.
Why ANTLR is worth replacing
Not on parser-theory grounds. On the day-to-day cost of it:
- The generated files are committed, so a grammar change is a two-step ritual — edit
AngouriMath.g, runantlr_rerun.bat, then run a post-processing pass whose only job is to rewrite
publictointernalon the generated classes.Docs/Contributing/ImproveParser.mddocuments it,
and the documentation has to warn you to regenerate the unmodified grammar first and check the diff
is empty, so that a toolchain version difference is not mistaken for your change. - It needs a JDK to change the grammar at all, in a repository that otherwise needs only the .NET
SDK. - A 1 MB jar is in the source tree.
- The error messages are ANTLR's, which is why
MissingOperatorParseExceptionand friends exist to
translate them, and whyDocs/Usage/Syntax.mdhad to be written by hand as a separate statement of
what the parser accepts.
Why it is not obviously worth doing
- The parser works, and its contract is now tested.
StringizeRoundTripTestholds printing to being
parsing's inverse across every node type, and 2.0 fixed several node shapes that did not round-trip.
A rewrite starts that guarantee from zero. - The grammar is the specification.
Syntax.mddescribes it, butAngouriMath.gis the thing that
decides, and it is 480-odd lines of readable declarative rules. A hand-written recursive-descent
parser is more code and less obviously equivalent to a reader. - Yoakke is itself a dependency, and a small one — it would be trading a build-time dependency on a
jar for a run-time dependency on a young library, which for a package with 313k downloads is a
different kind of risk rather than less risk. - Nothing about the parser is currently a bug. The open parse issues are about what the grammar
says — precedence, notation — not about how it is produced.
What would make this decidable
- Is the round trip preserved?
StringizeRoundTripTestover every node type is the acceptance, and
it did not exist when #565 was written. - Are the error messages better? The reason to hand-write a parser is control over failure; if the
replacement's messages are no better than the translated ANTLR ones, the main benefit is only the
build simplification. - What does it cost at run time? Parsing is on the hot path for
FromString, which caches by
string precisely because it is not free. - Does
Syntax.mdstay true, and can it be generated from the new parser rather than maintained
beside it?
I have no recommendation. The four costs above are real and so are the four objections, and this is a
maintainer's call about what the library wants to own. Filed so that the reasoning survives the branch
rather than being rediscovered in another four years.
- Vorherrschende Sprache
- C#
- Sterne
- 831
- Forks
- 79
- Ø Merge
- 2 Std. 22 Min.
- Gemergte PRs (30 T.)
- 507
Entwicklungsumgebung
- Kein Dockerfile und keine Docker-Compose-Datei
- Keine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus ASC-Community/AngouriMath
-
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 30/100
ASC-Community/AngouriMath#1807 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 25/100
ASC-Community/AngouriMath#1692 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 30/100
ASC-Community/AngouriMath#1690 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 48/100
ASC-Community/AngouriMath#1689 · 5 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 35/100
ASC-Community/AngouriMath#1684 ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in ASC-Community/AngouriMath
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
stryker-mutator/stryker-net#3892 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
MobiFlight/MobiFlight-Connector#3419 ·
Maintainer antworten meist innerhalb von 1 Tag
-
documentation
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 84/100
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
Kryptos-FR/MarkView.Avalonia#105 ·
Maintainer antworten meist innerhalb von 1 Tag
-
[辞書]Offen提案 辞書
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
Maintainer antworten meist innerhalb von 1 Tag