如何匹配JavaCC中的可选开/关标签?

Kde*_*per 4 java parsing javacc bbcode

什么JavaCC语法实现了可以解析这些行的语法:

[b]content[/b]
content[/b]
[b]content
Run Code Online (Sandbox Code Playgroud)

尽管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 : ["*", "'", "$", "|", "+", "(", ")", "{", "}", "/", "%", "_", "-", "\"", "#", "<", ">", "=", "&", "\\"]     >
}
Run Code Online (Sandbox Code Playgroud)

jam*_*esh 5

你的语法含糊不清.这可能不是你的错,因为对于你想要解决的问题,可能很难产生明确的语法.

LL(k)解析器可能不是这项工作的最佳工具.

然而,令牌化器可能是有用的,并且使用堆栈来找到匹配和不匹配的标签对可能是合适的替代方案.