rltk 2.2.1 → 3.0.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 (59) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +12 -12
  3. data/README.md +458 -285
  4. data/Rakefile +99 -92
  5. data/lib/rltk/ast.rb +221 -126
  6. data/lib/rltk/cfg.rb +218 -239
  7. data/lib/rltk/cg/basic_block.rb +1 -1
  8. data/lib/rltk/cg/bindings.rb +9 -26
  9. data/lib/rltk/cg/builder.rb +40 -8
  10. data/lib/rltk/cg/context.rb +1 -1
  11. data/lib/rltk/cg/contractor.rb +51 -0
  12. data/lib/rltk/cg/execution_engine.rb +45 -8
  13. data/lib/rltk/cg/function.rb +12 -2
  14. data/lib/rltk/cg/generated_bindings.rb +2541 -575
  15. data/lib/rltk/cg/generic_value.rb +2 -2
  16. data/lib/rltk/cg/instruction.rb +104 -83
  17. data/lib/rltk/cg/llvm.rb +44 -3
  18. data/lib/rltk/cg/memory_buffer.rb +22 -5
  19. data/lib/rltk/cg/module.rb +85 -36
  20. data/lib/rltk/cg/old_generated_bindings.rb +6152 -0
  21. data/lib/rltk/cg/pass_manager.rb +87 -43
  22. data/lib/rltk/cg/support.rb +2 -4
  23. data/lib/rltk/cg/target.rb +158 -28
  24. data/lib/rltk/cg/triple.rb +8 -8
  25. data/lib/rltk/cg/type.rb +69 -25
  26. data/lib/rltk/cg/value.rb +107 -66
  27. data/lib/rltk/cg.rb +16 -17
  28. data/lib/rltk/lexer.rb +21 -11
  29. data/lib/rltk/lexers/calculator.rb +1 -1
  30. data/lib/rltk/lexers/ebnf.rb +8 -7
  31. data/lib/rltk/parser.rb +300 -247
  32. data/lib/rltk/parsers/infix_calc.rb +1 -1
  33. data/lib/rltk/parsers/postfix_calc.rb +2 -2
  34. data/lib/rltk/parsers/prefix_calc.rb +2 -2
  35. data/lib/rltk/token.rb +1 -2
  36. data/lib/rltk/version.rb +3 -3
  37. data/lib/rltk.rb +6 -6
  38. data/test/cg/tc_basic_block.rb +83 -0
  39. data/test/cg/tc_control_flow.rb +191 -0
  40. data/test/cg/tc_function.rb +54 -0
  41. data/test/cg/tc_generic_value.rb +33 -0
  42. data/test/cg/tc_instruction.rb +256 -0
  43. data/test/cg/tc_llvm.rb +25 -0
  44. data/test/cg/tc_math.rb +88 -0
  45. data/test/cg/tc_module.rb +89 -0
  46. data/test/cg/tc_transforms.rb +68 -0
  47. data/test/cg/tc_type.rb +69 -0
  48. data/test/cg/tc_value.rb +151 -0
  49. data/test/cg/ts_cg.rb +23 -0
  50. data/test/tc_ast.rb +105 -8
  51. data/test/tc_cfg.rb +63 -48
  52. data/test/tc_lexer.rb +84 -96
  53. data/test/tc_parser.rb +224 -52
  54. data/test/tc_token.rb +6 -6
  55. data/test/ts_rltk.rb +12 -15
  56. metadata +149 -75
  57. data/lib/rltk/cg/generated_extended_bindings.rb +0 -287
  58. data/lib/rltk/util/abstract_class.rb +0 -25
  59. data/lib/rltk/util/monkeys.rb +0 -129
data/lib/rltk/cg/value.rb CHANGED
@@ -7,8 +7,10 @@
7
7
  # Requires #
8
8
  ############
9
9
 
10
+ # Gems
11
+ require 'filigree/abstract_class'
12
+
10
13
  # Ruby Language Toolkit
11
- require 'rltk/util/abstract_class'
12
14
  require 'rltk/cg/bindings'
13
15
  require 'rltk/cg/type'
14
16
 
@@ -16,7 +18,7 @@ require 'rltk/cg/type'
16
18
  # Classes and Modules #
17
19
  #######################
18
20
 
19
- module RLTK::CG # :nodoc:
21
+ module RLTK::CG
20
22
 
21
23
  # This class represents LLVM IR "data", including integer and float
22
24
  # literals, functions, and constant arrays, structs, and vectors.
