我想構建一個antlr語法來解析模板語言。該語言可以嵌入任何文本中,並且邊界標記爲打開/關閉標記:{{
/}}
。因此,一個有效的模板看起來是這樣的:在antlr3語法中切換詞法分析器狀態
foo {{ someVariable }} bar
凡foo
和bar
應該被忽略,{{
和}}
標籤內的部分應被解析。我發現this question基本上有問題的答案,除了標籤只有一個{
和}
。我試圖修改語法來匹配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');
請注意'IDENT:(LETTER)*;'(might)會導致詞法分析器進入一個無限循環。 Lexer規則_必須總是匹配至少1個字符。 – 2012-01-01 16:12:13