Sto cercando di analizzare un file di dati in ANTLR - ha spazi opzionale esemplificato daCome si gestiscono spazi bianchi opzionali in ANTLR?
3 6
97 12
15 18
Quanto segue mostra dove la linea inizia e finisce sono. C'è una nuova riga alla fine e non ci sono tabulazioni.
^ 3 6$
^ 97 12$
^ 15 18$
^
mia grammatica è:
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 : (' ')* ;
che dà
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)
(vale a dire il principale WS non è stato riconosciuto e l'ultima riga è stata persa).
vorrei analizzare le linee che partono senza spazi, come ad esempio:
^12 34$
^ 23 97$
ma ho quindi ottenere errori come:
line 1:0 required (...)+ loop did not match anything at input ' '
Apprezzerei spiegazioni generali di analisi WS in ANTLR.
EDIT @jitter ha una soluzione utile - {ignore=WS}
non compare nel libro "definitivo di riferimento ANTLR" che sto lavorando da così è chiaramente una zona difficile.
AIUTO ancora necessaria Ho modificato questo per:
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
;
ma ottenere l'errore:
illegal option ignore
EDIT a quanto pare questo è stato rimosso dal V3: http://www.antlr.org/pipermail/antlr-interest/2007-February/019423.html
+1, ho avuto lo stesso problema e ho finito con l'utilizzo di un importante hack del parser di limone. Seguendo questo con interesse. –
@tinkertim Grazie - è sempre bello sapere che la domanda non è completa. –