@@ -50,9 +52,9 @@ module RLTK::CG # :nodoc:
50
52
  #
51
53
  # @param [Type] type Type to cast to.
52
54
  #
53
- # @return [ConstExpr]
55
+ # @return [ConstantExpr]
54
56
  def bitcast(type)
55
- ConstExpr.new(Bindings.const_bit_cast(@ptr, check_cg_type(type)))
57
+ ConstantExpr.new(Bindings.const_bit_cast(@ptr, check_cg_type(type)))
56
58
  end
57
59
 
58
60
  # @return [Boolean] If this value is a constant.
@@ -87,7 +89,7 @@ module RLTK::CG # :nodoc:
87
89
  #
88
90
  # @return [String] *str*
89
91
  def name=(str)
90
- returning(str) { Bindings.set_value_name(@ptr, check_type(str, String)) }
92
+ str.tap { Bindings.set_value_name(@ptr, check_type(str, String)) }
91
93
  end
92
94
 
93
95
  # @return [Boolean] If the value is null or not.
@@ -95,42 +97,27 @@ module RLTK::CG # :nodoc:
95
97
  Bindings.is_null(@ptr).to_bool
96
98
  end
97
99
 
98
- # Print the LLVM IR representation of this value to a file. The file
99
- # may be specified via a file name (which will be created or
100
- # truncated) or an object that responds to #fileno.
101
- #
102
- # @LLVMECB
103
- #
104
- # @param [String, #fileno] io File name or object with a file descriptor to print to.
105
- #
106
- # @return [void]
107
- def print(io = $stdout)
108
- case io
109
- when String
110
- File.open(io, 'w') do |f|
111
- Bindings.print_value(@ptr, f.fileno)
112
- end
113
- else
114
- Bindings.print_value(@ptr, io.fileno)
115
- end
100
+ # @return [String] LLVM IR representation of this value
101
+ def print
102
+ Bindings.print_value_to_string(@ptr)
116
103
  end
117
104
 
118
105
  # Truncate a value to a given type.
119
106
  #
120
107
  # @param [Type] type Type to truncate to.
121
108
  #
122
- # @return [ConstExpr]
109
+ # @return [ConstantExpr]
123
110
  def trunc(type)
124
- ConstExpr.new(Bindings.const_trunc(check_cg_type(type)))
111
+ ConstantExpr.new(Bindings.const_trunc(check_cg_type(type)))
125
112
  end
126
113
 
127
114
  # Truncate or bitcast a value to the given type as is appropriate.
128
115
  #
129
116
  # @param [Type] type Type to cast or truncate to.
130
117
  #
131
- # @return [ConstExpr]
118
+ # @return [ConstantExpr]
132
119
  def trunc_or_bitcast(type)
133
- ConstExpr.new(Bindings.const_trunc_or_bit_cast(check_cg_type(type)))
120
+ ConstantExpr.new(Bindings.const_trunc_or_bit_cast(check_cg_type(type)))
134
121
  end
135
122
 
136
123
  # @return [Type] Type of this value.
@@ -147,18 +134,18 @@ module RLTK::CG # :nodoc:
147
134
  #
148
135
  # @param [Type] type Type to extend the value to.
149
136
  #
150
- # @return [ConstExpr]
137
+ # @return [ConstantExpr]
151
138
  def zextend(type)
152
- ConstExpr.new(Bindings.const_z_ext(check_cg_type(type)))
139
+ ConstantExpr.new(Bindings.const_z_ext(check_cg_type(type)))
153
140
  end
154
141
 
155
142
  # Zero extend or bitcast the value to the given type as is appropriate.
156
143
  #
157
144
  # @param [Type] type Type to cast or extend to.
158
145
  #
159
- # @return [ConstExpr]
146
+ # @return [ConstantExpr]
160
147
  def zextend_or_bitcast(type)
161
- ConstExpr.new(Bindings.const_z_ext_or_bit_cast(check_cg_type(type)))
148
+ ConstantExpr.new(Bindings.const_z_ext_or_bit_cast(check_cg_type(type)))
162
149
  end
163
150
 
164
151
  # This class is used to access a {Value Value's} attributes.
@@ -227,7 +214,7 @@ module RLTK::CG # :nodoc:
227
214
  #
228
215
  # @abstract
229
216
  class User < Value
230
- include AbstractClass
217
+ include Filigree::AbstractClass
231
218
 
232
219
  # @return [OperandCollection] Proxy object for accessing a value's operands.
233
220
  def operands
