0

0から255までの10進数を受け入れたい。これは私が思いつくことができる最高のものです。

フラグメントmy_token:
  ('0'。。'9')| // 0-> 9
  ('1'。。'9''0'。。'9')| // 0-> 99
  ('1''0'。。'9''0'。。'9')| // 100-> 199
  ('2''0'。。'4''0'。。'9')| // 200-> 249
  ('25''0'。。'5'); // 250-> 255

しかし、私はただの無知なn00bです。Surelryより良い方法がありますか?

4

2 に答える 2

10

レクサーを緩め、チェックを後で延期すると、はるかに良い結果が得られます。Lex NUMBER、後で変換するときに、値が範囲外の場合に非常に具体的なエラーメッセージを表示できます。レクサーを厳密にし、誰かが256を入力した場合、結果として生じるエラーメッセージは、これまで文法を作成したことがない人には判読できません。

NUMBER
    :    '0'..'9'+
    ;
于 2009-12-06T23:50:28.000 に答える
1

私は280Z28の答えを上げました-そこで提案されたことをしてください。しかし、パターンを書く別の方法が必要な場合は、次のことを試すことができます。

0|1([0-9][0-9]?)?|2([0-4][0-9]?|5[0-5]?)?|[3-9][0-9]?

それは私が何よりも自慢していることです。確認するのは難しいです(私がこれを最初に書いたとき、私はそれをテストするまで捕らえられなかった間違いを犯しました)、そしてあなたがあなたのコードで使うべきものではありません。

于 2009-12-07T00:31:25.780 に答える