Как управлять необязательными пробелами в ANTLR?
Я пытаюсь разобрать файл данных в ANTLR - он имеет необязательные пробелы на примере
3 6
97 12
15 18
ниже показано, где начинается и заканчивается линия. В конце есть новая строка, и нет вкладок.
^ 3 6$
^ 97 12$
^ 15 18$
^
моя грамматика:
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 : (' ')* ;
что дает
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)
(т. е. ведущая WS не была распознана, и последняя строка была пропущена).
Я хотел бы разобрать строки, которые начинаются без пробелы, такие как:
^12 34$
^ 23 97$
но затем я получаю такие ошибки, как:
line 1:0 required (...)+ loop did not match anything at input ' '
Я был бы признателен за общие объяснения разбора WS в ANTLR.
редактировать @jitter имеет полезный ответ -{ignore=WS}
не появляется в книге" Definitive ANTLR reference", над которой я работаю, поэтому это явно сложная область.
помощь все еще нужна Я изменил это на:
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
;
но получить ошибка:
illegal option ignore
редактировать по-видимому, это было удалено из V3: http://www.antlr.org/pipermail/antlr-interest/2007-February/019423.html
3 ответов
Регистрация лексический анализ с ANTLR а затем найдите часть, которая начинается с этого заголовка
игнорирование пробелов в лексере
вам нужно использовать { ignore=WS; }
правила
мне удалось заставить это работать, используя конструкции lexer, такие как:
WS : (' ')+ {skip();};
WSOPT : (' ')* {skip();};
но не в новой строке. Затем в синтаксическом анализаторе строятся такие конструкции, как:
num1 num2 NEWLINE;
ключ должен был удалить все WS в лексере, кроме новой строки.