Я использую antlr 3.1.3 и создаю цель python. Мой лексер и парсер принимают очень большие файлы. Основываясь на управляемых параметрах командной строки или динамического времени выполнения, я хотел бы сначала зафиксировать часть распознанного ввода и прекратить синтаксический анализ. Например, если мой язык состоит из заголовка и тела, а тело может иметь гигабайты токенов, и меня интересует только заголовок, я хотел бы иметь правило, которое останавливает лексер и парсер без привлечения исключения. По соображениям производительности я не хочу читать все тело.exit antlr 3 parser early without raise exception
grammar Example;
options {
language=Python;
k=2;
}
language:
header
body
EOF
;
header:
HEAD
(STRING)*
;
body:
BODY { if stopearly: help() }
(STRING)*
;
// string literals
STRING: '"'
(
'"' '"'
| NEWLINE
| ~('"'|'\n'|'\r')
)*
'"'
;
// Whitespace -- ignored
WS:
( ' '
| '\t'
| '\f'
| NEWLINE
)+ { $channel=HIDDEN }
;
HEAD: 'head';
BODY: 'body';
fragment NEWLINE: '\r' '\n' | '\r' | '\n';
это работает для простой грамматики, за исключением что это напечатано: «строка 161: 0 правило admin failed predicate: {not self.stopearly}?" У меня было больше удачи, вызвав исключение и поймав его. – moof