treetop 0.1.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.
- data/lib/treetop.rb +6 -0
- data/lib/treetop/api.rb +3 -0
- data/lib/treetop/api/load_grammar.rb +16 -0
- data/lib/treetop/api/malformed_grammar_exception.rb +9 -0
- data/lib/treetop/grammar.rb +7 -0
- data/lib/treetop/grammar/grammar.rb +48 -0
- data/lib/treetop/grammar/grammar_builder.rb +35 -0
- data/lib/treetop/grammar/parsing_expression_builder.rb +5 -0
- data/lib/treetop/grammar/parsing_expression_builder_helper.rb +121 -0
- data/lib/treetop/grammar/parsing_expressions.rb +18 -0
- data/lib/treetop/grammar/parsing_expressions/and_predicate.rb +17 -0
- data/lib/treetop/grammar/parsing_expressions/anything_symbol.rb +20 -0
- data/lib/treetop/grammar/parsing_expressions/character_class.rb +24 -0
- data/lib/treetop/grammar/parsing_expressions/node_instantiating_parsing_expression.rb +14 -0
- data/lib/treetop/grammar/parsing_expressions/node_propagating_parsing_expression.rb +4 -0
- data/lib/treetop/grammar/parsing_expressions/nonterminal_symbol.rb +42 -0
- data/lib/treetop/grammar/parsing_expressions/not_predicate.rb +18 -0
- data/lib/treetop/grammar/parsing_expressions/one_or_more.rb +12 -0
- data/lib/treetop/grammar/parsing_expressions/optional.rb +14 -0
- data/lib/treetop/grammar/parsing_expressions/ordered_choice.rb +27 -0
- data/lib/treetop/grammar/parsing_expressions/parsing_expression.rb +36 -0
- data/lib/treetop/grammar/parsing_expressions/predicate.rb +25 -0
- data/lib/treetop/grammar/parsing_expressions/repeating_parsing_expression.rb +29 -0
- data/lib/treetop/grammar/parsing_expressions/sequence.rb +41 -0
- data/lib/treetop/grammar/parsing_expressions/terminal_parsing_expression.rb +11 -0
- data/lib/treetop/grammar/parsing_expressions/terminal_symbol.rb +31 -0
- data/lib/treetop/grammar/parsing_expressions/zero_or_more.rb +11 -0
- data/lib/treetop/grammar/parsing_rule.rb +10 -0
- data/lib/treetop/metagrammar.rb +2 -0
- data/lib/treetop/metagrammar/metagrammar.rb +14 -0
- data/lib/treetop/metagrammar/metagrammar.treetop +320 -0
- data/lib/treetop/parser.rb +11 -0
- data/lib/treetop/parser/node_cache.rb +25 -0
- data/lib/treetop/parser/parse_cache.rb +17 -0
- data/lib/treetop/parser/parse_failure.rb +22 -0
- data/lib/treetop/parser/parse_result.rb +26 -0
- data/lib/treetop/parser/parser.rb +24 -0
- data/lib/treetop/parser/sequence_syntax_node.rb +14 -0
- data/lib/treetop/parser/syntax_node.rb +31 -0
- data/lib/treetop/parser/terminal_parse_failure.rb +18 -0
- data/lib/treetop/parser/terminal_syntax_node.rb +7 -0
- data/lib/treetop/protometagrammar.rb +16 -0
- data/lib/treetop/protometagrammar/anything_symbol_expression_builder.rb +13 -0
- data/lib/treetop/protometagrammar/block_expression_builder.rb +17 -0
- data/lib/treetop/protometagrammar/character_class_expression_builder.rb +25 -0
- data/lib/treetop/protometagrammar/grammar_expression_builder.rb +38 -0
- data/lib/treetop/protometagrammar/nonterminal_symbol_expression_builder.rb +45 -0
- data/lib/treetop/protometagrammar/ordered_choice_expression_builder.rb +21 -0
- data/lib/treetop/protometagrammar/parsing_rule_expression_builder.rb +23 -0
- data/lib/treetop/protometagrammar/parsing_rule_sequence_expression_builder.rb +14 -0
- data/lib/treetop/protometagrammar/prefix_expression_builder.rb +25 -0
- data/lib/treetop/protometagrammar/primary_expression_builder.rb +71 -0
- data/lib/treetop/protometagrammar/protometagrammar.rb +25 -0
- data/lib/treetop/protometagrammar/sequence_expression_builder.rb +37 -0
- data/lib/treetop/protometagrammar/suffix_expression_builder.rb +33 -0
- data/lib/treetop/protometagrammar/terminal_symbol_expression_builder.rb +52 -0
- data/lib/treetop/protometagrammar/trailing_block_expression_builder.rb +30 -0
- data/lib/treetop/ruby_extension.rb +11 -0
- 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
|
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
|
+
|