我在为某种类型的令牌构建一个具有积极前瞻性断言的flex规则时遇到了一些麻烦,可能需要一些帮助。我肯定我在这里错过了一些简单的东西。
我想匹配的令牌字符串如下所示:
33-abc-13/12
99-ab-33
o3sehh04/00
glu6-840d/00
vm-22hd
xyz-3要匹配的令牌对象是包含letters and digits的字符串,并且具有slashes and/or hyphens,这是一种罕见的情况a dot,可能类似于xx-3006/10.00。
不能匹配的(因为其他规则涵盖了这些情况)是标记,例如:
numeric370
hyphen-term
plainterm
00/40到目前为止,我尝试的是这条向前看的规则:
([a-z0-9/-]*)/[-/]+[0-9/-]+有了以上,我得到了接近我想要达到的结果。它匹配以上列出的所有字符串,但跳过最后一个字符或数字。匹配的令牌如下所示:
33-abc-13/1
o3sehh04/0
...不幸的是,该规则还与00/40匹配(结果是00/4)。
所以我的问题是我在这里错过了什么?如果可能并且足够快的话,最好用一条规则来覆盖这些情况。我知道在lexer脚本中处理规则的顺序,因此该规则的位置将是整个集合中第一批规则之一。如果不可能,也许对这一规则进行细分将是另一种方式。
在这个项目中,我使用RE (https://github.com/Genivia/RE-flex),因为它涵盖了flex接口,并提供了unicode (我需要处理wchar_t字符串)。我的lexer是一个带有令牌分类的空格标记器,它基本上是几年前构建在flex 2.5包上的。我在令牌处理中重构了一些东西,并移到了re,因为它给了我更多的机会。令牌程序输入字符串是简短的简单文本片段,它们不超过250-300个字符的长度。到目前为止背景。
注意:在为lexer转换规则之前,我使用regex101.com在构建规则时进行检查/实验。走到正确的方向有点帮助,但仅此而已。
任何帮助都是非常感谢的,谢谢您的努力!
更新:基于rici的答案的最后的模式现在如下所示:
[a-z0-9/.-]*[/.-][0-9/-]+这还包括包含.的令牌,例如
xx33-4.00
f/44-7.87
...在我下面的评论中,考虑到句子分隔符的问题,在模式的最后一个字符组中只是一个.。我删除了它,现在它按预期工作了。
发布于 2017-06-13 02:04:06
我对RE-flex一无所知(虽然它看起来很酷),但假设它确实与flex兼容,那么同样的方法应该会奏效:忘记前向查找断言(因为匹配的字符串不包括查找模式,所以您希望匹配整个字符串),并在所有可能匹配相同内容的其他规则之后将规则放在一起。
弹性规则是:
例如,假设您有模式:
[0-9]+("/"[0-9]+)* { return SLASHED_NUMBERS; }
[a-z0-9/-]*[/-][0-9/-]+ { return GENERAL_TOKEN; }注1
这两个标记都将与00/40匹配,因此如果这是输入点上的令牌,则该令牌将被检测为SLASHED_NUMBERS (文件中的第一个规则)。另一方面,如果您有00/49-23,它将被检测为GENERAL_TOKEN,因为该规则匹配更多的字符。
备注
https://stackoverflow.com/questions/44510775
复制相似问题