我目前有一种使用 ANTLR 用 Java 实现的简单有效的语言。我想要做的是以与 PHP 类似的方式将其嵌入纯文本中。
例如:
Lorem ipsum dolor sit amet
<% print('consectetur adipiscing elit'); %>
Phasellus volutpat dignissim sapien.
我预计生成的令牌流将类似于:
CDATA OPEN PRINT OPAREN APOS STRING APOS CPAREN SEMI CLOSE CDATA
我怎样才能做到这一点,或者有更好的方法吗?
<%
对块外的内容没有限制。根据 Michael Mrozek 的回答,我假设类似的东西<% print('%>'); %>
是可能的,但在这种情况之外,<%
总是表示代码块的开始。
示例实现
我根据 Michael Mrozek 的回答中给出的想法开发了一个解决方案,使用 ANTLR 的门控语义谓词模拟 Flex 的开始条件:
lexer grammar Lexer;
@members {
boolean codeMode = false;
}
OPEN : {!codeMode}?=> '<%' { codeMode = true; } ;
CLOSE : {codeMode}?=> '%>' { codeMode = false;} ;
LPAREN : {codeMode}?=> '(';
//etc.
CHAR : {!codeMode}?=> ~('<%');
parser grammar Parser;
options {
tokenVocab = Lexer;
output = AST;
}
tokens {
VERBATIM;
}
program :
(code | verbatim)+
;
code :
OPEN statement+ CLOSE -> statement+
;
verbatim :
CHAR -> ^(VERBATIM CHAR)
;