本当は怖いHPC

HPC屋の趣味&実益ブログ

R6RSの数値表現にマッチさせる正規表現

Schemeの規格は不思議と数値の表現にうるさいんだけど、R6RSになってmantissa widthが追加されたりしてさらに細かくなっているので、レキサを書こうと思ったら大変でした。
でも見た感じ、の部分は正規言語になってそうだから、正規表現で一発マッチができますよっと。
あんまりちゃんとテストしてないんで完全ではないけど、だいたいマッチできます。

Revised 5.97 Report on the Algorithmic Language Scheme - 4.2.1 Formal account

※ 2割くらいはネタです。

追記:
10進のみの表現に、16進・8進・2進を追加したときにバグを入れてしまいました。
下の正規表現だと、10進数よりも16進数のほうが先に来てしまっていて、しかも
16進数では小数点表現は認められていないから、 10.0 などの例は 10 と .0 になってしまいます。
正規表現には先読みはないのでね。ははは。
ちゃんとチェックしろよ俺…。
でも直すのも面倒くさいからいいや。どうせ誰も試さないだろうし。

(((#x|#X)?(#i|#I|#e|#E)?|(#i|#I|#e|#E)?(#x|#X)?)
((((\+|-)?)([0-9A-Za-z]+/[0-9A-Za-z]+|[0-9A-Za-z]+)
|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))@(((\+|-)?)
([0-9A-Za-z]+/[0-9A-Za-z]+|[0-9A-Za-z]+)|\+(nan\.0|inf\.0)
|-(nan\.0|inf\.0))|(((\+|-)?)([0-9A-Za-z]+/[0-9A-Za-z]+
|[0-9A-Za-z]+)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))\+
([0-9A-Za-z]+/[0-9A-Za-z]+|[0-9A-Za-z]+)i|(((\+|-)?)
([0-9A-Za-z]+/[0-9A-Za-z]+|[0-9A-Za-z]+)|\+(nan\.0|inf\.0)
|-(nan\.0|inf\.0))-([0-9A-Za-z]+/[0-9A-Za-z]+|[0-9A-Za-z]+)
i|(((\+|-)?)([0-9A-Za-z]+/[0-9A-Za-z]+|[0-9A-Za-z]+)|\+
(nan\.0|inf\.0)|-(nan\.0|inf\.0))\+(nan\.0|inf\.0)i|(((\+|-)?)
([0-9A-Za-z]+/[0-9A-Za-z]+|[0-9A-Za-z]+)|\+(nan\.0|inf\.0)|
-(nan\.0|inf\.0))-(nan\.0|inf\.0)i|(((\+|-)?)([0-9A-Za-z]+/
[0-9A-Za-z]+|[0-9A-Za-z]+)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))\+
i|(((\+|-)?)([0-9A-Za-z]+/[0-9A-Za-z]+|[0-9A-Za-z]+)|\+(nan\.0
|inf\.0)|-(nan\.0|inf\.0))-i|\+([0-9A-Za-z]+/[0-9A-Za-z]+|
[0-9A-Za-z]+)i|-([0-9A-Za-z]+/[0-9A-Za-z]+|[0-9A-Za-z]+)i|
\+(nan\.0|inf\.0)i|-(nan\.0|inf\.0)i|(((\+|-)?)([0-9A-Za-z]
+/[0-9A-Za-z]+|[0-9A-Za-z]+)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0)
)|\+i|-i)|((#d|#D)?(#i|#I|#e|#E)?|(#i|#I|#e|#E)?(#d|#D)?)(((
(\+|-)?)([0-9]+/[0-9]+|(\.[0-9]+(((e|E|s|S|f|F|d|D|l|L)((\+|
-)?)[0-9]+)?)|[0-9]+\.[0-9]*(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)
[0-9]+)?)|[0-9]+\.(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)|
[0-9]+(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?))(\|[0-9]+)?)
|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))@(((\+|-)?)([0-9]+/[0-9]
+|(\.[0-9]+(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+\.
[0-9]*(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+\.((
(e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+(((e|E|s|S|f|F|d
|D|l|L)((\+|-)?)[0-9]+)?))(\|[0-9]+)?)|\+(nan\.0|inf\.0)|
-(nan\.0|inf\.0))|(((\+|-)?)([0-9]+/[0-9]+|(\.[0-9]+(((e|
E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+\.[0-9]*(((e|E
|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+\.(((e|E|s|S|f|
F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+(((e|E|s|S|f|F|d|D|l|L)
((\+|-)?)[0-9]+)?))(\|[0-9]+)?)|\+(nan\.0|inf\.0)|-(nan\.0|
inf\.0))\+([0-9]+/[0-9]+|(\.[0-9]+(((e|E|s|S|f|F|d|D|l|L)((
\+|-)?)[0-9]+)?)|[0-9]+\.[0-9]*(((e|E|s|S|f|F|d|D|l|L)((\+|
-)?)[0-9]+)?)|[0-9]+\.(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]
+)?)|[0-9]+(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?))(\|[0-9]
+)?)i|(((\+|-)?)([0-9]+/[0-9]+|(\.[0-9]+(((e|E|s|S|f|F|d|D|l|
L)((\+|-)?)[0-9]+)?)|[0-9]+\.[0-9]*(((e|E|s|S|f|F|d|D|l|L)((
\+|-)?)[0-9]+)?)|[0-9]+\.(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+
)?)|[0-9]+(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?))(\|[0-9]+)?
)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))-([0-9]+/[0-9]+|(\.[0-9]+
(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+\.[0-9]*(((e|E
|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+\.(((e|E|s|S|f|F|d|D
|l|L)((\+|-)?)[0-9]+)?)|[0-9]+(((e|E|s|S|f|F|d|D|l|L)((\+|-)?
)[0-9]+)?))(\|[0-9]+)?)i|(((\+|-)?)([0-9]+/[0-9]+|(\.[0-9]+((
(e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+\.[0-9]*(((e|E|
s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+\.(((e|E|s|S|f|F|d|D
|l|L)((\+|-)?)[0-9]+)?)|[0-9]+(((e|E|s|S|f|F|d|D|l|L)((\+|-)?
)[0-9]+)?))(\|[0-9]+)?)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))\+
(nan\.0|inf\.0)i|(((\+|-)?)([0-9]+/[0-9]+|(\.[0-9]+(((e|E|s|S
|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+\.[0-9]*(((e|E|s|S|f|F|
d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+\.(((e|E|s|S|f|F|d|D|l|L)((\+
|-)?)[0-9]+)?)|[0-9]+(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)
)(\|[0-9]+)?)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))-(nan\.0|inf\.0
)i|(((\+|-)?)([0-9]+/[0-9]+|(\.[0-9]+(((e|E|s|S|f|F|d|D|l|L)((
\+|-)?)[0-9]+)?)|[0-9]+\.[0-9]*(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)
[0-9]+)?)|[0-9]+\.(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]
+(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?))(\|[0-9]+)?)|\+(nan\.0
|inf\.0)|-(nan\.0|inf\.0))\+i|(((\+|-)?)([0-9]+/[0-9]+|(\.[0-9]+
(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+\.[0-9]*(((e|E|s
|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+\.(((e|E|s|S|f|F|d|D|l|L)
((\+|-)?)[0-9]+)?)|[0-9]+(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)
)(\|[0-9]+)?)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))-i|\+([0-9]+/[0-9]
+|(\.[0-9]+(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+\.[0-9]*
(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+\.(((e|E|s|S|f|F|d
|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]
+)?))(\|[0-9]+)?)i|-([0-9]+/[0-9]+|(\.[0-9]+(((e|E|s|S|f|F|d|D|l|L)
((\+|-)?)[0-9]+)?)|[0-9]+\.[0-9]*(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)
[0-9]+)?)|[0-9]+\.(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+
(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?))(\|[0-9]+)?)i|\+(nan\.0
|inf\.0)i|-(nan\.0|inf\.0)i|(((\+|-)?)([0-9]+/[0-9]+|(\.[0-9]+(((e
|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+\.[0-9]*(((e|E|s|S|f|
F|d|D|l|L)((\+|-)?)[0-9]+)?)|[0-9]+\.(((e|E|s|S|f|F|d|D|l|L)((\+|
-)?)[0-9]+)?)|[0-9]+(((e|E|s|S|f|F|d|D|l|L)((\+|-)?)[0-9]+)?))(\|
[0-9]+)?)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))|\+i|-i)|((#o|#O)?(#i
|#I|#e|#E)?|(#i|#I|#e|#E)?(#o|#O)?)((((\+|-)?)([0-7]+/[0-7]+|[0-7]
+)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))@(((\+|-)?)([0-7]+/[0-7]+|[0-7]
+)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))|(((\+|-)?)([0-7]+/[0-7]+|[0-7]
+)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))\+([0-7]+/[0-7]+|[0-7]+)i|(((\+
|-)?)([0-7]+/[0-7]+|[0-7]+)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))-([0-7]
+/[0-7]+|[0-7]+)i|(((\+|-)?)([0-7]+/[0-7]+|[0-7]+)|\+(nan\.0|inf\.0)|
-(nan\.0|inf\.0))\+(nan\.0|inf\.0)i|(((\+|-)?)([0-7]+/[0-7]+|[0-7]+)|
\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))-(nan\.0|inf\.0)i|(((\+|-)?)([0-7]
+/[0-7]+|[0-7]+)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))\+i|(((\+|-)?)(
[0-7]+/[0-7]+|[0-7]+)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))-i|\+([0-7]
+/[0-7]+|[0-7]+)i|-([0-7]+/[0-7]+|[0-7]+)i|\+(nan\.0|inf\.0)i|-(nan\.0
|inf\.0)i|(((\+|-)?)([0-7]+/[0-7]+|[0-7]+)|\+(nan\.0|inf\.0)|-(nan\.0
|inf\.0))|\+i|-i)|((#b|#B)?(#i|#I|#e|#E)?|(#i|#I|#e|#E)?(#b|#B)?)((((
\+|-)?)([01]+/[01]+|[01]+)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))@(((\+|-)
?)([01]+/[01]+|[01]+)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))|(((\+|-)?)(
[01]+/[01]+|[01]+)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))\+([01]+/[01]+|
[01]+)i|(((\+|-)?)([01]+/[01]+|[01]+)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0
))-([01]+/[01]+|[01]+)i|(((\+|-)?)([01]+/[01]+|[01]+)|\+(nan\.0|inf\.0)
|-(nan\.0|inf\.0))\+(nan\.0|inf\.0)i|(((\+|-)?)([01]+/[01]+|[01]+)|\+
(nan\.0|inf\.0)|-(nan\.0|inf\.0))-(nan\.0|inf\.0)i|(((\+|-)?)([01]+/[01]
+|[01]+)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))\+i|(((\+|-)?)([01]+/[01]+|
[01]+)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))-i|\+([01]+/[01]+|[01]+)i|-
([01]+/[01]+|[01]+)i|\+(nan\.0|inf\.0)i|-(nan\.0|inf\.0)i|(((\+|-)?)(
[01]+/[01]+|[01]+)|\+(nan\.0|inf\.0)|-(nan\.0|inf\.0))|\+i|-i))
【広告】