rexical 1.0.5 → 1.0.8

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.
data/sample/sample.rex.rb CHANGED
@@ -1,100 +1,92 @@
1
- #
2
- # DO NOT MODIFY!!!!
3
- # This file is automatically generated by rex 1.0.0
4
- # from lexical definition file "sample.rex".
5
- #
6
-
7
- require 'racc/parser'
8
- #
9
- # sample.rex
10
- # lexical definition sample for rex
11
- #
12
-
13
- class Sample < Racc::Parser
14
- require 'strscan'
15
-
16
- class ScanError < StandardError ; end
17
-
18
- attr_reader :lineno
19
- attr_reader :filename
20
-
21
- def scan_setup ; end
22
-
23
- def action &block
24
- yield
25
- end
26
-
27
- def scan_str( str )
28
- scan_evaluate str
29
- do_parse
30
- end
31
-
32
- def load_file( filename )
33
- @filename = filename
34
- open(filename, "r") do |f|
35
- scan_evaluate f.read
36
- end
37
- end
38
-
39
- def scan_file( filename )
40
- load_file filename
41
- do_parse
42
- end
43
-
44
- def next_token
45
- @rex_tokens.shift
46
- end
47
-
48
- def scan_evaluate( str )
49
- scan_setup
50
- @rex_tokens = []
51
- @lineno = 1
52
- ss = StringScanner.new(str)
53
- state = nil
54
- until ss.eos?
55
- text = ss.peek(1)
56
- @lineno += 1 if text == "\n"
57
- case state
58
- when nil
59
- case
60
- when (text = ss.scan(/BLANK/))
61
- ;
62
-
63
- when (text = ss.scan(/\d+/))
64
- @rex_tokens.push action { [:digit, text.to_i] }
65
-
66
- when (text = ss.scan(/\w+/))
67
- @rex_tokens.push action { [:word, text] }
68
-
69
- when (text = ss.scan(/\n/))
70
- ;
71
-
72
- when (text = ss.scan(/./))
73
- @rex_tokens.push action { [text, text] }
74
-
75
- else
76
- text = ss.string[ss.pos .. -1]
77
- raise ScanError, "can not match: '" + text + "'"
78
- end # if
79
-
80
- else
81
- raise ScanError, "undefined state: '" + state.to_s + "'"
82
- end # case state
83
- end # until ss
84
- end # def scan_evaluate
85
-
86
- end # class
87
-
88
- if __FILE__ == $0
89
- exit if ARGV.size != 1
90
- filename = ARGV.shift
91
- rex = Sample.new
92
- begin
93
- rex.load_file filename
94
- while token = rex.next_token
95
- p token
96
- end
97
- rescue
98
- $stderr.printf "%s:%d:%s\n", rex.filename, rex.lineno, $!.message
99
- end
100
- end
1
+ #--
2
+ # DO NOT MODIFY!!!!
3
+ # This file is automatically generated by rex 1.0.5
4
+ # from lexical definition file "sample/sample.rex".
5
+ #++
6
+
7
+ require 'racc/parser'
8
+ #
9
+ # sample.rex
10
+ # lexical definition sample for rex
11
+ #
12
+
13
+ class Sample < Racc::Parser
14
+ require 'strscan'
15
+
16
+ class ScanError < StandardError ; end
17
+
18
+ attr_reader :lineno
19
+ attr_reader :filename
20
+ attr_accessor :state
21
+
22
+ def scan_setup(str)
23
+ @ss = StringScanner.new(str)
24
+ @lineno = 1
25
+ @state = nil
26
+ end
27
+
28
+ def action
29
+ yield
30
+ end
31
+
32
+ def scan_str(str)
33
+ scan_setup(str)
34
+ do_parse
35
+ end
36
+ alias :scan :scan_str
37
+
38
+ def load_file( filename )
39
+ @filename = filename
40
+ open(filename, "r") do |f|
41
+ scan_setup(f.read)
42
+ end
43
+ end
44
+
45
+ def scan_file( filename )
46
+ load_file(filename)
47
+ do_parse
48
+ end
49
+
50
+
51
+ def next_token
52
+ return if @ss.eos?
53
+
54
+ # skips empty actions
55
+ until token = _next_token or @ss.eos?; end
56
+ token
57
+ end
58
+
59
+ def _next_token
60
+ text = @ss.peek(1)
61
+ @lineno += 1 if text == "\n"
62
+ token = case @state
63
+ when nil
64
+ case
65
+ when (text = @ss.scan(/[ \t]+/))
66
+ ;
67
+
68
+ when (text = @ss.scan(/\d+/))
69
+ action { [:digit, text.to_i] }
70
+
71
+ when (text = @ss.scan(/\w+/))
72
+ action { [:word, text] }
73
+
74
+ when (text = @ss.scan(/\n/))
75
+ ;
76
+
77
+ when (text = @ss.scan(/./))
78
+ action { [text, text] }
79
+
80
+
81
+ else
82
+ text = @ss.string[@ss.pos .. -1]
83
+ raise ScanError, "can not match: '" + text + "'"
84
+ end # if
85
+
86
+ else
87
+ raise ScanError, "undefined state: '" + state.to_s + "'"
88
+ end # case state
89
+ token
90
+ end # def _next_token
91
+
92
+ end # class
data/sample/sample1.rex CHANGED
@@ -19,11 +19,11 @@ rule
19
19
  # [:state] pattern [actions]
