如何匹配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 : ["*", "'", "$", "|", "+", "(", ")", "{", "}", "/", "%", "_", "-", "\"", "#", "<", ">", "=", "&", "\\"] >
}
您的语法不明确。这可能不是你的错,因为它可能很难为你正在尝试解决的问题产生一个明确的语法。
LL(k)解析器可能不是这份工作的最佳工具。
但是,标记器可能是有用的,并且使用堆栈来查找匹配和不匹配的标记对可能是合适的选择。
我得出了同样的结论,但我发现JavaCC只是一个标记器的矫枉过正。你知道100%的Java tokenizer吗? (所以我不需要额外的构建工具?) – Kdeveloper 2010-10-07 12:34:39
前段时间我已经了解到,一些简单的问题可以很容易地在语义或词法层面上解决,而在句法层面证明是非常困难或不可能的。
注意:我对JavaCC不太熟悉,但过去我一直使用多个编译器生成器(我最喜欢的是sablecc)。
你很可能只是定义你的“内容”是这样的:
(text()|boldstart()|boldend()|invalidTag)
凡BOLDSTART()将只是一味的输出开始标签和BOLDEND() - 结束标签。
如果要过滤掉所有这些,只生成正确结束的标签,那么我会建议为此创建某种有状态的自动机,给它打开和结束标签,注意是否应该启动粗体,停止或继续(可能包括嵌套深度),并根据输出开始,停止或没有标签。与使用JavaCC中的语法或词法分析工具相比,这将非常容易实现。
谢谢,你有链接太多的例子吗?或者知道一个Java tokenizer工具? – Kdeveloper 2010-10-07 12:37:08
* Sees BBCode * ... * [Pukes](http://stackoverflow.com/questions/3788959/regex-to-split-bbcode-into-pieces/3792262#3792262)* – NullUserException 2010-10-07 06:15:56
@NullUserException:Doesn' t为我工作,我需要解析所有可能的BBCode标记人员可以输入。 – Kdeveloper 2010-10-07 12:31:29