rexical 1.0.5 → 1.0.8

Sign up to get free protection for your applications and to get access to all the features.
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: []