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

问题描述:

什么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 : ["*", "'", "$", "|", "+", "(", ")", "{", "}", "/", "%", "_", "-", "\"", "#", "<", ">", "=", "&", "\\"]  > 
} 
+0

* Sees BBCode * ... * [Pukes](http://*.com/questions/3788959/regex-to-split-bbcode-into-pieces/3792262#3792262)* – NullUserException 2010-10-07 06:15:56

+0

@NullUserException:Doesn' t为我工作,我需要解析所有可能的BBCode标记人员可以输入。 – Kdeveloper 2010-10-07 12:31:29

您的语法不明确。这可能不是你的错,因为它可能很难为你正在尝试解决的问题产生一个明确的语法。

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

但是,标记器可能是有用的,并且使用堆栈来查找匹配和不匹配的标记对可能是合适的选择。

+0

我得出了同样的结论,但我发现JavaCC只是一个标记器的矫枉过正。你知道100%的Java tokenizer吗? (所以我不需要额外的构建工具?) – Kdeveloper 2010-10-07 12:34:39

前段时间我已经了解到,一些简单的问题可以很容易地在语义或词法层面上解决,而在句法层面证明是非常困难或不可能的。

注意:我对JavaCC不太熟悉,但过去我一直使用多个编译器生成器(我最喜欢的是sablecc)。

你很可能只是定义你的“内容”是这样的:

(text()|boldstart()|boldend()|invalidTag) 

凡BOLDSTART()将只是一味的输出开始标签和BOLDEND() - 结束标签。

如果要过滤掉所有这些,只生成正确结束的标签,那么我会建议为此创建某种有状态的自动机,给它打开和结束标签,注意是否应该启动粗体,停止或继续(可能包括嵌套深度),并根据输出开始,停止或没有标签。与使用JavaCC中的语法或词法分析工具相比,这将非常容易实现。

+0

谢谢,你有链接太多的例子吗?或者知道一个Java tokenizer工具? – Kdeveloper 2010-10-07 12:37:08