Haskellパーサーは、数値リテラルでUnicode数字を許可する必要がありますか?


15

演習として、Haskellのパーサーをゼロから作成しています。レクサーを作成する際に、Haskell 2010レポートの次のルールに気づきました。

数字ascDigit | uniDigit
ascDigit0| 1| …| 9
uniDigit →任意のUnicode 10進数
オクティット0| 1| …| 7
hexitdigit | A| …| F| a| …|f

10進数数字 { 数字 }
8進数octit { octit }
16進数hexit { hexit }

整数10進数 | 0o 8進数 | 0O 8進数 | 0x 16進数 | 0X 16進数の
浮動小数点10 . 数の10 [ 指数 ] | 10進指数
指数 →(e| E)[ +| -] 小数

10進数と16進数のリテラルは、フロートリテラルと共に、すべてに基づいている数字の代わりに任意のUnicode進数字を認め、ascDigit基本的な数字0-9 ASCIIからを認めます。奇妙なことに、8進数octitに基づいており、代わりにASCII数字0〜7のみを受け入れます。これらの "Unicode decimal digits"は "Nd" General Categoryを持つ任意のUnicodeコードポイントであると思います。ただし、これには全角数字0〜9やデバナーガリ数字०〜९などの文字が含まれます。識別子でこれらを許可するのが望ましい理由はわかります९0が、リテラルの書き込みを許可することには何のメリットもありません90

GHCは私に同意するようです。このファイルをコンパイルしようとすると、

module DigitTest where
x1 = 

このエラーを吐き出します。

digitTest1.hs:2:6: error: lexical error at character '\65297'
  |
2 | x1 = 
  |      ^

ただし、このファイル

module DigitTest where
x = 1

正常にコンパイルされます。言語仕様を間違って読んでいますか?GHCの(賢明な)動作は実際に正しいですか、それとも技術的にはレポートの仕様に反していますか?これについての言及はどこにもありません。


4
おかしい。これは「わかりました。リテラルはASCII数字のみで構成されているので、簡単です」のようなものだと思います。「ちょっと待ってください、国際化、ユニコードを考えてみましょう...彼らは他の数字記号も持っていますよね?」「ええ、ええ、それを処理したことはありません...しかし、OK、そのための句を挿入しましょう...」「素晴らしい」...そして、それは忘れられただけで、実際に実装することに煩わされた人はいません。
leftaroundabout

うわぁ。ええ、これで気にしないでください。
ボアン

回答:


8

GHCソースコードファイルcompiler/parser/Lexer.xには、次のコードが含まれています。

ascdigit  = 0-9
$unidigit  = \x03 -- Trick Alex into handling Unicode. See [Unicode in Alex].
$decdigit  = $ascdigit -- for now, should really be $digit (ToDo)
$digit     = [$ascdigit $unidigit]
...
$binit     = 0-1
$octit     = 0-7
$hexit     = [$decdigit A-F a-f]
...
@numspc       = _*                   -- numeric spacer (#14473)
@decimal      = $decdigit(@numspc $decdigit)*
@binary       = $binit(@numspc $binit)*
@octal        = $octit(@numspc $octit)*
@hexadecimal  = $hexit(@numspc $hexit)*
@exponent     = @numspc [eE] [\-\+]? @decimal
@bin_exponent = @numspc [pP] [\-\+]? @decimal

ここで$decdigitは、10進数と16進数のリテラル(およびそれらの浮動小数点バリアント)の解析に$digit使用され、英数字の識別子の「数値」部分に使用されます。「ToDo」の注記では、これが言語標準からのGHCの認識された逸脱であることを明確にしています。

だから、あなたは仕様を正しく読んでおり、GHCは意図的に仕様に違反しています。少なくとも偏差を文書化することを示唆するオープンチケットがありますが、それを修正することに関心を示す人は誰もいないと思います。


そこにリストされている3つの偏差はすべてかなり合理的です。それらを「修正」する必要がない理由がわかります。
Ian Scherer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.