我目前已经在Java中使用ANTLR实现了一种简单的编程语言。我想要的是将其嵌入到纯文本中,类似于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)
;
<%
和%>
之间的部分标记化,忽略其他所有内容? - Bart Kiers<%
和%>
之外是否有任何限制,或者它可以采取任何形式?注释是否可以出现在它们之外(可能包含<%
或%>
)? - Bart Kiers<%
块外面可以是任何内容,我假设像 Michael Mrozek 的回答中所说的<% print('%>'); %>
这样的语句是可能的,但在这种情况之外,<%
总是表示代码块的开始。 - etheros