0

Flex を使用して簡単なスキャナーを作成しようとしています。宣言セクションで、{-} 演算子を使用して ID から予約語を除外しようとしていますが、うまくいきません。私が見つけたすべての例では、次のコードのように {+} および {-} 演算子を使用しています。

    [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}

それを機能させる方法はありますか?これらの演算子は角括弧なしで使用できますか?

4

1 に答える 1

0

{-}and演算子は、完全な正規表現や文字列ではなく、{+}などの文字クラスでのみ機能します。は、より一般的な演算子をサポートしていません。もちろん、より一般的なバージョンは. 特定の問題は、一般に、2 つのパターンが同じ文字列に一致する場合、最初のパターンが使用されるという事実によって解決されます。したがって、仕様を次のように変更すると、実際には s からすべてのキーワードが除外されます。[a-z]flex{-}{+}|ID

%%
"char"|"else"|"if"|"class"|"new"|"return"|"void"|"while"|"int"  { return KEYWORD; }
[a-zA-Z_][a-zA-Z0-9_]*   { return ID; }
%%
于 2013-06-23T16:31:32.407 に答える