@@ -286,7 +273,7 @@ module RLTK::CG # :nodoc:
286
273
  #
287
274
  # @abstract
288
275
  class Constant < User
289
- include AbstractClass
276
+ include Filigree::AbstractClass
290
277
 
291
278
  # Create a new constant from a pointer or a type. As a library user
292
279
  # you should never pass a pointer in here as that is only used
@@ -306,11 +293,20 @@ module RLTK::CG # :nodoc:
306
293
  end
307
294
  end
308
295
 
296
+ # Cast a constant to a given address space
297
+ #
298
+ # @param [Type] type Type to cast to
299
+ #
300
+ # @return [ConstantExpr]
301
+ def addr_space_cast(type)
302
+ ConstantExpr.new(Bindings.const_addr_space_cast(@ptr, check_cg_type(type)))
303
+ end
304
+
309
305
  # Bitcast a constant to a given type.
310
306
  #
311
- # @param [Type] type
307
+ # @param [Type] type Type to cast to
312
308
  #
313
- # @return [ConstExpr]
309
+ # @return [ConstantExpr]
314
310
  def bitcast_to(type)
315
311
  ConstantExpr.new(Bindings.const_bit_cast(@ptr, check_cg_type(type)))
316
312
  end
@@ -351,7 +347,7 @@ module RLTK::CG # :nodoc:
351
347
  #
352
348
  # @param [FFI::Pointer] ptr
353
349
  def initialize(ptr)
354
- @ptr = type_check(ptr, FFI::Pointer, 'ptr')
350
+ @ptr = check_type(ptr, FFI::Pointer, 'ptr')
355
351
  end
356
352
  end
357
353
 
@@ -374,7 +370,7 @@ module RLTK::CG # :nodoc:
374
370
  #
375
371
  # @abstract
376
372
  class ConstantAggregate < Constant
377
- include AbstractClass
373
+ include Filigree::AbstractClass
378
374
 
379
375
  # Extract values from a constant aggregate value.
380
376
  #
@@ -414,14 +410,19 @@ module RLTK::CG # :nodoc:
414
410
  #
415
411
  # @yieldparam index [Integer] Index of the value in the array.
416
412
  #
417
- # @param [Type] element_type Type of values in this aggregate.
418
- # @param [Array<Value>, Integer] size_or_values Number of values or array of values.
419
- # @param [Proc] block Block evaluated if size is specified.
413
+ # @param [Type] element_type Type of values in this aggregate.
414
+ # @param [Array<Value>, Integer] size_or_values Number of values or array of values.
415
+ # @param [Proc] block Block evaluated if size is specified.
420
416
  def initialize(element_type, size_or_values, &block)
421
- vals_ptr = make_ptr_to_elements(size_or_values, &block)
422
- @type = ArrayType.new(element_type = check_cg_type(element_type, Type, 'element_type'))
423
- @ptr = Bindings.const_array(element_type, vals_ptr, vals_ptr.size / vals_ptr.type_size)
417
+ vals_ptr = make_ptr_to_elements(size_or_values, &block)
418
+ element_type = check_cg_type(element_type, Type, 'element_type')
419
+ @ptr = Bindings.const_array(element_type, vals_ptr, vals_ptr.size / vals_ptr.type_size)
424
420
  end
421
+
422
+ def size
423
+ self.type.size
424
+ end
425
+ alias :length :size
425
426
  end
426
427
 
427
428
  # A sub-class of {ConstantArray} specifically for holding strings.
@@ -464,7 +465,8 @@ module RLTK::CG # :nodoc:
464
465
 
465
466
  @ptr =
466
467
  if context
467
- Bindings.const_struct_in_context(check_type(context, Context, 'context'), vals_ptr, vals_ptr.size / vals_ptr.type_size, packed.to_i)
468
+ Bindings.const_struct_in_context(check_type(context, Context, 'context'),
469
+ vals_ptr, vals_ptr.size / vals_ptr.type_size, packed.to_i)
468
470
  else
469
471
  Bindings.const_struct(vals_ptr, vals_ptr.size / vals_ptr.type_size, packed.to_i)
470
472
  end
@@ -498,17 +500,17 @@ module RLTK::CG # :nodoc:
498
500
 
499
501
  # @param [Integer] index Index of desired element.
500
502
  #
501
- # @return [ConstExpr] Extracted element.
503
+ # @return [ConstantExpr] Extracted element.
502
504
  def extract_element(index)
