1

スクリプト言語の解析を書いています。

stringsintegersおよびを認識する必要がありfloatsます。

次のルールで文字列を正常に認識しました。

[a-zA-Z0-9_]+ {return STRING;}

しかし、整数と浮動小数点数の認識に問題があります。これらは私が書いた(間違った)ルールです:

["+"|"-"][1-9]{DIGIT}*  { return INTEGER;}
["+"|"-"]["0." | [1-9]{DIGIT}*"."]{DIGIT}+ {return FLOAT;}

どうすれば修正できますか?

さらに、" abc123abc " は有効な文字列であるため、文字列 (" ") と整数 (" ")の連結としてではなく、文字列として認識されるようにするにはどうすればよい123ですか?

4

1 に答える 1

4

最初の問題: と の間に違いが(...)あり[...]ます。間違った句読点を使用しているため、正規表現が思ったとおりに動作しません。

それ以上:

  1. を認識する数値規則はありません0

  2. どちらの数値規則にも、明示的な符号が必要です。

  3. STRING ルールは整数を認識します。

だから、始めるために:

[...]個々の文字または文字範囲のセットを囲みます。セットのメンバーである単一の文字に一致します。

(...)正規表現を囲みます。括弧は、数学のようにグループ化に使用されます。

"..."個々の文字のシーケンスを囲み、それらの文字と正確に一致します。

それを踏まえた上で見ていきましょう

["+"|"-"][1-9]{DIGIT}*

最初のブラケット式["+"|"-"]は、個々の文字または範囲のセットです。この場合、セットには次のものが含まれます: "+"(これも、セットには各メンバーのインスタンスが 0 個または 1 個含まれているため効果はありません)、|、および範囲"- "。には"、すでにセットにある文字 が含まれます。つまり、 に相当しました["+|]。これらの 3 つの文字のいずれかに一致します。実際には、これらの 3 つの文字のいずれかが必要です。

2 番目のブラケット式[1-9]は、範囲内の 1 文字に一致する1-9ため、おそらく期待どおりに機能します。繰り返しますが、これは正確に 1 文字に一致します。

最後に{DIGIT}、 name の展開に一致しDIGITます。私はあなたが定義を持っていると仮定します:

DIGIT   [0-9]

定義セクションのどこかに。(ついでに言うと、文字クラスを使用するだけで[:digit:]、明確であり、それを定義する必要はありませんでした。) の後に a が続きます。これ*は、の 0 回以上の繰り返しに一致することを意味します。{DIGIT}意味。

次に、そのパターンに一致する文字列の例:

|42

そして、そのパターンに一致しない文字列の例:

-7   # The pattern must start with |, + or "
42   # Again, the pattern must start with |, + or "
+0   # The character following the + must be in the range [0-9] 

同様に、float パターンは、[...]式が単純化されると、次のようになります (より明確にするために、個々の部分を 1 行に 1 つずつ書き出します)。

["+|]      # i.e. the set " + |
["0.|[1-9] # i.e. the set " 0 | [ 1 2 3 4 5 6 7 8 9
{DIGIT}*   # Any number of digits
"."        # A single period
]          # A single ]
{DIGIT}+   # one or more digits

したがって、可能な一致は次のとおりです。

"..]3

自分で解決策を作成することでより多くのメリットが得られると思われるため、解決策の記述は省略します。

さて、他の問題:

  1. いくつかのルールが一致するはず0です。先行ゼロを許可したくない場合は、別のルールとして it を付ける必要があります。

  2. オプションの演算子 ( ?) を使用して、前のオブジェクトがオプションであることを示します。例えば。、、"foo"?の 3 文字(順番に) に一致するか、空の文字列に一致します。これを使用して、記号をオプションにすることができます。foo

  3. abc123あなたの質問のように、問題は のマッチングではありません。(F)lex は常に可能な限り長い一致を提供し、開始文字に一致できる唯一のルールaは文字列ルールであるため、文字列ルールが可能な限り継続できるようにします。のすべてに常に一致しますabc123。ただし、これは にも一致123します。これは、おそらく数値ルールで一致させたいと思うでしょう。ここで、もう 1 つの (f)lex 一致基準が機能します。まったく同じ文字列に一致する可能性のあるルールが 2 つ以上あり、いずれのルールもより長い文字列に一致しない場合、(f)lex は最初のルールを選択します。ファイル。したがって、文字列よりも数値を優先したい場合は、(f)lex ファイル内で文字列規則よりも前に数値規則を配置する必要があります。

物事を修正する方法についてのアイデアが得られることを願っています。

于 2013-10-09T23:54:11.467 に答える