language-ruby 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +9 -0
  3. data/.github/workflows/rspec.yml +14 -0
  4. data/.gitignore +2 -0
  5. data/.prettierrc +3 -0
  6. data/.rspec +1 -0
  7. data/CHANGELOG.md +55 -0
  8. data/Gemfile +8 -0
  9. data/Gemfile.lock +48 -0
  10. data/LICENSE +7 -0
  11. data/README.md +103 -0
  12. data/TODO +17 -0
  13. data/bin/code +76 -0
  14. data/bin/format +3 -0
  15. data/bin/template +85 -0
  16. data/bin/test +17 -0
  17. data/code-ruby.gemspec +17 -0
  18. data/docs/class.code +9 -0
  19. data/docs/euler/1.template +10 -0
  20. data/docs/euler/2.template +16 -0
  21. data/docs/euler/3.template +16 -0
  22. data/docs/euler/4.template +10 -0
  23. data/docs/euler/5.template +13 -0
  24. data/docs/fibonnaci.template +14 -0
  25. data/docs/meetup.code +12 -0
  26. data/docs/precedence.template +36 -0
  27. data/docs/rain.code +22 -0
  28. data/docs/slack.code +17 -0
  29. data/docs/stripe.code +7 -0
  30. data/docs/twitter.code +9 -0
  31. data/language-ruby.gemspec +18 -0
  32. data/lib/code/error.rb +18 -0
  33. data/lib/code/node/base_10.rb +29 -0
  34. data/lib/code/node/base_16.rb +13 -0
  35. data/lib/code/node/base_2.rb +13 -0
  36. data/lib/code/node/base_8.rb +13 -0
  37. data/lib/code/node/boolean.rb +22 -0
  38. data/lib/code/node/call.rb +47 -0
  39. data/lib/code/node/call_argument.rb +21 -0
  40. data/lib/code/node/chained_call.rb +23 -0
  41. data/lib/code/node/code.rb +20 -0
  42. data/lib/code/node/decimal.rb +26 -0
  43. data/lib/code/node/dictionnary.rb +33 -0
  44. data/lib/code/node/equal.rb +34 -0
  45. data/lib/code/node/function.rb +20 -0
  46. data/lib/code/node/function_parameter.rb +31 -0
  47. data/lib/code/node/if.rb +59 -0
  48. data/lib/code/node/if_modifier.rb +47 -0
  49. data/lib/code/node/list.rb +16 -0
  50. data/lib/code/node/negation.rb +15 -0
  51. data/lib/code/node/not.rb +15 -0
  52. data/lib/code/node/nothing.rb +12 -0
  53. data/lib/code/node/number.rb +25 -0
  54. data/lib/code/node/operation.rb +38 -0
  55. data/lib/code/node/power.rb +20 -0
  56. data/lib/code/node/rescue.rb +17 -0
  57. data/lib/code/node/splat.rb +15 -0
  58. data/lib/code/node/statement.rb +59 -0
  59. data/lib/code/node/string.rb +53 -0
  60. data/lib/code/node/ternary.rb +24 -0
  61. data/lib/code/node/unary_minus.rb +15 -0
  62. data/lib/code/node/while.rb +35 -0
  63. data/lib/code/node.rb +13 -0
  64. data/lib/code/object/argument.rb +32 -0
  65. data/lib/code/object/boolean.rb +27 -0
  66. data/lib/code/object/decimal.rb +162 -0
  67. data/lib/code/object/dictionnary.rb +96 -0
  68. data/lib/code/object/function.rb +64 -0
  69. data/lib/code/object/global.rb +42 -0
  70. data/lib/code/object/integer.rb +221 -0
  71. data/lib/code/object/list.rb +200 -0
  72. data/lib/code/object/nothing.rb +23 -0
  73. data/lib/code/object/number.rb +6 -0
  74. data/lib/code/object/range.rb +146 -0
  75. data/lib/code/object/ruby_function.rb +31 -0
  76. data/lib/code/object/string.rb +88 -0
  77. data/lib/code/object.rb +197 -0
  78. data/lib/code/parser/addition.rb +21 -0
  79. data/lib/code/parser/and_operator.rb +17 -0
  80. data/lib/code/parser/bitwise_and.rb +17 -0
  81. data/lib/code/parser/bitwise_or.rb +21 -0
  82. data/lib/code/parser/boolean.rb +17 -0
  83. data/lib/code/parser/call.rb +122 -0
  84. data/lib/code/parser/chained_call.rb +47 -0
  85. data/lib/code/parser/class.rb +45 -0
  86. data/lib/code/parser/code.rb +25 -0
  87. data/lib/code/parser/dictionnary.rb +67 -0
  88. data/lib/code/parser/equal.rb +94 -0
  89. data/lib/code/parser/equality.rb +35 -0
  90. data/lib/code/parser/equality_lower.rb +9 -0
  91. data/lib/code/parser/function.rb +85 -0
  92. data/lib/code/parser/greater.rb +25 -0
  93. data/lib/code/parser/group.rb +22 -0
  94. data/lib/code/parser/if.rb +63 -0
  95. data/lib/code/parser/if_modifier.rb +55 -0
  96. data/lib/code/parser/list.rb +42 -0
  97. data/lib/code/parser/multiplication.rb +25 -0
  98. data/lib/code/parser/name.rb +101 -0
  99. data/lib/code/parser/negation.rb +30 -0
  100. data/lib/code/parser/not_keyword.rb +23 -0
  101. data/lib/code/parser/nothing.rb +22 -0
  102. data/lib/code/parser/number.rb +154 -0
  103. data/lib/code/parser/operation.rb +35 -0
  104. data/lib/code/parser/or_keyword.rb +21 -0
  105. data/lib/code/parser/or_operator.rb +17 -0
  106. data/lib/code/parser/power.rb +43 -0
  107. data/lib/code/parser/range.rb +17 -0
  108. data/lib/code/parser/rescue.rb +39 -0
  109. data/lib/code/parser/shift.rb +21 -0
  110. data/lib/code/parser/splat.rb +31 -0
  111. data/lib/code/parser/statement.rb +9 -0
  112. data/lib/code/parser/string.rb +78 -0
  113. data/lib/code/parser/ternary.rb +46 -0
  114. data/lib/code/parser/unary_minus.rb +31 -0
  115. data/lib/code/parser/while.rb +36 -0
  116. data/lib/code/parser/whitespace.rb +49 -0
  117. data/lib/code/parser.rb +19 -0
  118. data/lib/code/ruby.rb +162 -0
  119. data/lib/code-ruby.rb +10 -0
  120. data/lib/code.rb +47 -0
  121. data/lib/language/atom.rb +343 -0
  122. data/lib/language/output.rb +130 -0
  123. data/lib/language/parser/absent/present.rb +8 -0
  124. data/lib/language/parser/absent.rb +6 -0
  125. data/lib/language/parser/end_of_input.rb +6 -0
  126. data/lib/language/parser/interuption.rb +38 -0
  127. data/lib/language/parser/not_end_of_input.rb +6 -0
  128. data/lib/language/parser/str/not_found.rb +16 -0
  129. data/lib/language/parser/str.rb +6 -0
  130. data/lib/language/parser.rb +53 -0
  131. data/lib/language-ruby.rb +10 -0
  132. data/lib/language.rb +80 -0
  133. data/lib/template/node/code_part.rb +13 -0
  134. data/lib/template/node/part.rb +19 -0
  135. data/lib/template/node/template.rb +15 -0
  136. data/lib/template/node/text_part.rb +13 -0
  137. data/lib/template/node.rb +4 -0
  138. data/lib/template/parser/template.rb +39 -0
  139. data/lib/template/parser.rb +19 -0
  140. data/lib/template/version.rb +3 -0
  141. data/lib/template-ruby.rb +10 -0
  142. data/lib/template.rb +50 -0
  143. data/spec/code/addition_spec.rb +13 -0
  144. data/spec/code/and_operator_spec.rb +13 -0
  145. data/spec/code/bitwise_and_spec.rb +13 -0
  146. data/spec/code/bitwise_or_spec.rb +13 -0
  147. data/spec/code/boolean_spec.rb +13 -0
  148. data/spec/code/call_spec.rb +21 -0
  149. data/spec/code/chained_call_spec.rb +16 -0
  150. data/spec/code/dictionnary_spec.rb +17 -0
  151. data/spec/code/equal_spec.rb +26 -0
  152. data/spec/code/equality_spec.rb +13 -0
  153. data/spec/code/function_spec.rb +18 -0
  154. data/spec/code/greater_spec.rb +18 -0
  155. data/spec/code/group_spec.rb +12 -0
  156. data/spec/code/if_modifier_spec.rb +20 -0
  157. data/spec/code/if_spec.rb +25 -0
  158. data/spec/code/list_spec.rb +17 -0
  159. data/spec/code/multiplication_spec.rb +18 -0
  160. data/spec/code/negation_spec.rb +20 -0
  161. data/spec/code/not_keyword_spec.rb +13 -0
  162. data/spec/code/nothing_spec.rb +17 -0
  163. data/spec/code/number_spec.rb +22 -0
  164. data/spec/code/or_keyword_spec.rb +17 -0
  165. data/spec/code/or_operator_spec.rb +16 -0
  166. data/spec/code/parser/boolean_spec.rb +16 -0
  167. data/spec/code/parser/call_spec.rb +26 -0
  168. data/spec/code/parser/chained_call.rb +17 -0
  169. data/spec/code/parser/dictionnary_spec.rb +18 -0
  170. data/spec/code/parser/function_spec.rb +16 -0
  171. data/spec/code/parser/group_spec.rb +18 -0
  172. data/spec/code/parser/list_spec.rb +18 -0
  173. data/spec/code/parser/number_spec.rb +12 -0
  174. data/spec/code/parser/string_spec.rb +21 -0
  175. data/spec/code/parser_spec.rb +23 -0
  176. data/spec/code/power_spec.rb +13 -0
  177. data/spec/code/range_spec.rb +16 -0
  178. data/spec/code/rescue_spec.rb +13 -0
  179. data/spec/code/shift_spec.rb +13 -0
  180. data/spec/code/splat_spec.rb +13 -0
  181. data/spec/code/string_spec.rb +25 -0
  182. data/spec/code/ternary_spec.rb +18 -0
  183. data/spec/code/unary_minus_spec.rb +13 -0
  184. data/spec/code/while_spec.rb +18 -0
  185. data/spec/spec_helper.rb +6 -0
  186. data/template-ruby.gemspec +19 -0
  187. metadata +284 -0
