나는 templl 언어를 구문 분석하기위한 antlr 문법을 구성하려고합니다. 해당 언어는 모든 텍스트에 포함될 수 있으며 경계는 열기/닫기 태그 ({{
/}}
)로 표시됩니다.antlr3 문법의 렉서 상태 전환
foo {{ someVariable }} bar
하는 foo
및 bar
이 무시해야하는 경우, 그리고 {{
및 }}
태그 내부의 부분은 해석되어야한다 그래서 유효한 템플릿은 다음과 같습니다. 나는 {
과 }
이라는 태그를 제외하고 기본적으로 문제에 대한 해답을 가지고있는 this question을 찾았다. 2 개의 여는/닫는 문자와 일치하도록 문법을 수정하려고 시도했지만이 작업을 수행하자마자 BUFFER
규칙은 모든 문자와 여는 괄호 및 닫는 괄호를 사용합니다. LD
규칙이 호출되지 않습니다.
구분 기호에 2자를 사용할 때 antlr 렉서가 Buffer
규칙에서 모든 토큰을 사용하지만 한 문자 만있는 경우 구분 기호를 사용하지 않는 이유는 누구에게 있습니까? 당신은 괄호 (...)+
(데모의 BUFFER
규칙 참조) 내부 술어를 포함하여 앞서 {{
이 나타날 때까지
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) *;'(아마도)하면 렉서가 무한 루프에 빠질 수 있습니다. 렉서 규칙 _ 반드시 _ 적어도 하나의 문자와 일치해야합니다. –