【发布时间】:2012-07-30 04:48:34
【问题描述】:
我正在尝试使用 JFlex 为 Fitnesse 编写词法分析器,但在使用 WikiWords 时遇到了问题 (http://fitnesse.org/FitNesse.UserGuide.WikiWord)
我复制了链接的正则表达式,并使用以下正则表达式作为标记:
. # Regular character
[A-Z]([a-z0-9]+[A-Z][a-z0-9]*)+ # WikiWord
不过,我无法正确地对 ThisIsNotAWikiWord 进行词法分析。它连续有 2 个大写字母,因此不应将其视为常规单词。所以我需要添加一个前瞻来检查下一个字符是字母还是数字。类似于[A-Z]([a-z0-9]+[A-Z][a-z0-9]*)+ / [^A-Za-z0-9]。
这对于 ThisIsNotAWikiWord 的词法分析很有效,但它通常会破坏 WikiWords 的词法分析。在对WikiWord 进行词法分析时,前瞻没有多余的字符,因此不匹配。
我想我想要一个可选的前瞻。如果在此之后有一个字符,那么最好不要成为其中之一。但如果输入中没有其他字符,我们就匹配吧。
文档让我相信这是不可能的,但我希望这只是我缺乏 regex-fu。来自文档:
在词法规则中,正则表达式 r 可以后跟前瞻表达式。前瞻表达式是“$”(行尾运算符)或“/”后跟任意正则表达式。在这两种情况下,前瞻都不会被消耗,也不会包含在匹配的文本区域中,但在确定哪个规则具有最长匹配时会考虑它(另请参阅 4.3.3 如何匹配输入)。
在“$”的情况下,r 只匹配输入中一行的末尾。行尾由正则表达式 \r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085 表示。所以 a$ 等价于 / \r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085。这与 [5] 中描述的情况有点不同:因为在JFlex $ 是一个真正的尾随上下文,文件结尾不计为行尾。
【问题讨论】: