2009-10-31 19 views
6

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

+0

+1, ho avuto lo stesso problema e ho finito con l'utilizzo di un importante hack del parser di limone. Seguendo questo con interesse. –

+0

@tinkertim Grazie - è sempre bello sapere che la domanda non è completa. –

risposta

0

sono riuscito a ottenere questo lavoro utilizzando lexer costrutti quali:

WS : (' ')+ {skip();}; 

WSOPT :  (' ')* {skip();}; 

ma non nella NEWLINE. Poi nei costrutti parser quali:

num1 num2 NEWLINE; 

La chiave era mettere a nudo tutte le WS nel lexer tranne il ritorno a capo.

2

Verifica Lexical Analysis with ANTLR e quindi cercare la parte che inizia con questa voce

Ignorando gli spazi bianchi nel lexer

È necessario utilizzare la regola { ignore=WS; }

+0

Grazie - Proverò questo e riferirò. FWIW ci sono casi in cui anche la formattazione esatta è importante, quindi spero di poter passare. –

+0

** MODIFICA ** Sembra che questo non sia disponibile in V3 –

8
WS : (' ' | '\t')+ 
    {$channel = HIDDEN;} 
    ; 
+1

Versione antlr4: WS: ('' | '\ t') + -> canale (HIDDEN); –