JavaCC構文は、これらの種類の行を解析できる文法を実装します。
[b]content[/b]
content[/b]
[b]content
JavaCCパーサーはすべての行を解析する必要がありますが、正しいタグ付け動作と誤ったタグ付け動作を区別する必要があります。
正しいタグは1行目のようなもので、開始タグと終了タグがあります。タグが一致すると、太字のテキストが出力されます。
正しくないタグは、行の2と3のようなもので、一致する開始タグまたは終了タグがありません。これらが発生すると、そのまま出力に書き込まれ、タグとして解釈されません。
以下のJavaCCコードを試しました(LOOKAHEAD = 999999)。問題は、この構文は常にbold ()ではなくinvalidTag()としてすべてに一致することです。可能な限り、JavaCCパーサーがbold()と一致することを確認するにはどうすればよいですか?
String parse() :
{}
{
body() <EOF>
{ return buffer; }
}
void body() :
{}
{
(content())*
}
void content() :
{}
{
(text()|bold()|invalidTag)
}
void bold() :
{}
{
{ buffer += "<b>"; }
<BOLDSTART>(content())*<BOLDEND>
{ buffer += "</b>"; }
}
void invalidTag() :
{
}
{
<BOLDSTART> | <BOLDEND>
{ // todo: just output token
}
}
TOKEN :
{
<TEXT : (<LETTER>|<DIGIT>|<PUNCT>|<OTHER>)+ >
|<BOLDSTART : "[b]" >
|<BOLDEND : "[/b]" >
|<LETTER : ["a"-"z","A"-"Z"] >
|<DIGIT : ["0"-"9"] >
|<PUNCT : [".", ":", ",", ";", "\t", "!", "?", " "] >
|<OTHER : ["*", "'", "$", "|", "+", "(", ")", "{", "}", "/", "%", "_", "-", "\"", "#", "<", ">", "=", "&", "\\"] >
}