Я пытаюсь создать грамматику antlr для разбора языка шаблонов. этот язык может быть встроен в любой текст, а границы помечены открывающими / закрывающими тегами: {{
/ }}
. Итак, действительный шаблон выглядит так:
foo {{ someVariable }} bar
Где foo
и bar
должны игнорироваться, а часть внутри тегов {{
и }}
должна быть проанализирована. Я нашел этот вопрос , который в основном имеет ответ на проблему, за исключением того, что теги - это только один {
и }
. Я попытался изменить грамматику так, чтобы она соответствовала 2 открывающим / закрывающим символам, но как только я это сделаю, правило BUFFER
потребляет ВСЕ символы, а также открывающие и закрывающие скобки. Правило LD
никогда не вызывается.
Кто-нибудь знает, почему лексер antlr потребляет все токены в правиле Buffer
, когда разделители имеют 2 символа, но не использует разделители, когда они имеют только один символ?
grammar Test;
options {
output=AST;
ASTLabelType=CommonTree;
}
@lexer::members {
private boolean insideTag = false;
}
start
: (tag | BUFFER )*
;
tag
: LD IDENT^ RD
;
LD @after {
// flip lexer the state
insideTag=true;
System.err.println("FLIPPING TAG");
} : '{{';
RD @after {
// flip the state back
insideTag=false;
} : '}}';
SPACE : (' ' | '\t' | '\r' | '\n') {$channel=HIDDEN;};
IDENT : (LETTER)*;
BUFFER : { !insideTag }?=> ~(LD | RD)+;
fragment LETTER : ('a'..'z' | 'A'..'Z');