503
- ConstExpr.new(Bindings.const_extract_element(@ptr, index))
505
+ ConstantExpr.new(Bindings.const_extract_element(@ptr, index))
504
506
  end
505
507
 
506
508
  # @param [Value] element Value to insert into the vector.
507
509
  # @param [Integer] index Index to insert the value at.
508
510
  #
509
- # @return [ConstExpr] New vector representation with inserted value.
511
+ # @return [ConstantExpr] New vector representation with inserted value.
510
512
  def insert_element(element, index)
511
- ConstExpr.new(Bindings.const_insert_element(@ptr, element, index))
513
+ ConstantExpr.new(Bindings.const_insert_element(@ptr, element, index))
512
514
  end
513
515
 
514
516
  # @param [ConstantVector] other Other vector to shuffle with this one.
@@ -518,13 +520,18 @@ module RLTK::CG # :nodoc:
518
520
  def shuffle(other, mask)
519
521
  ConstantVector.new(Bindings.const_shuffle_vector(@ptr, other, mask))
520
522
  end
523
+
524
+ def size
525
+ self.type.size
526
+ end
527
+ alias :length :size
521
528
  end
522
529
 
523
530
  # All number constants inherit from this class.
524
531
  #
525
532
  # @abstract
526
533
  class ConstantNumber < Constant
527
- include AbstractClass
534
+ include Filigree::AbstractClass
528
535
 
529
536
  # @return [Type] The corresponding Type sub-class that is used to represent the type of this value.
530
537
  def self.type
@@ -541,7 +548,7 @@ module RLTK::CG # :nodoc:
541
548
  #
542
549
  # @abstract
543
550
  class ConstantInteger < ConstantNumber
544
- include AbstractClass
551
+ include Filigree::AbstractClass
545
552
 
546
553
  # @return [Boolean] If the integer is signed or not.
547
554
  attr_reader :signed
@@ -560,9 +567,10 @@ module RLTK::CG # :nodoc:
560
567
  # @example Constant integer of all 1s:
561
568
  # Int32.new
562
569
  #
563
- # @param [FFI::Pointer, Integer, String, nil] overloaded0 Pointer to a ConstantInteger, value, or string representing value.
564
- # @param [Boolean, Integer] overloaded1 Signed or unsigned (when overloaded0 is Integer) or base used to decode string value.
565
- # @param [Integer] size Optional length of string to use.
570
+ # @param [FFI::Pointer, Integer, String, nil] overloaded0 Pointer to a ConstantInteger, value, or string representing value.
571
+ # @param [Boolean, Integer] overloaded1 Signed or unsigned (when overloaded0 is Integer) or base used to
572
+ # decode string value.
573
+ # @param [Integer] size Optional length of string to use.
566
574
  def initialize(overloaded0 = nil, overloaded1 = nil, size = nil)
567
575
  @ptr =
568
576
  case overloaded0
@@ -925,7 +933,7 @@ module RLTK::CG # :nodoc:
925
933
  #
926
934
  # @abstract
927
935
  class ConstantReal < ConstantNumber
928
- include AbstractClass
936
+ include Filigree::AbstractClass
929
937
 
930
938
  # Create a constant real number using a Ruby value or a string.
931
939
  #
@@ -1046,16 +1054,18 @@ module RLTK::CG # :nodoc:
1046
1054
  end
1047
1055
  end
1048
1056
 
1057
+ # A 16-bit floating point number value.
1058
+ class Half < ConstantReal; end
1049
1059
  # A double precision floating point number value.
1050
- class Double < ConstantReal; end
1051
- # A single precision floating point number type.
1052
- class Float < ConstantReal; end
1053
- # A 128 bit (16 byte) floating point number type.
1054
- class FP128 < ConstantReal; end
1055
- # A 128 bit (16 byte) floating point number type for the PPC architecture.
1056
- class PPCFP128 < ConstantReal; end
1057
- # A 80 bit (10 byte) floating point number type for the x86 architecture.
1058
- class X86FP80 < ConstantReal; end
1060
+ class Double < ConstantReal; end
1061
+ # A single precision floating point number value.
1062
+ class Float < ConstantReal; end
1063
+ # A 128 bit (16 byte) floating point number value.
1064
+ class FP128 < ConstantReal; end
1065
+ # A 128 bit (16 byte) floating point number value for the PPC architecture.
1066
+ class PPCFP128 < ConstantReal; end
1067
+ # A 80 bit (10 byte) floating point number value for the x86 architecture.
1068
+ class X86FP80 < ConstantReal; end
1059
1069
 
