java - 如何在 JavaCC 中匹配可选的打开/关闭标签?

标签 java parsing bbcode javacc

什么 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/

相关文章:

c# - Double.TryParse 或 Convert.ToDouble - 哪个更快更安全?

java - 在另一个线程中更新 JScrollPane 中的表

Java 1.7 覆盖 hashCode() 的行为不像我预期的那样

Java:在静态方法中从父类(super class)创建子类的实例

parsing - 在 Eclipse 中使用 CDT 解析器(如何制作项目?)

javascript - 如何使用正则表达式将 Slack URL 转换为 BB 代码?

java - 定制表的通用设计

java - 解析不完整的 Java 源代码

javascript - 如何使用 jQuery 更改 CKEditor 文本?

javascript - PHP preg_replace 到 JavaScript | BB代码