20
20
 
21
21
  # remark
22
- {REM_IN} { state = :REMS; [:rem_in, text] }
23
- :REMS {REM_OUT} { state = nil; [:rem_out, text] }
22
+ {REM_IN} { self.state = :REMS; [:rem_in, text] }
23
+ :REMS {REM_OUT} { self.state = nil; [:rem_out, text] }
24
24
  :REMS .*(?={REM_OUT}) { [:remark, text] }
25
- {REM} { state = :REM; [:rem_in, text] }
26
- :REM \n { state = nil; [:rem_out, text] }
25
+ {REM} { self.state = :REM; [:rem_in, text] }
26
+ :REM \n { self.state = nil; [:rem_out, text] }
27
27
  :REM .*(?=$) { [:remark, text] }
28
28
 
29
29
  # literal
data/sample/sample2.rex CHANGED
@@ -16,8 +16,8 @@ macro
16
16
  REMARK \' # '
17
17
 
18
18
  rule
19
- {REMARK} { state = :REM; [:rem_in, text] } # '
20
- :REM \n { state = nil; [:rem_out, text] }
19
+ {REMARK} { self.state = :REM; [:rem_in, text] } # '
20
+ :REM \n { self.state = nil; [:rem_out, text] }
21
21
  :REM .*(?=$) { [:remark, text] }
22
22
 
23
23
  \"[^"]*\" { [:string, text] } # "
@@ -28,34 +28,34 @@ macro
28
28
  rule
29
29
 
30
30
  # [:state] pattern [actions]
31
- {XTAG_IN} { state = :TAG; [:xtag_in, text] }
32
- {ETAG_IN} { state = :TAG; [:etag_in, text] }
33
- {TAG_IN} { state = :TAG; [:tag_in, text] }
34
- :TAG {EXT} { state = :EXT; [:ext, text] }
31
+ {XTAG_IN} { self.state = :TAG; [:xtag_in, text] }
32
+ {ETAG_IN} { self.state = :TAG; [:etag_in, text] }
33
+ {TAG_IN} { self.state = :TAG; [:tag_in, text] }
34
+ :TAG {EXT} { self.state = :EXT; [:ext, text] }
35
35
 
36
- :EXT {REM} { state = :REM; [:rem_in, text] }
37
- :EXT {XTAG_OUT} { state = nil; [:xtag_out, text] }
38
- :EXT {TAG_OUT} { state = nil; [:tag_out, text] }
36
+ :EXT {REM} { self.state = :REM; [:rem_in, text] }
37
+ :EXT {XTAG_OUT} { self.state = nil; [:xtag_out, text] }
38
+ :EXT {TAG_OUT} { self.state = nil; [:tag_out, text] }
39
39
  :EXT .+(?={REM}) { [:exttext, text] }
40
40
  :EXT .+(?={TAG_OUT}) { [:exttext, text] }
41
41
  :EXT .+(?=$) { [:exttext, text] }
42
42
  :EXT \n
43
43
 
44
- :REM {REM} { state = :EXT; [:rem_out, text] }
44
+ :REM {REM} { self.state = :EXT; [:rem_out, text] }
45
45
  :REM .+(?={REM}) { [:remtext, text] }
46
46
  :REM .+(?=$) { [:remtext, text] }
47
47
  :REM \n
48
48
 
49
49
  :TAG {BLANK}
50
- :TAG {XTAG_OUT} { state = nil; [:xtag_out, text] }
51
- :TAG {ETAG_OUT} { state = nil; [:etag_out, text] }
52
- :TAG {TAG_OUT} { state = nil; [:tag_out, text] }
50
+ :TAG {XTAG_OUT} { self.state = nil; [:xtag_out, text] }
51
+ :TAG {ETAG_OUT} { self.state = nil; [:etag_out, text] }
52
+ :TAG {TAG_OUT} { self.state = nil; [:tag_out, text] }
53
53
  :TAG {EQUAL} { [:equal, text] }
54
- :TAG {Q1} { state = :Q1; [:quote1, text] } # '
55
- :Q1 {Q1} { state = :TAG; [:quote1, text] } # '
54
+ :TAG {Q1} { self.state = :Q1; [:quote1, text] } # '
55
+ :Q1 {Q1} { self.state = :TAG; [:quote1, text] } # '
56
56
  :Q1 [^{Q1}]+(?={Q1}) { [:value, text] } # '
