对于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)。
我知道我的错误很明显,我也很清楚,但是...我错过了什么?
1条答案
按热度按时间py49o6xq1#
找到了。除了字面量之外,不应该引用RE语法(以强调它们是字面量)。
我就知道我正看着它。
这里留下这个问题,因为我在其他地方没有找到使用JFlex lookahead的好例子。