私は現在、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('%>'); %>
が可能であると思いましたが、そのような状況以外では、<%
常にコードブロックの開始を示します。
サンプル実装
私はMichaelMrozekの回答で与えられたアイデアに基づいてソリューションを開発し、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)
;