57
- :TAG {Q2} { state = :Q2; [:quote2, text] } # "
58
- :Q2 {Q2} { state = :TAG; [:quote2, text] } # "
57
+ :TAG {Q2} { self.state = :Q2; [:quote2, text] } # "
58
+ :Q2 {Q2} { self.state = :TAG; [:quote2, text] } # "
59
59
  :Q2 [^{Q2}]+(?={Q2}) { [:value, text] } # "
60
60
 
61
61
  :TAG [\w\-]+(?={EQUAL}) { [:attr, text] }
data/test/assets/test.rex CHANGED
@@ -5,8 +5,12 @@ class C < SomethingElse
5
5
  macro
6
6
  w [\s\r\n\f]*
7
7
 
8
+ rule
9
+
8
10
  # [:state] pattern [actions]
9
11
 
10
12
  {w}~={w} { [:INCLUDES, text] }
11
13
 
12
14
  end
15
+ end
16
+ end
data/test/rex-20060125.rb CHANGED
@@ -91,7 +91,7 @@ def get_options
91
91
  "#{$cmd}: #{name} given twice" if opt.key? name
92
92
  opt[name] = arg.empty? ? true : arg
93
93
  end
94
- rescue GetoptLong::AmbigousOption, GetoptLong::InvalidOption,
94
+ rescue GetoptLong::AmbiguousOption, GetoptLong::InvalidOption,
95
95
  GetoptLong::MissingArgument, GetoptLong::NeedlessArgument
96
96
  usage 1, $!.message
97
97
  end
data/test/rex-20060511.rb CHANGED
@@ -89,7 +89,7 @@ class RexRunner
89
89
  "#{@cmd}: #{name} given twice" if @opt.key? name
90
90
  @opt[name] = arg.empty? ? true : arg
91
91
  end
92
- rescue GetoptLong::AmbigousOption, GetoptLong::InvalidOption,
92
+ rescue GetoptLong::AmbiguousOption, GetoptLong::InvalidOption,
93
93
  GetoptLong::MissingArgument, GetoptLong::NeedlessArgument
94
94
  usage $!.message
95
95
  end
@@ -1,9 +1,11 @@
1
- require 'test/unit'
1
+ gem "minitest"
2
+ require 'minitest/autorun'
2
3
  require 'tempfile'
3
4
  require 'rexical'
4
5
  require 'stringio'
6
+ require 'open3'
5
7
 
6
- class TestGenerator < Test::Unit::TestCase
8
+ class TestGenerator < Minitest::Test
7
9
  def test_header_is_written_after_module
