G'day!Comment puis-je construire une grammaire Python propre dans ANTLR?
Comment puis-je construire une simple syntaxe ANTLR gérant des expressions multilignes sans avoir besoin de points-virgules ou de barres obliques inverses?
Je suis en train d'écrire un simple DSLs pour les expressions:
# sh style comments
ThisValue = 1
ThatValue = ThisValue * 2
ThisOtherValue = (1 + 2 + ThisValue * ThatValue)
YetAnotherValue = MAX(ThisOtherValue, ThatValue)
Dans l'ensemble, je veux que mon application pour fournir le script avec quelques valeurs initiales nommées et tirer le résultat final. Je me suis accroché à la syntaxe, cependant. Je voudrais prendre en charge plusieurs expressions de ligne comme ce qui suit:
# Note: no backslashes required to continue expression, as we're in brackets
# Note: no semicolon required at end of expression, either
ThisValueWithAReallyLongName = (ThisOtherValueWithASimilarlyLongName
+AnotherValueWithAGratuitouslyLongName)
J'ai commencé avec une grammaire ANTLR comme ceci:
exprlist
: (assignment_statement | empty_line)* EOF!
;
assignment_statement
: assignment NL!?
;
empty_line
: NL;
assignment
: ID '=' expr
;
// ... and so on
Il semble simple, mais je suis déjà en difficulté avec le : les nouvelles lignes
warning(200): StackOverflowQuestion.g:11:20: Decision can match input such as "NL" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
Graphiquement, en org.antlr.works.IDE:
J'ai botté la grammaire autour, mais finissent toujours avec des violations de comportement attendu:
- Une nouvelle ligne est nécessaire à la fin du fichier
- Les lignes vides sont acceptables
- Tout ce qui se trouve dans une ligne à partir de la dièse est annulé en tant que commentaire
- Les affectations se terminent par la fin de la ligne, et non par des points-virgules.
- Les expressions peuvent s'étendre sur plusieurs lignes si elles sont entourées entre parenthèses ets
Je peux trouver des exemples de grammaires ANTLR avec plusieurs de ces caractéristiques. Je trouve que lorsque je les coupe pour limiter leur expressivité à ce dont j'ai besoin, je finis par casser quelque chose. D'autres sont trop simples, et je les casse à mesure que j'ajoute de l'expressivité.
Quel angle dois-je prendre avec cette grammaire? Pouvez-vous pointer vers des exemples qui ne sont pas des langages triviaux ou complets?
Maintenant, je dois comprendre comment obtenir le tokenizer pour faire ce lourd levage. Retour à la documentation, je suppose. :) –
John, ça me échappe toujours. Quelle est la syntaxe grammaticale ANTLR pour que le tokenizer insère NL avant EOF? –
+1 Pour toujours terminer sur une nouvelle ligne, rend les choses tellement plus propres. Merci. – Craz