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))