treetop 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. data/lib/treetop.rb +6 -0
  2. data/lib/treetop/api.rb +3 -0
  3. data/lib/treetop/api/load_grammar.rb +16 -0
  4. data/lib/treetop/api/malformed_grammar_exception.rb +9 -0
  5. data/lib/treetop/grammar.rb +7 -0
  6. data/lib/treetop/grammar/grammar.rb +48 -0
  7. data/lib/treetop/grammar/grammar_builder.rb +35 -0
  8. data/lib/treetop/grammar/parsing_expression_builder.rb +5 -0
  9. data/lib/treetop/grammar/parsing_expression_builder_helper.rb +121 -0
  10. data/lib/treetop/grammar/parsing_expressions.rb +18 -0
  11. data/lib/treetop/grammar/parsing_expressions/and_predicate.rb +17 -0
  12. data/lib/treetop/grammar/parsing_expressions/anything_symbol.rb +20 -0
  13. data/lib/treetop/grammar/parsing_expressions/character_class.rb +24 -0
  14. data/lib/treetop/grammar/parsing_expressions/node_instantiating_parsing_expression.rb +14 -0
  15. data/lib/treetop/grammar/parsing_expressions/node_propagating_parsing_expression.rb +4 -0
  16. data/lib/treetop/grammar/parsing_expressions/nonterminal_symbol.rb +42 -0
  17. data/lib/treetop/grammar/parsing_expressions/not_predicate.rb +18 -0
  18. data/lib/treetop/grammar/parsing_expressions/one_or_more.rb +12 -0
  19. data/lib/treetop/grammar/parsing_expressions/optional.rb +14 -0
  20. data/lib/treetop/grammar/parsing_expressions/ordered_choice.rb +27 -0
  21. data/lib/treetop/grammar/parsing_expressions/parsing_expression.rb +36 -0
  22. data/lib/treetop/grammar/parsing_expressions/predicate.rb +25 -0
  23. data/lib/treetop/grammar/parsing_expressions/repeating_parsing_expression.rb +29 -0
  24. data/lib/treetop/grammar/parsing_expressions/sequence.rb +41 -0
  25. data/lib/treetop/grammar/parsing_expressions/terminal_parsing_expression.rb +11 -0
  26. data/lib/treetop/grammar/parsing_expressions/terminal_symbol.rb +31 -0
  27. data/lib/treetop/grammar/parsing_expressions/zero_or_more.rb +11 -0
  28. data/lib/treetop/grammar/parsing_rule.rb +10 -0
  29. data/lib/treetop/metagrammar.rb +2 -0
  30. data/lib/treetop/metagrammar/metagrammar.rb +14 -0
  31. data/lib/treetop/metagrammar/metagrammar.treetop +320 -0
  32. data/lib/treetop/parser.rb +11 -0
  33. data/lib/treetop/parser/node_cache.rb +25 -0
  34. data/lib/treetop/parser/parse_cache.rb +17 -0
  35. data/lib/treetop/parser/parse_failure.rb +22 -0
  36. data/lib/treetop/parser/parse_result.rb +26 -0
  37. data/lib/treetop/parser/parser.rb +24 -0
  38. data/lib/treetop/parser/sequence_syntax_node.rb +14 -0
  39. data/lib/treetop/parser/syntax_node.rb +31 -0
  40. data/lib/treetop/parser/terminal_parse_failure.rb +18 -0
  41. data/lib/treetop/parser/terminal_syntax_node.rb +7 -0
  42. data/lib/treetop/protometagrammar.rb +16 -0
  43. data/lib/treetop/protometagrammar/anything_symbol_expression_builder.rb +13 -0
  44. data/lib/treetop/protometagrammar/block_expression_builder.rb +17 -0
  45. data/lib/treetop/protometagrammar/character_class_expression_builder.rb +25 -0
  46. data/lib/treetop/protometagrammar/grammar_expression_builder.rb +38 -0
  47. data/lib/treetop/protometagrammar/nonterminal_symbol_expression_builder.rb +45 -0
  48. data/lib/treetop/protometagrammar/ordered_choice_expression_builder.rb +21 -0
  49. data/lib/treetop/protometagrammar/parsing_rule_expression_builder.rb +23 -0
  50. data/lib/treetop/protometagrammar/parsing_rule_sequence_expression_builder.rb +14 -0
  51. data/lib/treetop/protometagrammar/prefix_expression_builder.rb +25 -0
  52. data/lib/treetop/protometagrammar/primary_expression_builder.rb +71 -0
  53. data/lib/treetop/protometagrammar/protometagrammar.rb +25 -0
  54. data/lib/treetop/protometagrammar/sequence_expression_builder.rb +37 -0
  55. data/lib/treetop/protometagrammar/suffix_expression_builder.rb +33 -0
  56. data/lib/treetop/protometagrammar/terminal_symbol_expression_builder.rb +52 -0
  57. data/lib/treetop/protometagrammar/trailing_block_expression_builder.rb +30 -0
  58. data/lib/treetop/ruby_extension.rb +11 -0
  59. metadata +110 -0
