【问题标题】:Why does my JavaCC parser not parse tokens smaller than 2 characters?为什么我的 JavaCC 解析器不解析小于 2 个字符的标记?
【发布时间】:2010-09-24 22:02:40
【问题描述】:

我正在开发一个可以解析 BBcodes 的 JavaCC 解析器。

我的 Javacc 源代码:patebin.com(Junit 测试:here

源代码有点用,但它不想接受带有单个字符的标记,只能识别多字符串。

它会解析这个字符串:

"test[b]bold[/b]nothing[b]bold[/b]after"

但不是:

"t[b]bold[/b]nothing[b]bold[/b]after"

我有点迷路了,欢迎在这里提供任何提示。

【问题讨论】:

  • 虽然这很可能无法解决您的问题,但我注意到在您的语法中您已将 TEXT 设置为 (<LETTER>|<DIGIT>|<PUNCT>|<OTHER>)*。这不应该是(<LETTER>|<DIGIT>|<PUNCT>|<OTHER>)+,因为缺少文本不是文本(除非这是故意的)?
  • @Paul,你是对的。我把它改回“+”,因为我最初用“+”而不是“*”,这只是一个绝望的举动,看看它是否会改变行为。顺便说一句,它确实没有帮助。
  • 我不熟悉 JavaCC 语法,但查看 content() 部分,LOOKAHEAD(2)text() 之前有什么意义吗?我猜它应该是LOOKAHEAD(1) 或者不在那里。
  • 谢谢杰夫。你是对的,它不需要(不再需要)。但这并没有解决我的问题。解析器仍然不匹配单个字符标记...
  • 我倾向于认为body() 部分有问题。就我个人而言,我写出了所有扩展的语法规则,只是感觉* 可能会引起一些冲突。您是否尝试过只解析像"t" 这样的单个字符串?还有上一步,两个字符串?

标签: java parsing bbcode javacc


【解决方案1】:

我想通了。下载 JavaCC 并编译所有内容。单字符输入,输出为:

字符串:t 长度:1 调用:解析 称呼:身体 返回:身体 返回:解析 线程“主”ParseException 中的异常:在行遇到“”t“” 1,第 1 列。 期待其中之一: “[b]”... “[一世]” ... “[你]” ... “[s]”…… “[网址]” ... “[网址=”... “[图片]” ... “[引用]” ... “[代码]” ... “[颜色=”... “[br]” ... ... ... ...

我注意到它找到了一个 <LETTER> 令牌,但没有将其识别为 <TEXT>

这就是问题所在。您已将所有内容声明为标记,并且根据标记定义的顺序,字符串"t" 首先是<LETTER>,而不是<TEXT>。在<TEXT> 之后移动<LETTER> 令牌,它现在应该可以工作了。您需要对 <DIGIT>s 和其他此类令牌应用相同的更改。

【讨论】:

  • 杰夫,感谢您所做的一切!我认为给出的错误不是描述性的,所以我没有包括它。原来,我只是没有得到它。我保证,下次我总是包含错误消息。再次感谢,太好了!
猜你喜欢
  • 2016-08-07
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多