2010-10-10 50 views
3

虽然这个问题是关于JFlex的,但它也可能适用于其他扫描生成器,例如lex,flex。如何在JFlex上使用正则表达式捕获组?

如果我有一些规则,我怎么能在规则的一部分创建一个捕获组,并使用捕获组的结果作为参数传递给顺利通过规则匹配调用的代码?

例如,假设我有一个简单的规则来匹配SGML标签:

"<"[a-zA-Z]+">" {return new Token(Type.OPEN_TAG);} 

我怎么能捕捉到人物内心的部分([A-ZA-Z] +),并把它作为一个参数在我的令牌构造函数?

编辑:我知道我可以简单地使用yytext()来获取整个匹配的值,然后在代码中的其他地方分开部分,但似乎它会使事情比他们需要的更复杂。

回答

1

扫描仪发电机一般不支持捕获组,并说实话,我从来没有见过一个扫描器产生对他们的有效需求。在其他RegEx引擎中,您通常会使用捕获组的大部分内容在解析器中或通过操作中的一段简单代码处理得更好。

像下面这样也许应该工作。

"<"[a-zA-Z]+">" { 
        String matchedText = yytext(); 
        String label = matchedText.substring(1, matchedText.length() - 1); 
        return new Token(Type.OPEN_TAG, label); 
        } 

实施组捕获倾向于与许多由扫描仪进行发电机以降低转换表的大小最佳化的干涉。我从来没有使用JFlex,但我似乎记得有些Flex支持某些有限形式的回溯并向前/向后看,但如果使用,则会发出有关性能的警告。