-1

レクサーに数字のパターンがあります

$digit=0-9
   $digit+                       { \s -> TNum  (readRational s) }

バイトに別のパターンを追加したい。バイトにはダイアポゾン 0 ~ f の 2 つのシンボルが含まれます。バイトにはどのパターンを書くべきですか? 11 :: byte と 11 :: num を正しく区別できますか?

4

1 に答える 1

0

レクサーに 2 つの重複するパターンを追加すると、失敗するか、単にそのうちの 1 つを選択するだけです (アレックスの正確な動作はわかりません)。

私がそれを正しく理解していれば、実際にはここで 2 つの問題が発生しています。

  1. 10 進数と 16 進数が重複している
  2. 固定サイズの数値型はオーバーラップします。たとえば、11 は 8 ビットまたは 32 ビットの可能性があります。

問題 1 を解決する一般的な方法は、16 進数にプレフィックスを追加することです。C はその0xために接頭辞を使用します。したがって、17 は0x1116 進数のように記述されます。

レクサーの問題2を解決しようとするべきではないと思います.数値を一般的な数値型として保持してください. 後で型チェック中に、コンテキストで必要な正確な型を決定するか、他の制約がない場合は型をデフォルトにすることができます。

于 2022-01-03T10:57:54.633 に答える