@@ -0,0 +1,71 @@
1
+ module Treetop
2
+ class Protometagrammar
3
+ class PrimaryExpressionBuilder < ParsingExpressionBuilder
4
+ def build
5
+ seq(optional(:prefix), rest) do
6
+ def value(grammar)
7
+ if prefix.epsilon?
8
+ rest.value(grammar)
9
+ else
10
+ prefix.value(rest.value(grammar))
11
+ end
12
+ end
13
+
14
+ def prefix
15
+ elements[0]
16
+ end
17
+
18
+ def rest
19
+ elements[1]
20
+ end
21
+ end
22
+ end
23
+
24
+ def rest
25
+ seq(primary_expression, optional(:suffix)) do
26
+ def value(grammar)
27
+ if suffix.epsilon?
28
+ primary_expression.value(grammar)
29
+ else
30
+ suffix.value(primary_expression.value(grammar))
31
+ end
32
+ end
33
+
34
+ def primary_expression
35
+ elements[0]
36
+ end
37
+
38
+ def suffix
39
+ elements[1]
40
+ end
41
+ end
42
+ end
43
+
44
+ def primary_expression
45
+ choice parenthesized_ordered_choice,
46
+ :terminal_symbol,
47
+ :nonterminal_symbol
48
+ end
49
+
50
+ def parenthesized_ordered_choice
51
+ seq('(', optional(:space), :ordered_choice, optional(:space), ')', :trailing_block) do
52
+ def value(grammar)
53
+ nested_value = nested_expression.value(grammar)
54
+ unless trailing_block.epsilon? || nested_value.kind_of?(NodeInstantiatingParsingExpression)
55
+ raise "Blocks can only follow node-instantiating parsing expressions such as sequences and terminal symbols."
56
+ end
57
+ return trailing_block.value(nested_expression.value(grammar))
58
+ end
59
+
60
+ def nested_expression
61
+ elements[2]
62
+ end
63
+
64
+ def trailing_block
65
+ elements[5]
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,25 @@
1
+ module Treetop
2
+ class Protometagrammar < Grammar
3
+ def initialize
4
+ super
5
+ build do
6
+ rule :grammar, GrammarExpressionBuilder.new
7
+ rule :parsing_rule_sequence, ParsingRuleSequenceExpressionBuilder.new
8
+ rule :parsing_rule, ParsingRuleExpressionBuilder.new
9
+ rule :ordered_choice, OrderedChoiceExpressionBuilder.new
10
+ rule :sequence, SequenceExpressionBuilder.new
11
+ rule :primary, PrimaryExpressionBuilder.new
12
+ rule :prefix, PrefixExpressionBuilder.new
13
+ rule :suffix, SuffixExpressionBuilder.new
14
+ rule :nonterminal_symbol, NonterminalSymbolExpressionBuilder.new
15
+ rule :terminal_symbol, TerminalSymbolExpressionBuilder.new
16
+ rule :character_class, CharacterClassExpressionBuilder.new
17
+ rule :anything_symbol, AnythingSymbolExpressionBuilder.new
18
+ rule :block, BlockExpressionBuilder.new
19
+ rule :trailing_block, TrailingBlockExpressionBuilder.new
20
+ rule :space, one_or_more(char_class(" \t\n\r"))
21
+ rule :keyword, choice('rule', 'end')
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,37 @@
1
+ module Treetop
2
+ class Protometagrammar
3
+ class SequenceExpressionBuilder < ParsingExpressionBuilder
4
+ def build
5
+ choice(sequence_with_block, :primary)
6
+ end
7
+
8
+ def sequence_with_block
9
+ seq(sequence, :trailing_block) do
10
+ def value(grammar)
11
+ trailing_block.value(sequence.value(grammar))
12
+ end
13
+
14
+ def sequence
15
+ elements[0]
16
+ end
17
+
18
+ def trailing_block
19
+ elements[1]
20
+ end
21
+ end
22
+ end
23
+
24
+ def sequence
25
+ two_or_more_delimited(:primary, :space) do
26
+ def value(grammar)
27
+ Sequence.new(element_values(grammar))
28
+ end
29
+
30
+ def element_values(grammar)
31
+ elements.collect { |element| element.value(grammar) }
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,33 @@
1
+ module Treetop
2
+ class Protometagrammar
3
+ class SuffixExpressionBuilder < ParsingExpressionBuilder
4
+ def build
5
+ choice(zero_or_more_terminal, one_or_more_terminal, optional)
6
+ end
7
+
8
+ def zero_or_more_terminal
9
+ exp('*') do
10
+ def value(parsing_expression)
11
+ parsing_expression.zero_or_more
12
+ end
13
+ end
14
+ end
15
+
16
+ def one_or_more_terminal
17
+ exp('+') do
18
+ def value(parsing_expression)
19
+ parsing_expression.one_or_more
20
+ end
21
+ end
22
+ end
23
+
24
+ def optional
25
+ exp('?') do
26
+ def value(parsing_expression)
27
+ parsing_expression.optional
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,52 @@
1
+ module Treetop
2
+ class Protometagrammar
3
+ class TerminalSymbolExpressionBuilder < ParsingExpressionBuilder
4
+ module TerminalStringSyntaxNode
5
+ def prefix
6
+ elements[1].text_value
7
+ end
8
+
9
+ def value
10
+ TerminalSymbol.new(prefix)
11
+ end
12
+ end
13
+
14
+ def build
15
+ seq(choice(single_quoted_string, double_quoted_string, :character_class, :anything_symbol),
16
+ :trailing_block) do
17
+ def value(grammar = nil)
18
+ trailing_block.value(terminal.value)
19
+ end
20
+
21
+ def terminal
22
+ elements[0]
23
+ end
24
+
25
+ def trailing_block
26
+ elements[1]
27
+ end
28
+ end
29
+ end
30
+
31
+ def double_quoted_string
32
+ seq('"', zero_or_more(double_quoted_string_char), '"') do
33
+ include TerminalStringSyntaxNode
34
+ end
35
+ end
36
+
37
+ def double_quoted_string_char
38
+ seq(notp('"'), choice(escaped('"'), any))
39
+ end
40
+
41
+ def single_quoted_string
42
+ seq("'", zero_or_more(single_quoted_string_char), "'") do
43
+ include TerminalStringSyntaxNode
44
+ end
45
+ end
46
+
47
+ def single_quoted_string_char
48
+ seq(notp("'"), choice(escaped("'"), any))
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,30 @@
1
+ module Treetop
2
+ class Protometagrammar
3
+ class TrailingBlockExpressionBuilder < ParsingExpressionBuilder
4
+ def build
5
+ choice(trailing_block, nothing)
6
+ end
7
+
8
+ def trailing_block
9
+ seq(:space, :block) do
10
+ def value(parsing_expression)
11
+ parsing_expression.node_class_eval(block.value)
12
+ return parsing_expression
13
+ end
14
+
15
+ def block
16
+ elements[1]
17
+ end
18
+ end
19
+ end
20
+
21
+ def nothing
22
+ exp('') do
23
+ def value(parsing_expression)
24
+ parsing_expression
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,11 @@
1
+ class Symbol
2
+ def to_proc
3
+ proc { |obj, *args| obj.send(self, *args) }
4
+ end
5
+ end
6
+
7
+ class String
8
+ def blank?
9
+ self == ""
10
+ end
11
+ end
metadata ADDED
@@ -0,0 +1,110 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.2
3
+ specification_version: 1
4
+ name: treetop
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.1.0
7
+ date: 2007-05-22 00:00:00 -07:00
8
+ summary: A Ruby-based text parsing and interpretation DSL
9
+ require_paths:
10
+ - lib
11
+ email: nathansobo@gmail.com
12
+ homepage: http://functionalform.blogspot.com
13
+ rubyforge_project:
14
+ description:
15
+ autorequire: treetop
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
+ - Nathan Sobo
31
+ files:
32
+ - lib/treetop
33
+ - lib/treetop/api
34
+ - lib/treetop/api/load_grammar.rb
35
+ - lib/treetop/api/malformed_grammar_exception.rb
36
+ - lib/treetop/api.rb
37
+ - lib/treetop/grammar
38
+ - lib/treetop/grammar/grammar.rb
39
+ - lib/treetop/grammar/grammar_builder.rb
40
+ - lib/treetop/grammar/parsing_expression_builder.rb
41
+ - lib/treetop/grammar/parsing_expression_builder_helper.rb
42
+ - lib/treetop/grammar/parsing_expressions
43
+ - lib/treetop/grammar/parsing_expressions/and_predicate.rb
44
+ - lib/treetop/grammar/parsing_expressions/anything_symbol.rb
45
+ - lib/treetop/grammar/parsing_expressions/character_class.rb
46
+ - lib/treetop/grammar/parsing_expressions/node_instantiating_parsing_expression.rb
47
+ - lib/treetop/grammar/parsing_expressions/node_propagating_parsing_expression.rb
48
+ - lib/treetop/grammar/parsing_expressions/nonterminal_symbol.rb
49
+ - lib/treetop/grammar/parsing_expressions/not_predicate.rb
50
+ - lib/treetop/grammar/parsing_expressions/one_or_more.rb
51
+ - lib/treetop/grammar/parsing_expressions/optional.rb
52
+ - lib/treetop/grammar/parsing_expressions/ordered_choice.rb
53
+ - lib/treetop/grammar/parsing_expressions/parsing_expression.rb
54
+ - lib/treetop/grammar/parsing_expressions/predicate.rb
55
+ - lib/treetop/grammar/parsing_expressions/repeating_parsing_expression.rb
56
+ - lib/treetop/grammar/parsing_expressions/sequence.rb
57
+ - lib/treetop/grammar/parsing_expressions/terminal_parsing_expression.rb
58
+ - lib/treetop/grammar/parsing_expressions/terminal_symbol.rb
59
+ - lib/treetop/grammar/parsing_expressions/zero_or_more.rb
60
+ - lib/treetop/grammar/parsing_expressions.rb
61
+ - lib/treetop/grammar/parsing_rule.rb
62
+ - lib/treetop/grammar.rb
63
+ - lib/treetop/metagrammar
64
+ - lib/treetop/metagrammar/metagrammar.rb
65
+ - lib/treetop/metagrammar/metagrammar.treetop
66
+ - lib/treetop/metagrammar.rb
67
+ - lib/treetop/parser
68
+ - lib/treetop/parser/node_cache.rb
69
+ - lib/treetop/parser/parse_cache.rb
70
+ - lib/treetop/parser/parse_failure.rb
71
+ - lib/treetop/parser/parse_result.rb
72
+ - lib/treetop/parser/parser.rb
73
+ - lib/treetop/parser/sequence_syntax_node.rb
74
+ - lib/treetop/parser/syntax_node.rb
75
+ - lib/treetop/parser/terminal_parse_failure.rb
76
+ - lib/treetop/parser/terminal_syntax_node.rb
77
+ - lib/treetop/parser.rb
78
+ - lib/treetop/protometagrammar
79
+ - lib/treetop/protometagrammar/anything_symbol_expression_builder.rb
80
+ - lib/treetop/protometagrammar/block_expression_builder.rb
81
+ - lib/treetop/protometagrammar/character_class_expression_builder.rb
82
+ - lib/treetop/protometagrammar/grammar_expression_builder.rb
83
+ - lib/treetop/protometagrammar/nonterminal_symbol_expression_builder.rb
84
+ - lib/treetop/protometagrammar/ordered_choice_expression_builder.rb
85
+ - lib/treetop/protometagrammar/parsing_rule_expression_builder.rb
86
+ - lib/treetop/protometagrammar/parsing_rule_sequence_expression_builder.rb
87
+ - lib/treetop/protometagrammar/prefix_expression_builder.rb
88
+ - lib/treetop/protometagrammar/primary_expression_builder.rb
89
+ - lib/treetop/protometagrammar/protometagrammar.rb
90
+ - lib/treetop/protometagrammar/sequence_expression_builder.rb
91
+ - lib/treetop/protometagrammar/suffix_expression_builder.rb
92
+ - lib/treetop/protometagrammar/terminal_symbol_expression_builder.rb
93
+ - lib/treetop/protometagrammar/trailing_block_expression_builder.rb
94
+ - lib/treetop/protometagrammar.rb
95
+ - lib/treetop/ruby_extension.rb
96
+ - lib/treetop.rb
97
+ test_files: []
98
+
99
+ rdoc_options: []
100
+
101
+ extra_rdoc_files: []
102
+
103
+ executables: []
104
+
105
+ extensions: []
106
+
107
+ requirements: []
108
+
109
+ dependencies: []
110
+