2017-10-06 6 views
0

grammaire donné uneANTLR4: Comment analyser un noeud non root?

script: statement*; 
statement: do | check; 
do: 'do'; 
check: 'check'; 

Comment puis-je analyser un nœud non-root? En d'autres termes,

ScriptParser sp = new ScriptParser(); 
StatementContext sc = sp.parse<StatementContext>("do"); 

I simplifié l'exemple ci-dessus.

Une solution est de faire tous les nœuds nœuds racine comme

rootNode: script | statement | do | check; 

, mais je ne veux pas que ce souille ma grammaire et est un cauchemar de maintenance (à chaque fois que la grammaire ajoute/supprime un nœud, le rootNode doit être mis à jour, ce qui est source d'erreurs). Une autre solution consiste à écrire une autre grammaire dérivée avec la spécification rootnode. Cela ne polluerait pas la grammaire principale, mais a toujours le problème de maintenance.

Y a-t-il une meilleure façon de procéder? Je voudrais utiliser plusieurs de mes noeuds (classes de contexte ***) et les passer dans les constructeurs de mes classes de modèle de domaine.

+0

Quelle version ANLTR? Dans ANTLR 3, vous indiquez explicitement quel est le point d'entrée en appelant la méthode avec le nom de la règle, par ex. 'parser.script()' ou 'parser.do()'. –

+0

ANTLR4 (4.7). J'ai mis à jour le titre. – Ruudjah

+0

Est-ce que "faire" n'est pas une valeur valide de "script" dans votre grammaire? Que veux-tu précisément? Pour limiter l'analyse pour vérifier seulement si une chaîne est une "vérification" valide? –

Répondre

0

Merci @ Jiri Tousek! La réponse est en effet

ScriptParser sp = new ScriptParser(); 
StatementContext sc = sp.statement();