ghostwheel 0.0.1

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 (50) hide show
  1. data/Rakefile +46 -0
  2. data/lib/ghost_wheel.rb +28 -0
  3. data/lib/ghost_wheel/build_parser.rb +11 -0
  4. data/lib/ghost_wheel/errors.rb +9 -0
  5. data/lib/ghost_wheel/expression.rb +22 -0
  6. data/lib/ghost_wheel/expression/alternation.rb +25 -0
  7. data/lib/ghost_wheel/expression/empty.rb +15 -0
  8. data/lib/ghost_wheel/expression/end_of_file.rb +19 -0
  9. data/lib/ghost_wheel/expression/literal.rb +31 -0
  10. data/lib/ghost_wheel/expression/look_ahead.rb +33 -0
  11. data/lib/ghost_wheel/expression/optional.rb +26 -0
  12. data/lib/ghost_wheel/expression/query.rb +32 -0
  13. data/lib/ghost_wheel/expression/repetition.rb +44 -0
  14. data/lib/ghost_wheel/expression/rule.rb +24 -0
  15. data/lib/ghost_wheel/expression/sequence.rb +30 -0
  16. data/lib/ghost_wheel/expression/transform.rb +30 -0
  17. data/lib/ghost_wheel/parse_results.rb +9 -0
  18. data/lib/ghost_wheel/parser.rb +71 -0
  19. data/lib/ghost_wheel/parser_builder/ghost_wheel.rb +100 -0
  20. data/lib/ghost_wheel/parser_builder/ruby.rb +175 -0
  21. data/lib/ghost_wheel/scanner.rb +42 -0
  22. data/setup.rb +1360 -0
  23. data/test/dsl/tc_build_parser.rb +29 -0
  24. data/test/dsl/tc_ghost_wheel_dsl.rb +143 -0
  25. data/test/dsl/tc_ruby_dsl.rb +227 -0
  26. data/test/example/tc_json_core.rb +95 -0
  27. data/test/example/tc_json_ghost_wheel.rb +48 -0
  28. data/test/example/tc_json_ruby.rb +81 -0
  29. data/test/helpers/ghost_wheel_namespace.rb +24 -0
  30. data/test/helpers/json_tests.rb +63 -0
  31. data/test/helpers/parse_helpers.rb +83 -0
  32. data/test/parser/tc_alternation_expression.rb +27 -0
  33. data/test/parser/tc_empty_expression.rb +15 -0
  34. data/test/parser/tc_end_of_file_expression.rb +27 -0
  35. data/test/parser/tc_literal_expression.rb +55 -0
  36. data/test/parser/tc_look_ahead_expression.rb +41 -0
  37. data/test/parser/tc_memoization.rb +31 -0
  38. data/test/parser/tc_optional_expression.rb +31 -0
  39. data/test/parser/tc_parser.rb +78 -0
  40. data/test/parser/tc_query_expression.rb +40 -0
  41. data/test/parser/tc_repetition_expression.rb +76 -0
  42. data/test/parser/tc_rule_expression.rb +32 -0
  43. data/test/parser/tc_scanning.rb +192 -0
  44. data/test/parser/tc_sequence_expression.rb +42 -0
  45. data/test/parser/tc_transform_expression.rb +77 -0
  46. data/test/ts_all.rb +7 -0
  47. data/test/ts_dsl.rb +8 -0
  48. data/test/ts_example.rb +7 -0
  49. data/test/ts_parser.rb +19 -0
  50. metadata +94 -0
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env ruby -w
2
+
3
+ require "test/unit"
4
+
5
+ require File.join(File.dirname(__FILE__), %w[.. helpers ghost_wheel_namespace])
6
+ require File.join(File.dirname(__FILE__), %w[.. helpers parse_helpers])
7
+
8
+ class TestSequenceExpression < Test::Unit::TestCase
9
+ include GhostWheelNamespace
10
+ include ParseHelpers
11
+
12
+ def setup
13
+ @source = Scanner.new("3 + 42")
14
+ end
15
+
16
+ def test_match
17
+ assert_parses( %w[3 \ + \ 42],
18
+ parse_sequence("3", /\s*/, ?+, /\s*/, /\d+/) )
19
+ end
20
+
21
+ def test_failed_match
22
+ assert_doesnt_parse(parse_sequence("3", /\s*/, ?*, /\s*/, /\d+/))
23
+ end
24
+
25
+ def test_sequence_trims_empty_results
26
+ e = Empty.instance
27
+ assert_parses( %w[3 \ + \ 42],
28
+ parse_sequence("3", e, /\s*/, ?+, e, /\s*/, /\d+/, e) )
29
+ end
30
+
31
+ def test_equality
32
+ assert_not_equal(Sequence.new(Literal.new("one")), Sequence.new)
33
+ assert_not_equal( Sequence.new(Literal.new("one"), Literal.new("two")),
34
+ Sequence.new(Literal.new("one")) )
35
+ assert_not_equal( Sequence.new(Literal.new("one"), Literal.new("two")),
36
+ Sequence.new(Literal.new("a"), Literal.new("b")) )
37
+
38
+ assert_equal(Sequence.new, Sequence.new)
39
+ assert_equal( Sequence.new(Literal.new("one"), Literal.new("two")),
40
+ Sequence.new(Literal.new("one"), Literal.new("two")) )
41
+ end
42
+ end
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env ruby -w
2
+
3
+ require "test/unit"
4
+
5
+ require File.join(File.dirname(__FILE__), %w[.. helpers ghost_wheel_namespace])
6
+ require File.join(File.dirname(__FILE__), %w[.. helpers parse_helpers])
7
+
8
+ class TestTransformExpression < Test::Unit::TestCase
9
+ include GhostWheelNamespace
10
+ include ParseHelpers
11
+
12
+ def test_transform_changes_parse_result
13
+ @parser = Transform.new(Literal.new(/(?:\\n|\\\\|[^\\]+)/)) do |str|
14
+ str == "\\\\" ? "\\" : str == "\\n" ? "\n" : str
15
+ end
16
+
17
+ assert_parses("\n", parse("\\n"))
18
+ assert_parses("word", parse("word"))
19
+ assert_parses("\\", parse("\\\\"))
20
+ end
21
+
22
+ def test_building_up_a_complex_object_with_transforms
23
+ build_hash_parser
24
+
25
+ assert_parses(Hash.new, parse("{}"))
26
+ assert_parses({"James" => "Gray"}, parse(%Q{{"James" : "Gray"}}))
27
+ assert_parses( {"James" => "Gray", "Greg" => "Brown"},
28
+ parse(%Q{{"James": "Gray"; "Greg": "Brown"}}) )
29
+ end
30
+
31
+ def test_yields_empty
32
+ Transform.new(Empty.instance) do |empty|
33
+ assert_instance_of(EmptyParseResult, empty)
34
+ end.parse(Scanner.new("not_used"))
35
+ end
36
+
37
+ def test_equality
38
+ assert_not_equal( Transform.new(Literal.new("one")) { },
39
+ Transform.new(Literal.new("two")) { } )
40
+ assert_not_equal( Transform.new(Literal.new("one")) { Array.new },
41
+ Transform.new(Literal.new("one")) { } )
42
+
43
+ block = lambda { Array.new } # must be *exact* same block
44
+ assert_equal( Transform.new(Literal.new("one"), &block),
45
+ Transform.new(Literal.new("one"), &block) )
46
+ end
47
+
48
+ private
49
+
50
+ def build_hash_parser
51
+ # optional whitespace
52
+ space = Optional.new(Literal.new(/\s+/, true))
53
+ # a string literal
54
+ string = Transform.new(Literal.new(/"[^"]*"/)) { |str| str[1..-2] }
55
+ # a key/value pair in the Hash
56
+ pair = Transform.new(
57
+ Sequence.new(string, space, Literal.new(":"), space, string)
58
+ ) { |key_and_val| {key_and_val.first => key_and_val.last} }
59
+ # a pair plus separator
60
+ join = Sequence.new(pair, space, Literal.new(";", true), space)
61
+ # the primary parser for merging a sequence of pairs into a Ruby Hash
62
+ @parser = Transform.new(
63
+ Sequence.new(
64
+ Literal.new("{", true),
65
+ space,
66
+ Alternation.new(
67
+ Transform.new(
68
+ Sequence.new(Repetition.new(join, 1), pair)
69
+ ) { |pairs| pairs.first.first + [pairs.last] },
70
+ Sequence.new(Optional.new(pair))
71
+ ),
72
+ space,
73
+ Literal.new("}", true)
74
+ )
75
+ ) { |pairs| pairs.first.inject(Hash.new) { |hash, pair| hash.merge(pair) } }
76
+ end
77
+ end
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby -w
2
+
3
+ require "test/unit"
4
+
5
+ require "ts_parser"
6
+ require "ts_dsl"
7
+ require "ts_example"
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby -w
2
+
3
+ require "test/unit"
4
+
5
+ require "dsl/tc_ruby_dsl"
6
+ require "dsl/tc_ghost_wheel_dsl"
7
+
8
+ require "dsl/tc_build_parser"
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby -w
2
+
3
+ require "test/unit"
4
+
5
+ require "example/tc_json_core.rb"
6
+ require "example/tc_json_ruby.rb"
7
+ require "example/tc_json_ghost_wheel.rb"
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby -w
2
+
3
+ require "test/unit"
4
+
5
+ require "parser/tc_scanning"
6
+
7
+ require "parser/tc_literal_expression"
8
+ require "parser/tc_sequence_expression"
9
+ require "parser/tc_alternation_expression"
10
+ require "parser/tc_empty_expression"
11
+ require "parser/tc_optional_expression"
12
+ require "parser/tc_repetition_expression"
13
+ require "parser/tc_look_ahead_expression"
14
+ require "parser/tc_end_of_file_expression"
15
+ require "parser/tc_query_expression"
16
+ require "parser/tc_transform_expression"
17
+ require "parser/tc_rule_expression"
18
+
19
+ require "parser/tc_memoization"
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.4
3
+ specification_version: 1
4
+ name: ghostwheel
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.0.1
7
+ date: 2007-07-02 00:00:00 -05:00
8
+ summary: Ghost Wheel is a pure Ruby parser generator.
9
+ require_paths:
10
+ - lib
11
+ email: james@grayproductions.net
12
+ homepage: http://ghostwheel.rubyforge.org
13
+ rubyforge_project: ghostwheel
14
+ description: Ghost Wheel is a packrat parser generator handling scanning and parsing of context-free grammars. Parsers can be built using an EBNF-like syntax or a with a Ruby DSL.
15
+ autorequire:
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: false
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors:
30
+ - James Edward Gray II
31
+ files:
32
+ - lib/ghost_wheel/build_parser.rb
33
+ - lib/ghost_wheel/errors.rb
34
+ - lib/ghost_wheel/expression/alternation.rb
35
+ - lib/ghost_wheel/expression/empty.rb
36
+ - lib/ghost_wheel/expression/end_of_file.rb
37
+ - lib/ghost_wheel/expression/literal.rb
38
+ - lib/ghost_wheel/expression/look_ahead.rb
39
+ - lib/ghost_wheel/expression/optional.rb
40
+ - lib/ghost_wheel/expression/query.rb
41
+ - lib/ghost_wheel/expression/repetition.rb
42
+ - lib/ghost_wheel/expression/rule.rb
43
+ - lib/ghost_wheel/expression/sequence.rb
44
+ - lib/ghost_wheel/expression/transform.rb
45
+ - lib/ghost_wheel/expression.rb
46
+ - lib/ghost_wheel/parse_results.rb
47
+ - lib/ghost_wheel/parser.rb
48
+ - lib/ghost_wheel/parser_builder/ghost_wheel.rb
49
+ - lib/ghost_wheel/parser_builder/ruby.rb
50
+ - lib/ghost_wheel/scanner.rb
51
+ - lib/ghost_wheel.rb
52
+ - test/dsl/tc_build_parser.rb
53
+ - test/dsl/tc_ghost_wheel_dsl.rb
54
+ - test/dsl/tc_ruby_dsl.rb
55
+ - test/example/tc_json_core.rb
56
+ - test/example/tc_json_ghost_wheel.rb
57
+ - test/example/tc_json_ruby.rb
58
+ - test/helpers/ghost_wheel_namespace.rb
59
+ - test/helpers/json_tests.rb
60
+ - test/helpers/parse_helpers.rb
61
+ - test/parser/tc_alternation_expression.rb
62
+ - test/parser/tc_empty_expression.rb
63
+ - test/parser/tc_end_of_file_expression.rb
64
+ - test/parser/tc_literal_expression.rb
65
+ - test/parser/tc_look_ahead_expression.rb
66
+ - test/parser/tc_memoization.rb
67
+ - test/parser/tc_optional_expression.rb
68
+ - test/parser/tc_parser.rb
69
+ - test/parser/tc_query_expression.rb
70
+ - test/parser/tc_repetition_expression.rb
71
+ - test/parser/tc_rule_expression.rb
72
+ - test/parser/tc_scanning.rb
73
+ - test/parser/tc_sequence_expression.rb
74
+ - test/parser/tc_transform_expression.rb
75
+ - test/ts_all.rb
76
+ - test/ts_dsl.rb
77
+ - test/ts_example.rb
78
+ - test/ts_parser.rb
79
+ - Rakefile
80
+ - setup.rb
81
+ test_files:
82
+ - test/ts_all.rb
83
+ rdoc_options: []
84
+
85
+ extra_rdoc_files: []
86
+
87
+ executables: []
88
+
89
+ extensions: []
90
+
91
+ requirements: []
92
+
93
+ dependencies: []
94
+