8
10
  rex = Rexical::Generator.new(
9
11
  "--independent" => true
@@ -25,6 +27,29 @@ class TestGenerator < Test::Unit::TestCase
25
27
  assert_equal '#++', comments.last
26
28
  end
27
29
 
30
+ def test_rubocop_security
31
+ rex = Rexical::Generator.new(
32
+ "--independent" => true
33
+ )
34
+ rex.grammar_file = File.join File.dirname(__FILE__), 'assets', 'test.rex'
35
+ rex.read_grammar
36
+ rex.parse
37
+
38
+ output = Tempfile.new(["rex_output", ".rb"])
39
+ begin
40
+ rex.write_scanner output
41
+ output.close
42
+
43
+ stdin, stdoe, wait_thr = Open3.popen2e "rubocop --only Security #{output.path}"
44
+ if ! wait_thr.value.success?
45
+ fail stdoe.read
46
+ end
47
+ ensure
48
+ output.close
49
+ output.unlink
50
+ end
51
+ end
52
+
28
53
  def test_read_non_existent_file
29
54
  rex = Rexical::Generator.new(nil)
30
55
  rex.grammar_file = 'non_existent_file'
@@ -71,6 +96,22 @@ end
71
96
  assert_match 'Calculator < Foo::Bar', source
72
97
  end
73
98
 
99
+ def test_stateful_lexer
100
+ m = build_lexer %q{
101
+ class Foo
102
+ rule
103
+ \d { @state = :digit; [:foo, text] }
104
+ :digit \w { @state = nil; [:w, text] }
105
+ end
106
+ }
107
+ scanner = m::Foo.new
108
+ scanner.scan_setup('1w1')
109
+ assert_tokens [
110
+ [:foo, '1'],
111
+ [:w, 'w'],
112
+ [:foo, '1']], scanner
113
+ end
114
+
74
115
  def test_simple_scanner
75
116
  m = build_lexer %q{
76
117
  class Calculator
@@ -185,7 +226,7 @@ end
185
226
  calc2.scan_setup('ababa')
186
227
 
187
228
  # Doesn't lex all 'a's
188
- assert_raise(lexer::Calculator::ScanError) { tokens(calc1) }
229
+ assert_raises(lexer::Calculator::ScanError) { tokens(calc1) }
189
230
 
190
231
  # Does lex alternating 'a's and 'b's
191
232
  calc2.scan_setup('ababa')
@@ -219,6 +260,21 @@ end
219
260
  calc.state = nil
220
261
  assert_equal [:A, 'a'], calc.next_token
221
262
  end
263
+ def test_match_eos
264
+ lexer = build_lexer %q{
265
+ class Calculator
266
+ option
267
+ matcheos
268
+ rule
269
+ a { [:A, text] }
270
+ $ { [:EOF, ""] }
271
+ :B b { [:B, text] }
272
+ }
273
+ calc = lexer::Calculator.new
274
+ calc.scan_setup("a")
275
+ assert_equal [:A, 'a'], calc.next_token
276
+ assert_equal [:EOF, ""], calc.next_token
277
+ end
222
278
 
223
279
  def parse_lexer(str)
224
280
  rex = Rexical::Generator.new("--independent" => true)
metadata CHANGED
@@ -1,55 +1,43 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rexical
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 1
7
- - 0
8
- - 5
9
- version: 1.0.5
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.8
10
5
  platform: ruby
11
- authors:
6
+ authors:
12
7
  - Aaron Patterson
13
- autorequire:
8
+ autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
-
17
- date: 2010-12-08 00:00:00 -08:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: hoe
11
+ date: 2024-05-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: getoptlong
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
22
21
  prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
25
- requirements:
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
26
24
  - - ">="
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 2
30
- - 6
31
- - 2
32
- version: 2.6.2
33
- type: :development
34
- version_requirements: *id001
35
- description: |-
36
- Rexical is a lexical scanner generator.
37
- It is written in Ruby itself, and generates Ruby program.
38
- It is designed for use with Racc.
39
- email:
40
- - aaronp@rubyforge.org
41
- executables:
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: Rexical is a lexical scanner generator that is used with Racc to generate
28
+ Ruby programs. Rexical is written in Ruby.
29
+ email:
30
+ executables:
42
31
  - rex
43
32
  extensions: []
44
-
45
- extra_rdoc_files:
46
- - Manifest.txt
33
+ extra_rdoc_files:
47
34
  - CHANGELOG.rdoc
48
35
  - DOCUMENTATION.en.rdoc
49
36
  - DOCUMENTATION.ja.rdoc
50
37
  - README.rdoc
51
- files:
38
+ files:
52
39
  - CHANGELOG.rdoc
40
+ - COPYING
53
41
  - DOCUMENTATION.en.rdoc
54
42
  - DOCUMENTATION.ja.rdoc
55
43
  - Manifest.txt
@@ -60,6 +48,7 @@ files:
60
48
  - lib/rexical.rb
61
49
  - lib/rexical/generator.rb
62
50
  - lib/rexical/rexcmd.rb
51
+ - lib/rexical/version.rb
63
52
  - sample/a.cmd
64
53
  - sample/b.cmd
65
54
  - sample/c.cmd
@@ -85,38 +74,30 @@ files:
85
74
  - test/rex-20060125.rb
86
75
  - test/rex-20060511.rb
87
76
  - test/test_generator.rb
88
- has_rdoc: true
89
- homepage: http://github.com/tenderlove/rexical/tree/master
90
- licenses: []
91
-
92
- post_install_message:
93
- rdoc_options:
94
- - --main
77
+ homepage: http://github.com/sparklemotion/rexical
78
+ licenses:
79
+ - LGPL-2.1-only
80
+ metadata: {}
81
+ post_install_message:
82
+ rdoc_options:
83
+ - "--main"
95
84
  - README.rdoc
96
- require_paths:
85
+ require_paths:
97
86
  - lib
98
- required_ruby_version: !ruby/object:Gem::Requirement
99
- none: false
100
- requirements:
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ requirements:
101
89
  - - ">="
102
- - !ruby/object:Gem::Version
103
- segments:
104
- - 0
105
- version: "0"
106
- required_rubygems_version: !ruby/object:Gem::Requirement
107
- none: false
108
- requirements:
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ requirements:
109
94
  - - ">="
110
- - !ruby/object:Gem::Version
111
- segments:
112
- - 0
113
- version: "0"
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
114
97
  requirements: []
115
-
116
- rubyforge_project: ruby-rex
117
- rubygems_version: 1.3.7
118
- signing_key:
119
- specification_version: 3
120
- summary: Rexical is a lexical scanner generator
121
- test_files:
122
- - test/test_generator.rb
98
+ rubygems_version: 3.5.10
99
+ signing_key:
100
+ specification_version: 4
101
+ summary: Rexical is a lexical scanner generator that is used with Racc to generate
102
+ Ruby programs
103
+ test_files: []