2010-07-06 16 views
2

£ Quand je lance le Grammer suivant: "test"

test : WORD+; 

WORD : ('a'..'z')+; 
WS : ' '+ {$channel = HIDDEN;}; 

et je donne l'entrée pourquoi antlr accepte cela comme entrée valide? Je pensais que le ('a' .. 'z') correspondrait seulement aux caractères dans l'alphabet minuscule?

+1

Je pensais aussi que. Êtes-vous sûr ? Êtes-vous en train de dire que "? Test" est analysé comme un jeton WORD? – leonbloy

+0

Oui, c'est ce qui se passe. J'utilise l'IDE antlr3 pour eclipse pour le tester ... –

Répondre

3

ANTLR produit-il une erreur lors de l'analyse de la chaîne d'entrée ?test avec la grammaire que vous avez publiée. Comme c'est généralement le cas, l'erreur réside dans l'utilisation de l'outil autour d'ANTLR (je le vois aussi avec ANTLRWorks, malheureusement!).

Pour tester vous-même (correctement), créez un fichier Test.g:

grammar Test; 

test : WORD+; 

WORD : ('a'..'z')+; 

WS : ' '+ {$channel = HIDDEN;}; 

et un fichier Main.java:

import org.antlr.runtime.*; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     ANTLRStringStream in = new ANTLRStringStream("?test"); 
     TestLexer lexer = new TestLexer(in); 
     CommonTokenStream tokens = new CommonTokenStream(lexer); 
     TestParser parser = new TestParser(tokens); 
     parser.test(); 
    } 
} 

et télécharger une copie du ANTLR 3.2 JAR dans le même répertoire.

maintenant générer un analyseur lexer &:

java -cp antlr-3.2.jar org.antlr.Tool Test.g 

compiler tous les fichiers source Java:

javac -cp antlr-3.2.jar *.java 

et exécuter la classe principale:

java -cp .:antlr-3.2.jar Main 

(remplacer le : avec ; si vous êtes sous Windows)

qui produira le message d'erreur suivant:

line 1:0 no viable alternative at character '?'