什么 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 : ["*", "'", "$", "|", "+", "(", ")", "{", "}", "/", "%", "_", "-", "\"", "#", "<", ">", "=", "&", "\\"] >
}
最佳答案
你的语法有歧义。这可能不是你的错,因为为你试图解决的问题生成明确的语法可能非常困难。
LL(k) 解析器可能不是这项工作的最佳工具。
但是,分词器可能很有用,使用堆栈来查找匹配和不匹配的标签对可能是一个合适的替代方案。
关于java - 如何在 JavaCC 中匹配可选的打开/关闭标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3806828/