2010-12-03 46 views
1

Travail sur un projet de jeu impliquant un langage de script que je souhaite interpréter dans un code de machine virtuelle pouvant être exécuté directement. J'ai inclus la grammaire ci-dessous. Toutes les règles lexers s'affichent correctement dans le diagramme de syntaxe, mais lorsque je clique sur les corps de l'une des règles d'analyseur, j'obtiens "Impossible d'afficher la règle" X "car l'état de départ est introuvable" pour une règle d'analyseur donnée.AntlrWorks et erreurs de grammaire du langage

Je ne suis pas vraiment sûr pourquoi ANTLR se plaint de ne pas avoir un état de démarrage. La grammaire devrait clairement commencer à partir de la ligne de codage, qui n'est référencée par aucune autre règle d'analyseur. En outre, la case en haut à droite est verte, indiquant qu'il n'y a pas d'erreurs de syntaxe. J'ai passé en revue quelques-uns des autres messages du forum, ainsi que de nombreuses grammaires fournies dans l'exemple de téléchargement de grammaire ANTLRv3, mais aucun d'entre eux n'a de code spécial indiquant à ANTLR quelle est l'une des règles de l'analyseur. état de départ. J'ai l'impression que quelque chose de simple est brisé, mais je suis dans une impasse quant à ce que c'est exactement.

Un conseil ou une aide serait grandement apprécié! Même si c'est juste comme "allez lire ceci".

grammar RobotWarsGrammar; 



EQUAL 
options { 
    paraphrase = "="; 
} 
    : '=' 
    ; 
+0

une aide? Je ne peux toujours pas le comprendre. –

Répondre

2

En supposant que vous utilisez ANTLR 3.x.

Tout ce que:

options { 
    paraphrase = ...; 
} 

truc est (AFAIK) vieux ANTLR 2 syntaxe - essayez de le retirer.

aussi que ! dans votre comment règle:

comment 
    : !(DIGIT | LETTER | SPACE)* 
    ; 

est un arbre-rewrite-opérateur (see the cheat sheet). Mais cela ne fonctionne que lorsque vous avez:

options { 
    output=AST; 
} 

dans votre grammaire (ce qui n'est pas le cas). Supprimez donc cette règle ! de votre règle comment. Sauf si vous voulez faire correspondre le littéral !, auquel cas vous devez envelopper des guillemets simples autour d'elle:

comment 
    : '!' (DIGIT | LETTER | SPACE)* 
    ;