@@ -0,0 +1,35 @@
1
+ class Code
2
+ class Parser
3
+ class Equality < Operation
4
+ def statement
5
+ ::Code::Parser::Splat
6
+ end
7
+
8
+ def equal
9
+ str("=")
10
+ end
11
+
12
+ def greater
13
+ str(">")
14
+ end
15
+
16
+ def lesser
17
+ str("<")
18
+ end
19
+
20
+ def exclamation_point
21
+ str("!")
22
+ end
23
+
24
+ def tilde
25
+ str("~")
26
+ end
27
+
28
+ def operator
29
+ (equal << equal << equal) | (equal << equal) |
30
+ (lesser << equal << greater) | (exclamation_point << equal) |
31
+ (equal << tilde) | (tilde << equal) | (exclamation_point << tilde)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,9 @@
1
+ class Code
2
+ class Parser
3
+ class EqualityLower < Equality
4
+ def statement
5
+ ::Code::Parser::Greater
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,85 @@
1
+ class Code
2
+ class Parser
3
+ class Function < Language
4
+ def name
5
+ ::Code::Parser::Name
6
+ end
7
+
8
+ def code
9
+ ::Code::Parser::Code
10
+ end
11
+
12
+ def code_present
13
+ ::Code::Parser::Code.new.present
14
+ end
15
+
16
+ def whitespace
17
+ ::Code::Parser::Whitespace
18
+ end
19
+
20
+ def whitespace?
21
+ whitespace.maybe
22
+ end
23
+
24
+ def opening_parenthesis
25
+ str("(")
26
+ end
27
+
28
+ def closing_parenthesis
29
+ str(")")
30
+ end
31
+
32
+ def colon
33
+ str(":")
34
+ end
35
+
36
+ def comma
37
+ str(",")
38
+ end
39
+
40
+ def equal
41
+ str("=")
42
+ end
43
+
44
+ def greater
45
+ str(">")
46
+ end
47
+
48
+ def opening_curly_bracket
49
+ str("{")
50
+ end
51
+
52
+ def closing_curly_bracket
53
+ str("}")
54
+ end
55
+
56
+ def keyword_parameter
57
+ name.aka(:name) << whitespace? << colon.aka(:keyword) <<
58
+ code_present.aka(:default).maybe
59
+ end
60
+
61
+ def regular_parameter
62
+ name.aka(:name) << whitespace? <<
63
+ (equal << whitespace? << code_present.aka(:default)).maybe
64
+ end
65
+
66
+ def parameter
67
+ keyword_parameter | regular_parameter
68
+ end
69
+
70
+ def parameters
71
+ opening_parenthesis.ignore << whitespace? << parameter.repeat(0, 1) <<
72
+ (whitespace? << comma << whitespace? << parameter).repeat <<
73
+ whitespace? << closing_parenthesis.ignore.maybe
74
+ end
75
+
76
+ def root
77
+ (
78
+ parameters.aka(:parameters) << whitespace? << equal << greater <<
79
+ whitespace? << opening_curly_bracket << code.aka(:body) <<
80
+ closing_curly_bracket.maybe
81
+ ).aka(:function) | ::Code::Parser::ChainedCall
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,25 @@
1
+ class Code
2
+ class Parser
3
+ class Greater < Operation
4
+ def statement
5
+ ::Code::Parser::BitwiseOr
6
+ end
7
+
8
+ def greater
9
+ str(">")
10
+ end
11
+
12
+ def lesser
13
+ str("<")
14
+ end
15
+
16
+ def equal
17
+ str("=")
18
+ end
19
+
20
+ def operator
21
+ (greater << equal) | (lesser << equal) | greater | lesser
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,22 @@
1
+ class Code
2
+ class Parser
3
+ class Group < Language
4
+ def code
5
+ ::Code::Parser::Code
6
+ end
7
+
8
+ def opening_parenthesis
9
+ str("(")
10
+ end
11
+
12
+ def closing_parenthesis
13
+ str(")")
14
+ end
15
+
16
+ def root
17
+ (opening_parenthesis << code << closing_parenthesis.maybe).aka(:group) |
18
+ ::Code::Parser::Call
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,63 @@
1
+ class Code
2
+ class Parser
3
+ class If < Language
4
+ def statement
5
+ ::Code::Parser::IfModifier
6
+ end
7
+
8
+ def if_class
9
+ ::Code::Parser::If
10
+ end
11
+
12
+ def whitespace
13
+ ::Code::Parser::Whitespace
14
+ end
15
+
16
+ def code
17
+ ::Code::Parser::Code
18
+ end
19
+
20
+ def whitespace?
21
+ whitespace.maybe
22
+ end
23
+
24
+ def if_keyword
25
+ str("if")
26
+ end
27
+
28
+ def unless_keyword
29
+ str("unless")
30
+ end
31
+
32
+ def elsif_keyword
33
+ str("elsif")
34
+ end
35
+
36
+ def else_keyword
37
+ str("else")
38
+ end
39
+
40
+ def end_keyword
41
+ str("end")
42
+ end
43
+
44
+ def root
45
+ (
46
+ (if_keyword | unless_keyword).aka(:first_operator) << whitespace <<
47
+ statement.aka(:first_statement) << code.aka(:first_body) <<
48
+ (
49
+ (
50
+ elsif_keyword.aka(:operator) << whitespace <<
51
+ statement.aka(:statement) << code.aka(:body)
52
+ ) |
53
+ (
54
+ else_keyword << whitespace <<
55
+ (if_keyword | unless_keyword).aka(:operator) <<
56
+ whitespace << statement.aka(:statement) << code.aka(:body)
57
+ ) | (else_keyword.aka(:operator) << code.aka(:body))
58
+ ).repeat(1).aka(:elses).maybe << end_keyword.maybe
59
+ ).aka(:if) | statement
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,55 @@
1
+ class Code
2
+ class Parser
3
+ class IfModifier < Language
4
+ def statement
5
+ ::Code::Parser::OrKeyword
6
+ end
7
+
8
+ def if_modifier
9
+ ::Code::Parser::IfModifier
10
+ end
11
+
12
+ def whitespace
13
+ ::Code::Parser::Whitespace.new.without_newline
14
+ end
15
+
16
+ def whitespace?
17
+ whitespace.maybe
18
+ end
19
+
20
+ def if_keyword
21
+ str("if")
22
+ end
23
+
24
+ def unless_keyword
25
+ str("unless")
26
+ end
27
+
28
+ def while_keyword
29
+ str("while")
30
+ end
31
+
32
+ def until_keyword
33
+ str("until")
34
+ end
35
+
36
+ def operator
37
+ if_keyword | unless_keyword | while_keyword | until_keyword
38
+ end
39
+
40
+ def root
41
+ (
42
+ statement.aka(:left) <<
43
+ (
44
+ whitespace? << operator.aka(:operator) << whitespace? <<
45
+ if_modifier.aka(:right)
46
+ ).maybe
47
+ )
48
+ .aka(:if_modifier)
49
+ .then do |output|
50
+ output[:if_modifier][:right] ? output : output[:if_modifier][:left]
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,42 @@
1
+ class Code
2
+ class Parser
3
+ class List < Language
4
+ def code
5
+ ::Code::Parser::Code.new.present
6
+ end
7
+
8
+ def whitespace
9
+ ::Code::Parser::Whitespace
10
+ end
11
+
12
+ def whitespace?
13
+ whitespace.maybe
14
+ end
15
+
16
+ def opening_square_bracket
17
+ str("[")
18
+ end
19
+
20
+ def closing_square_bracket
21
+ str("]")
22
+ end
23
+
24
+ def comma
25
+ str(",")
26
+ end
27
+
28
+ def element
29
+ code
30
+ end
31
+
32
+ def root
33
+ (
34
+ opening_square_bracket.ignore << whitespace? <<
35
+ element.repeat(0, 1) <<
36
+ (whitespace? << comma << whitespace? << element).repeat <<
37
+ (whitespace? << closing_square_bracket.ignore).maybe
38
+ ).aka(:list) | ::Code::Parser::String
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,25 @@
1
+ class Code
2
+ class Parser
3
+ class Multiplication < Operation
4
+ def statement
5
+ ::Code::Parser::UnaryMinus
6
+ end
7
+
8
+ def asterisk
9
+ str("*")
10
+ end
11
+
12
+ def slash
13
+ str("/")
14
+ end
15
+
16
+ def percent
17
+ str("%")
18
+ end
19
+
20
+ def operator
21
+ asterisk | slash | percent
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,101 @@
1
+ class Code
2
+ class Parser
3
+ class Name < Language
4
+ def space
5
+ str(" ")
6
+ end
7
+
8
+ def newline
9
+ str("\n")
10
+ end
11
+
12
+ def comma
13
+ str(",")
14
+ end
15
+
16
+ def equal
17
+ str("=")
18
+ end
19
+
20
+ def colon
21
+ str(":")
22
+ end
23
+
24
+ def opening_curly_bracket
25
+ str("{")
26
+ end
27
+
28
+ def closing_curly_bracket
29
+ str("}")
30
+ end
31
+
32
+ def opening_square_bracket
33
+ str("[")
34
+ end
35
+
36
+ def closing_square_bracket
37
+ str("]")
38
+ end
39
+
40
+ def opening_parenthesis
41
+ str("(")
42
+ end
43
+
44
+ def closing_parenthesis
45
+ str(")")
46
+ end
47
+
48
+ def single_quote
49
+ str("'")
50
+ end
51
+
52
+ def double_quote
53
+ str('"')
54
+ end
55
+
56
+ def dot
57
+ str(".")
58
+ end
59
+
60
+ def pipe
61
+ str("|")
62
+ end
63
+
64
+ def ampersand
65
+ str("&")
66
+ end
67
+
68
+ def do_keyword
69
+ str("do")
70
+ end
71
+
72
+ def end_keyword
73
+ str("end")
74
+ end
75
+
76
+ def elsif_keyword
77
+ str("elsif")
78
+ end
79
+
80
+ def else_keyword
81
+ str("else")
82
+ end
83
+
84
+ def special_character
85
+ ampersand | equal | pipe | dot | colon | comma | space | newline |
86
+ opening_curly_bracket | closing_curly_bracket | opening_parenthesis |
87
+ closing_parenthesis | opening_square_bracket |
88
+ closing_square_bracket | single_quote | double_quote
89
+ end
90
+
91
+ def character
92
+ special_character.absent << any
93
+ end
94
+
95
+ def root
96
+ do_keyword.absent << end_keyword.absent << elsif_keyword.absent <<
97
+ else_keyword.absent << character.repeat(1)
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,30 @@
1
+ class Code
2
+ class Parser
3
+ class Negation < Language
4
+ def exclamation_point
5
+ str("!")
6
+ end
7
+
8
+ def tilde
9
+ str("~")
10
+ end
11
+
12
+ def plus
13
+ str("+")
14
+ end
15
+
16
+ def operator
17
+ exclamation_point | tilde | plus
18
+ end
19
+
20
+ def negation
21
+ ::Code::Parser::Negation
22
+ end
23
+
24
+ def root
25
+ (operator.aka(:operator) << negation.aka(:right)).aka(:negation) |
26
+ ::Code::Parser::Function
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,23 @@
1
+ class Code
2
+ class Parser
3
+ class NotKeyword < Language
4
+ def not_class
5
+ ::Code::Parser::NotKeyword
6
+ end
7
+
8
+ def whitespace
9
+ ::Code::Parser::Whitespace
10
+ end
11
+
12
+ def not_keyword
13
+ str("not")
14
+ end
15
+
16
+ def root
17
+ (not_keyword.aka(:operator) << whitespace << not_class.aka(:right)).aka(
18
+ :not
19
+ ) | ::Code::Parser::Equal
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ class Code
2
+ class Parser
3
+ class Nothing < Language
4
+ def nothing_keyword
5
+ str("nothing")
6
+ end
7
+
8
+ def null_keyword
9
+ str("null")
10
+ end
11
+
12
+ def nil_keyword
13
+ str("nil")
14
+ end
15
+
16
+ def root
17
+ (nothing_keyword | null_keyword | nil_keyword).aka(:nothing) |
18
+ ::Code::Parser::Group
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,154 @@
1
+ class Code
2
+ class Parser
3
+ class Number < Language
4
+ def number
5
+ ::Code::Parser::Number
6
+ end
7
+
8
+ def zero
9
+ str("0")
10
+ end
11
+
12
+ def one
13
+ str("1")
14
+ end
15
+
16
+ def two
17
+ str("2")
18
+ end
19
+
20
+ def three
21
+ str("3")
22
+ end
23
+
24
+ def four
25
+ str("4")
26
+ end
27
+
28
+ def five
29
+ str("5")
30
+ end
31
+
32
+ def six
33
+ str("6")
34
+ end
35
+
36
+ def seven
37
+ str("7")
38
+ end
39
+
40
+ def eight
41
+ str("8")
42
+ end
43
+
44
+ def nine
45
+ str("9")
46
+ end
47
+
48
+ def dot
49
+ str(".")
50
+ end
51
+
52
+ def a
53
+ str("a") | str("A")
54
+ end
55
+
56
+ def b
57
+ str("b") | str("B")
58
+ end
59
+
60
+ def c
61
+ str("c") | str("C")
62
+ end
63
+
64
+ def d
65
+ str("d") | str("D")
66
+ end
67
+
68
+ def e
69
+ str("e") | str("E")
70
+ end
71
+
72
+ def f
73
+ str("f") | str("F")
74
+ end
75
+
76
+ def o
77
+ str("o") | str("O")
78
+ end
79
+
80
+ def x
81
+ str("x") | str("X")
82
+ end
83
+
84
+ def underscore
85
+ str("_")
86
+ end
87
+
88
+ def base_16_digit
89
+ zero | one | two | three | four | five | six | seven | eight | nine |
90
+ a | b | c | d | e | f
91
+ end
92
+
93
+ def base_10_digit
94
+ zero | one | two | three | four | five | six | seven | eight | nine
95
+ end
96
+
97
+ def base_8_digit
98
+ zero | one | two | three | four | five | six | seven
99
+ end
100
+
101
+ def base_2_digit
102
+ zero | one
103
+ end
104
+
105
+ def base_16_whole
106
+ base_16_digit << (underscore.ignore | base_16_digit).repeat
107
+ end
108
+
109
+ def base_10_whole
110
+ base_10_digit << (underscore.ignore | base_10_digit).repeat
111
+ end
112
+
113
+ def base_8_whole
114
+ base_8_digit << (underscore.ignore | base_8_digit).repeat
115
+ end
116
+
117
+ def base_2_whole
118
+ base_2_digit << (underscore.ignore | base_2_digit).repeat
119
+ end
120
+
121
+ def exponent
122
+ (e << number).aka(:exponent)
123
+ end
124
+
125
+ def decimal
126
+ (base_10_whole << dot << base_10_whole).aka(:decimal) << exponent.maybe
127
+ end
128
+
129
+ def base_16_number
130
+ zero.ignore << x.ignore << base_16_whole
131
+ end
132
+
133
+ def base_10_number
134
+ base_10_whole.aka(:whole) << exponent.maybe
135
+ end
136
+
137
+ def base_8_number
138
+ zero.ignore << o.ignore << base_8_whole
139
+ end
140
+
141
+ def base_2_number
142
+ zero.ignore << b.ignore << base_2_whole
143
+ end
144
+
145
+ def root
146
+ (
147
+ decimal.aka(:decimal) | base_16_number.aka(:base_16) |
148
+ base_8_number.aka(:base_8) | base_2_number.aka(:base_2) |
149
+ base_10_number.aka(:base_10)
150
+ ).aka(:number) | ::Code::Parser::Boolean
151
+ end
152
+ end
153
+ end
154
+ end