1060
1070
  # This class represents global constants, variables, and functions.
1061
1071
  class GlobalValue < Constant
@@ -1090,6 +1100,22 @@ module RLTK::CG # :nodoc:
1090
1100
  Bindings.is_declaration(@ptr).to_bool
1091
1101
  end
1092
1102
 
1103
+ # Sets the externally initialized property of a global value.
1104
+ #
1105
+ # @param [Boolean] bool If the value is externally initialized
1106
+ #
1107
+ # @return [void]
1108
+ def externally_initialized=(bool)
1109
+ Bindings.set_externally_initialized(@ptr, bool.to_i)
1110
+ end
1111
+
1112
+ # Check if this global is initialized externally.
1113
+ #
1114
+ # @return [Boolean]
1115
+ def externally_initialized?
1116
+ Bindings.externally_initialized(@ptr).to_bool
1117
+ end
1118
+
1093
1119
  # Check if this value is a global constant.
1094
1120
  #
1095
1121
  # @return [Boolean]
@@ -1158,6 +1184,23 @@ module RLTK::CG # :nodoc:
1158
1184
  Bindings.set_section(@ptr, section)
1159
1185
  end
1160
1186
 
1187
+ # Returns the thread local model used by a global value.
1188
+ #
1189
+ # @return [Symbol from _enum_thread_local_mode_]
1190
+ def thread_local_mode
1191
+ Bindings.get_thread_local_mode(@ptr)
1192
+ end
1193
+
1194
+
1195
+ # Set the global value's thread local mode.
1196
+ #
1197
+ # @param [Symbol from _enum_thread_local_mode_] mode
1198
+ #
1199
+ # @return [void]
1200
+ def thread_local_mode=(mode)
1201
+ Bindings.set_thread_local_mode(@ptr, mode)
1202
+ end
1203
+
1161
1204
  # Get this value's visibility.
1162
1205
  #
1163
1206
  # @see Bindings._enum_visibility_
@@ -1225,7 +1268,5 @@ def make_ptr_to_elements(size_or_values, &block)
1225
1268
  size_or_values
1226
1269
  end
1227
1270
 
1228
- returning(FFI::MemoryPointer.new(:pointer, values.size)) do |ptr|
1229
- ptr.write_array_of_pointer(values)
1230
- end
1271
+ FFI::MemoryPointer.new(:pointer, values.size).write_array_of_pointer(values)
1231
1272
  end
data/lib/rltk/cg.rb CHANGED
@@ -8,26 +8,25 @@
8
8
  # Classes and Modules #
9
9
  #######################
10
10
 
11
- module RLTK # :nodoc:
12
-
11
+ module RLTK
13
12
  # This module contains classes and methods for code generation. Code
14
13
  # generation functionality is provided by bindings to
15
14
  # [LLVM](http://llvm.org).
16
15
  module CG
17
- autoload :BasicBlock, 'rltk/cg/basic_block'
18
- autoload :Bindings, 'rltk/cg/bindings'
19
- autoload :Builder, 'rltk/cg/builder'
20
- autoload :Context, 'rltk/cg/context'
21
- autoload :ExecutionEngine, 'rltk/cg/execution_engine'
22
- autoload :Function, 'rltk/cg/function'
23
- autoload :GenericValue, 'rltk/cg/generic_value'
24
- autoload :Instruction, 'rltk/cg/instruction'
25
- autoload :LLVM, 'rltk/cg/llvm'
26
- autoload :MemoryBuffer, 'rltk/cg/memory_buffer'
27
- autoload :Module, 'rltk/cg/module'
28
- autoload :PassManager, 'rltk/cg/pass_manager'
29
- autoload :Support, 'rltk/cg/support'
30
- autoload :Type, 'rltk/cg/type'
31
- autoload :Value, 'rltk/cg/value'
16
+ autoload :BasicBlock, 'rltk/cg/basic_block'
17
+ autoload :Bindings, 'rltk/cg/bindings'
18
+ autoload :Builder, 'rltk/cg/builder'
19
+ autoload :Context, 'rltk/cg/context'
20
+ autoload :ExecutionEngine, 'rltk/cg/execution_engine'
21
+ autoload :Function, 'rltk/cg/function'
22
+ autoload :GenericValue, 'rltk/cg/generic_value'
23
+ autoload :Instruction, 'rltk/cg/instruction'
24
+ autoload :LLVM, 'rltk/cg/llvm'
25
+ autoload :MemoryBuffer, 'rltk/cg/memory_buffer'
26
+ autoload :Module, 'rltk/cg/module'
27
+ autoload :PassManager, 'rltk/cg/pass_manager'
28
+ autoload :Support, 'rltk/cg/support'
29
+ autoload :Type, 'rltk/cg/type'
30
+ autoload :Value, 'rltk/cg/value'
32
31
  end
