regex JFlex RE匹配前瞻和优先级

ubof19bj  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(133)

对于XML解析,我需要区分“name”后面跟“::“(可能在空格之后)、后面跟“(“(可能在空格之后)或后面都不跟的情况下的标记类型。
在JLex中,我们使用一个在yy_* 缓冲区中提前读取的例程来实现这一点,但这在JFlex中没有公开,并且lookahead RE应该是一个比手工编写的lookahead更干净的解决方案。
不幸的是,我的第一次尝试并没有像预期的那样工作;它落入第三类(独立名称)的频率比我预期的要高。
我尝试的是下面的模式,其中“自我”是我试图区分两种情况的东西。请原谅“GONK_”--这是我调试 Package 器的惯例。 Package 的newSymbol()本身就是new Symbol()的 Package 器,它有一个副作用;不好意思

"self/\s*::"       { return GONK_newSymbol(sym.SELF); }
"self/\s*[(]"      { return GONK_newSymbol(sym.SELF); }
"self"             { return GONK_newSymbol(sym.QNAME,yytext()); }

据我所知,JFlex的RE规则是“最长的比赛胜利,打破有利于第一场比赛的关系”,所以我希望lookaheads优先。但是在GONK_ functions中放置一个跟踪函数告诉我,几乎总是采用第三种情况(sym.QNAME)。
我知道我的错误很明显,我也很清楚,但是...我错过了什么?

py49o6xq

py49o6xq1#

找到了。除了字面量之外,不应该引用RE语法(以强调它们是字面量)。

"child"/\s*"::"    { return GONK_newSymbol(sym.CHILD); }
"child"/\s*[(]     { return GONK_newSymbol(sym.CHILD); }
"child"            { return GONK_newSymbol(sym.QNAME,yytext()); }

我就知道我正看着它。
这里留下这个问题,因为我在其他地方没有找到使用JFlex lookahead的好例子。

相关问题