我正在尝试使用 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]
。
这适用于 lexing ThisIsNotAWikiWord
,但它通常会破坏 lexing WikiWords。当 lexing 时WikiWord
,前瞻没有额外的字符,所以它不匹配。
我想我想要一个可选的前瞻。如果在此之后有一个字符,那么最好不要成为其中之一。但如果输入中没有其他字符,让我们匹配。
文档让我相信这是不可能的,但我希望这只是我缺乏正则表达式。从文档:
在词法规则中,正则表达式 r 可以后跟一个前瞻表达式。前瞻表达式可以是“$”(行尾运算符)或“/”后跟任意正则表达式。在这两种情况下,前瞻都不会被消耗,也不会包含在匹配的文本区域中,但在确定哪个规则具有最长匹配时会考虑它(另请参见 4.3.3 如何匹配输入)。
在 '$' 的情况下, r 仅在输入的行尾匹配。行尾由正则表达式 \r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085 表示。所以a$等价于a / \r|\n|\r\n|\u2028|\u2029|\u000B|\u000C|\u0085。这与[5]中描述的情况有点不同:因为在JFlex $ 是一个真正的尾随上下文,文件结尾不计为行尾。