33
32
  end
data/lib/rltk/lexer.rb CHANGED
@@ -17,11 +17,21 @@ require 'rltk/token'
17
17
  # Classes and Modules #
18
18
  #######################
19
19
 
20
- module RLTK # :nodoc:
21
-
20
+ module RLTK
22
21
  # A LexingError exception is raised when an input stream contains a
23
22
  # substring that isn't matched by any of a lexer's rules.
24
23
  class LexingError < StandardError
24
+ # @return [Integer]
25
+ attr_reader :stream_offset
26
+
27
+ # @return [Integer]
28
+ attr_reader :line_number
29
+
30
+ # @return [Integer]
31
+ attr_reader :line_offset
32
+
33
+ # @return [String]
34
+ attr_reader :remainder
25
35
 
26
36
  # @param [Integer] stream_offset Offset from begnning of string.
27
37
  # @param [Integer] line_number Number of newlines encountered so far.
@@ -55,6 +65,14 @@ module RLTK # :nodoc:
55
65
  # @return [Symbol] State in which the lexer starts.
56
66
  attr_reader :start_state
57
67
 
68
+ # Called when the Lexer class is sub-classed, it installes
69
+ # necessary instance class variables.
70
+ #
71
+ # @return [void]
72
+ def inherited(klass)
73
+ klass.install_icvars
74
+ end
75
+
58
76
  # Installs instance class varialbes into a class.
59
77
  #
60
78
  # @return [void]
@@ -63,14 +81,6 @@ module RLTK # :nodoc:
63
81
  @rules = Hash.new {|h,k| h[k] = Array.new}
64
82
  @start_state = :default
65
83
  end
66
-
67
- # Called when the Lexer class is sub-classed, it installes
68
- # necessary instance class variables.
69
- #
70
- # @return [void]
71
- def inherited(klass)
72
- klass.install_icvars
73
- end
74
84
 
75
85
  # Lex *string*, using *env* as the environment. This method will
76
86
  # return the array of tokens generated by the lexer with a token
@@ -137,7 +147,7 @@ module RLTK # :nodoc:
137
147
  line_offset += txt.length()
138
148
  end
139
149
  else
140
- error = LexingError.new(stream_offset, line_number, line_offset, scanner.post_match)
150
+ error = LexingError.new(stream_offset, line_number, line_offset, scanner.rest)
141
151
  raise(error, 'Unable to match string with any of the given rules')
142
152
  end
143
153
  end
@@ -14,7 +14,7 @@ require 'rltk/lexer'
14
14
  # Classes and Modules #
15
15
  #######################
16
16
 
17
- module RLTK # :nodoc:
17
+ module RLTK
18
18
 
19
19
  # The RLTK::Lexers module contains the lexers that are included as part of
20
20
  # the RLKT project.
@@ -14,8 +14,8 @@ require 'rltk/lexer'
14
14
  # Classes and Modules #
15
15
  #######################
16
16
 
17
- module RLTK # :nodoc:
18
- module Lexers # :nodoc:
17
+ module RLTK
18
+ module Lexers
19
19
 
20
20
  # The EBNF lexer is used by the RLTK::CFG class.
21
21
  class EBNF < Lexer
@@ -24,12 +24,13 @@ module RLTK # :nodoc:
24
24
  # Default State #
25
25
  #################
26
26
 
27
- rule(/\*/) { :* }
28
- rule(/\+/) { :+ }
29
- rule(/\?/) { :'?' }
27
+ rule(/\*/) { :STAR }
28
+ rule(/\+/) { :PLUS }
29
+ rule(/\?/) { :QUESTION }
30
+ rule(/\./) { :DOT }
30
31
 
31
- rule(/[a-z0-9_]+/) { |t| [:NONTERM, t.to_sym] }
32
- rule(/[A-Z0-9_]+/) { |t| [:TERM, t.to_sym] }
32
+ rule(/[a-z0-9_']+/) { |t| [:NONTERM, t.to_sym] }
33
+ rule(/[A-Z0-9_']+/) { |t| [:TERM, t.to_sym] }
33
34
 
34
35
  rule(/\s/)
35
36
  end