Comment puis-je gérer des espaces facultatifs dans ANTLR?
Je suis en train d'analyser un fichier de données dans ANTLR - il a des espaces facultatifs illustré par
3 6
97 12
15 18
Le montre l'exemple suivant où la ligne de début et de fin sont. Il y a un saut de ligne à la fin et il n'y a pas d'onglets.
^ 3 6$
^ 97 12$
^ 15 18$
^
Ma grammaire est:
lines : line+;
line : ws1 {System.out.println("WSOPT :"+$ws1.text+":");}
num1 {System.out.println("NUM1 "+$num1.text);}
ws2 {System.out.println("WS :"+$ws2.text+":");}
num2 {System.out.println("NUM2 "+$num2.text);}
NEWLINE
;
num1 : INT ;
num2 : INT ;
ws1 : WSOPT;
ws2 : WS;
INT : '0'..'9'+;
NEWLINE : '\r'? '\n';
//WS : (' '|'\t' )+ ;
WS : (' ')+ ;
WSOPT : (' ')* ;
qui donne
line 1:0 mismatched input ' ' expecting WSOPT
WSOPT :null:
NUM1 3
WS : :
NUM2 6
line 2:0 mismatched input ' ' expecting WSOPT
WSOPT :null:
NUM1 97
WS : :
NUM2 12
BUILD SUCCESSFUL (total time: 1 second)
(c'est à dire le premier WS n'a pas été reconnue et que la dernière ligne a été oubliée).
Je voudrais analyser les lignes qui commencent sans les espaces, tels que:
^12 34$
^ 23 97$
mais je puis faire des erreurs telles que:
line 1:0 required (...)+ loop did not match anything at input ' '
J'apprécierais des explications générales de l'analyse de WS dans ANTLR.
MODIFIER @gigue a une réponse utile - {ignore=WS}
n'apparaît pas dans la version "Définitive ANTLR de référence" le livre que je suis en train de travailler de sorte qu'il est clairement un délicat.
AIDER encore nécessaires
J'ai modifié cela:
lines : line line line;
line
options { ignore=WS; }
:
ws1 {System.out.println("WSOPT :"+$ws1.text+":");}
num1 {System.out.println("NUM1 "+$num1.text);}
ws2 {System.out.println("WS :"+$ws2.text+":");}
num2 {System.out.println("NUM2 "+$num2.text);}
NEWLINE
;
mais l'erreur:
illegal option ignore
MODIFIER apparemment, cela a été supprimé à partir de la V3:
http://www.antlr.org/pipermail/antlr-interest/2007-February/019423.html
- +1, j'ai eu le même problème et a fini à l'aide de l'un des principaux hack de citron, de l'analyseur. Suite à cela avec intérêt.
- Merci - c'est toujours agréable de savoir que la question n'est pas factice.
Vous devez vous connecter pour publier un commentaire.
Vérifier L'Analyse lexicale avec ANTLR puis rechercher dans la partie qui commence avec cette rubrique
En ignorant les espaces dans le lexer
Vous devez utiliser le
{ ignore=WS; }
règleJ'ai réussi à obtenir ce travail à l'aide de lexer des constructions telles que:
mais pas dans le retour à la ligne. Puis dans l'analyseur de constructions comme:
La clé était de dépouiller tous les WS dans le lexer, sauf le retour à la ligne.