JavaCC语法如何实现可以解析这些类型的行:
[b]content[/b]
content[/b]
[b]content
尽管JavaCC解析器需要解析所有行,但是它必须区分正确和不正确的标记行为。
正确的标记类似于第一行,它们具有开放和关闭标记。当标记匹配时,将输出加粗格式文本。
不正确的标记类似于第2和第3行,它们没有匹配的开放或关闭标记。当出现这些情况时,它们会按原样写入输出,并且不会被解释为标记。
我尝试了下面的JavaCC代码(LOOKAHEAD = 999999)。问题在于,这个语法将始终将所有内容匹配为invalidTag()而不是bold()。如何确保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 : ["*", "'", "$", "|", "+", "(", ")", "{", "}", "/", "%", "_", "-", "\"", "#", "<", ">", "=", "&", "\\"] >
}