I am trying to parse a data file in ANTLR - it has optional spaces, illustrated
3 6 97 12 15 18
The following shows where the line begins and ends. At the end there is a new line and no tabs.
^ 3 6$ ^ 97 12$ ^ 15 18$ ^
My grammar:
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 : (' ')* ;
which gives
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)
(i.e., the leading WS was not recognized and the last line was skipped).
I would like to parse lines that start without spaces, for example:
^12 34$ ^ 23 97$
but I get errors like:
line 1:0 required (...)+ loop did not match anything at input ' '
I would appreciate a general explanation of WS parsing in ANTLR.
EDIT @jitter has a useful answer - {ignore=WS} does not appear in the Defining ANTLR Link book I am working on, so this is clearly a complex area.
HELP still needed I changed this to:
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 ;
but get an error:
illegal option ignore
EDIT , obviously this has been removed from V3: http://www.antlr.org/pipermail/antlr-interest/2007-February/019423.html
java whitespace antlr
peter.murray.rust
source share