2011-07-30 59 views
3

Lex中的操作可以訪問各個正則表達式組嗎? (注:我猜不是,因爲組字符 - 括號 - 是根據documentation用來改變優先級的,但是如果是這樣,你推薦一個替代的C/C++掃描生成器嗎?又不是在寫我自己的詞法分析器,真的很熱)Lex中的操作可以訪問各個正則表達式組嗎?

例:

比方說,我有這樣的輸入:foo [tagName attribute="value"] bar,我要提取使用萊克斯/ Flex的標籤。我當然可以寫出這條規則:

\[[a-z]+[[:space:]]+[a-z]+=\"[a-z]+\"\]  printf("matched %s", yytext); 

但是讓我們說我想訪問字符串的某些部分,屬性,但不必再次解析yytext(因爲字符串已經被掃描過,所以再次掃描它的一部分並沒有意義)。所以這樣的事情會更好(正則表達式組):

\[[a-z]+[[:space:]]+[a-z]+=\"([a-z]+)\"\]  printf("matched attribute %s", $1); 

回答

-1

當然至少有一些他們的形式。 但是從sourceforge.org下載的默認lex/flex似乎沒有在他們的文檔中列出,並且此示例在yytext中保留了完整的字符串。

IBM's LEX documentation for AIX

(表達式) 匹配在括號中的表達。 ()(括號)運算符用於分組,並使圓括號內的表達式讀入yytext數組中。圓括號中的組可以代替任何其他模式中的任何單個字符。例如:(ab | cd +)?(ef)*與abefef,efefef,cdef或cddd等字符串匹配;但不是abc,abcd或abcdef。

1

您可以將其分開以開始條件。事情是這樣的:

%x VALUEPARSE ENDSTATE 
%% 
char string_buf[100]; 
<INITIAL>\[[a-z]+[[:space:]]+[a-z]+=\"  {BEGIN(VALUEPARSE);} 
<VALUEPARSE>([a-z]+) (strncpy(string_buf, yytext, yyleng);BEGIN(ENDSTATE);} //getting value text 
<ENDSTATE>\"\] {BEGIN(INITIAL);} 
%% 

關於替代C/C++掃描程序生成 - 我用同樣的東西QT類QRegularExpression,它可以很容易獲得正則表達式組比賽結束後。