2013-06-23 43 views
0

我正在嘗試使用Flex製作簡單的掃描器。在聲明部分,我試圖使用{ - }運算符從id中排除保留字,但我無法使其工作。我發現每例使用{+}和{ - }運營商如下面的代碼:Flex(詞法分析器){+}和{ - }運算符

[a-z]{-}[d] 

不過,我想使用這些運營商如下面的代碼,但我總是得到錯誤:

invalid_id "char"|"else"|"if"|"class"|"new"|"return"|"void"|"while"|"int" 
    all_ids  [a-zA-Z_][a-zA-Z0-9_]* 
    id   {all_ids}{-}{invalid_id} 

有什麼辦法可以使它工作嗎?這些操作員可以不用方括號嗎?

回答

0

{-}{+}運算符只處理像[a-z]這樣的字符類,而不是完整的正則表達式或字符串。 flex不支持更通用的{-}運算符。 {+}的更一般版本當然是|。一般來說,如果兩個模式匹配相同的字符串,則會解決您的特定問題,那麼將使用第一個模式。因此,將您的規格更改爲以下內容實際上會排除ID中的所有關鍵字。

%% 
"char"|"else"|"if"|"class"|"new"|"return"|"void"|"while"|"int" { return KEYWORD; } 
[a-zA-Z_][a-zA-Z0-9_]* { return ID; } 
%%