В настоящее время у меня есть рабочий, простой язык, реализованный на 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
Как я могу этого добиться или есть способ лучше?
Нет никаких ограничений на то, что может находиться за пределами блока <%
. Я предположил, что что-то вроде <% print('%>'); %>
, согласно ответу Майкла Мрозека, возможно, но вне такой ситуации <%
всегда будет указывать на начало блока кода.
Пример реализации
Я разработал решение, основанное на идеях, приведенных в ответе Майкла Мрозека, имитируя условия запуска Flex с использованием стробированных семантических предикатов ANTLR:
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)
;
<%
и%>
, игнорируя все остальное? - person Bart Kiers   schedule 09.05.2010<%
и%>
, или это может принимать любую форму? Могут ли комментарии появляться вне их (потенциально они могут содержать<%
или%>
)? - person Bart Kiers   schedule 10.05.2010<%
. Я предположил, что что-то вроде<% print('%>'); %>
, согласно ответу Майкла Мрозека, было бы возможно, но вне такой ситуации<%
всегда будет указывать на начало блока кода. - person etheros   schedule 10.05.2010