2010-10-10 56 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支持某些有限形式的回溯並向前/向後看,但如果使用,則會發出有關性能的警告。