gdstruct 0.7.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fef01d7f449d89ce26830c18a8bf62d20881a2fa
4
- data.tar.gz: ee4e20e7a886044912a7f099491ba36620fe4e1b
3
+ metadata.gz: f96efc7733498eb16613dbfabaed79b827ce987d
4
+ data.tar.gz: 639bc923e3876452c585e585253c1d4b5ebb2dbc
5
5
  SHA512:
6
- metadata.gz: 7bc6cfe4c57a9153e1d1fe07e03e86590b4343ab0007ea259013fa897f44feb5b87a2dcd978a16e7d324a47ceb6eab4579f84bb3c8e55ed4cd86372770f123da
7
- data.tar.gz: f5b3608b34efe544213e6202a5ada993ba879ea8c23f65657aecf3f5f873b4fa0b7d8aca7f2a6a623b1b71035a44432819b07d52bcc7300392bd8df0d5f6d9aa
6
+ metadata.gz: b5a43713b959ee3260c8f03e08674ab1263df96bddfc019a31bcaed6e99678577607747e45f0e44ca0a9b84a9e32e615cc05ae5d544b30c6df15ee8031370b76
7
+ data.tar.gz: b603543062ed53adaadbd1866d5945a5aa3824e6fd8974e013a4fbf2b99787eb14d3cc58035fa17fc2cd502565afcbfd7c1a16b0f5c53178bd3ddfd1a5c0e65f
@@ -1,5 +1,74 @@
1
1
  # CHANGELOG
2
2
 
3
+ ### 0.8.0 - (2018-12-14)
4
+
5
+ * __feature__
6
+ string interpolation
7
+ the values of variables are substituted into string literals
8
+ string interpolation works for double-quoted strings and default strings
9
+ example:
10
+ $object = house
11
+ setup "This is a $(object)."
12
+ # => { setup: "This is a house." }
13
+
14
+ * __feature__
15
+ schema definition:
16
+ if there are more values listed than keys for the schema specifier are defined, then an exception is raised
17
+ if there are less values listed than keys for the schema specifier are defined, then only the keys for the available values will be set
18
+
19
+ * __breaking change__, __bugfix__
20
+ in array definition with schema specifier
21
+ syntax change: now after colon (:) for defining a hash, there needs to be at least one space character between the colon
22
+ and the next expression on the same line
23
+
24
+ * __feature__
25
+ schema specifiers can now also be defined at the time of use
26
+ example:
27
+ persons1 , @schema person(firstname,lastname,age)
28
+ : Harry | Langemann | 44
29
+ : Susi | Heimstett | 32
30
+ persons2 , @schema person
31
+ : Ludwig | Reinemann | 33
32
+
33
+ * __feature__
34
+ anonymous schema specifiers
35
+ defined when used, defined without a name, for one-time use
36
+ example:
37
+ persons , @schema(firstname,lastname,age)
38
+ : Harry | Langemann | 44
39
+
40
+ * __breaking change__
41
+ change of the definition of a schema specifier
42
+ before : $name(key1,key2,...)
43
+ now : @schema name(key1,key2,...)
44
+ this makes it different from variables
45
+ change of the use of a schema specifier
46
+ before : , $name
47
+ now : , @schema name
48
+
49
+ * __breaking change__
50
+ default strings are no longer allowed to begin with one of the following characters: ;$!@&*:,
51
+ exception is a beginning string interpolation: $(var)
52
+
53
+ * __feature__
54
+ for a reference (e.g. ref)
55
+ @merge *ref : in a hash
56
+ @insert *ref : in an array
57
+
58
+ * __feature__
59
+ supporting references, definition: &ref, use: *ref
60
+ if a reference is used which was not defined before, then an exception is raised
61
+
62
+ * __feature__
63
+ @na directive (na = not available) inside definitions with schema specifiers
64
+
65
+ * __feature__
66
+ if a schema specifier is used which was not defined before, then an exception is raised
67
+
68
+ * __feature__
69
+ supporting variables, $variable
70
+ if a variable is used which was not defined before, then an exception is raised
71
+
3
72
  ### 0.7.1 - (2018-11-12)
4
73
 
5
74
  * __bugfix__
data/README.md CHANGED
@@ -1,194 +1,194 @@
1
- gdstruct - GDS - General Data Structure
2
- =======================================
3
-
4
- A General Data Structure (GDS) is a universal, composable data structure, used to store any kind of data.
5
- This could be for example the definition of configurations, specifications and data sets.
6
- Typical usage is the definition of configurations, specifications and data sets.
7
- The GDS language is a special DSL (domain specific language) for defining general data structures.
8
- It uses a succinct, indentation-sensitive syntax which makes data representation clear and readable.
9
- The building blocks for general data structures are hashes and arrays.
10
-
11
- Installation
12
- ============
13
-
14
- ~~~
15
- gem install gdstruct
16
- ~~~
17
-
18
- A Short Example
19
- ===============
20
-
21
- ~~~
22
- require "gdstruct"
23
-
24
- h = GDstruct.c( <<-EOS )
25
- a val a
26
- b val b
27
- EOS
28
-
29
- # => h = { a: 'val a', b: 'val b' }
30
- ~~~
31
-
32
- An Introduction
33
- ===============
34
-
35
- The GDS language uses two basic symbols (__:__ and __,__) for the creation of hashes and arrays.
36
-
37
- A colon (__:__) is used to define a hash.
38
- A comma (__,__) is used to define an array.
39
-
40
- Use indentation with two spaces for the definition of elements and for nested structures.
41
- Tab characters are not allowed for indentation.
42
-
43
- ## Another Example
44
-
45
- ~~~
46
- caption foo
47
- credit bar
48
- images
49
- small
50
- url http://mywebsite.com/image-small.jpg
51
- dimensions
52
- height 500
53
- width 500
54
- large
55
- url http://mywebsite.com/image-large.jpg
56
- dimensions
57
- height 500
58
- width 500
59
- videos
60
- small
61
- preview http://mywebsite.com/video.m4v
62
- dimensions
63
- height 300
64
- width 400
65
- ~~~
66
-
67
- transforms to
68
-
69
- ~~~
70
- {
71
- :caption => 'foo',
72
- :credit => 'bar',
73
- :images => {
74
- :small => {
75
- :url => 'http://mywebsite.com/image-small.jpg',
76
- :dimensions => {
77
- :height => 500,
78
- :width => 500
79
- }
80
- },
81
- :large => {
82
- :url => 'http://mywebsite.com/image-large.jpg',
83
- :dimensions => {
84
- :height => 500,
85
- :width => 500
86
- }
87
- },
88
- },
89
- :videos => {
90
- :small => {
91
- :preview => 'http://mywebsite.com/video.m4v',
92
- :dimensions => {
93
- :height => 300,
94
- :width => 400
95
- }
96
- }
97
- }
98
- }
99
- ~~~
100
-
101
- ## General Example
102
-
103
- ~~~
104
- ,
105
- v1
106
- : k2 v2
107
- : k31 v31 | k32 v32 | k33 v33
108
- k34 v34
109
- k35 v35 | k36 v36
110
- :
111
- k41 v41
112
- k42 v42
113
- k43,
114
- k44, 1 | 2 | 3
115
- 4 | 5
116
- 6
117
- 7
118
- 8 | 9
119
- :k441 v441
120
- v5
121
-
122
- # => [ 'v1', { k2: 'v2' }, { k31: 'v31', k32: 'v32', k33: 'v33', k34: 'v34', k35: 'v35', k36: 'v36' },
123
- { k41: 'v41', k42: 'v42', k43: [], k44: [1, 2, 3, 4, 5, 6, 7, 8, 9, { k441: 'v441' } ] }, 'v5' ]
124
- ~~~
125
-
126
- ## Motivation and Features
127
-
128
- * the focus is on the essential data
129
- * structure and hierarchy is expressed using indentation (whitespace-sensitive) - avoids curly braces and square brackets
130
- * uses a succinct and minimalist syntax - tries to avoid unnecessary characters
131
- * in many cases colons, commas and quotes are not necessary
132
- * less text makes data clearer and more readable
133
- * for configuration and specification - replacement for XML, JSON, YAML
134
- * for data/database seeding
135
- * less text and less potential errors using schema definitions
136
- * supports block comments, which could be nested
137
- * allows also the definition of hash and array structures in a kind of restricted classic Ruby like syntax
138
- * provides an alternative for Ruby hash and array definition without using eval(); can be used as a protection against code injection vulnerabilities, e.g. on web servers
139
-
140
-
141
- ## Schema specifiers
142
-
143
- Schema specifiers can be used to predefine the keys of a hash or subhash.
144
- When you specify the values you no longer need to name the key for each value.
145
- This facilitates the input for hashes and prevents typos for keys.
146
- In combination with the pipe symbol (__\|__), which allows to define multiple values on a single line,
147
- this features a slim and clearly arranged, table-like style for data.
148
-
149
- ~~~
150
- $country(name,capital,area,population,vehicleRegistrationCode,iso3166code,callingCode)
151
- , $country /*
152
- name capital area (km^2) population vehicleRegistrationCode iso3166code callingCode
153
- ---------------------------------------------------------------------------------------------------------------------------- */
154
- : Deutschland | Berlin | 357_385 | 82_521_653 | D | DE | 49
155
- : USA | Washington, D.C. | 9_833_520 | 325_719_178 | USA | US | 1
156
- : China | Beijing | 9_596_961 | 1_403_500_365 | CHN | CN | 86
157
- : India | New Dehli | 3_287_469 | 1_339_180_000 | IND | IN | 91
158
- : Austria | Vienna | 83_878 | 8_822_267 | A | AT | 43
159
- : Denmark | Copenhagen | 42_921 | 5_748_769 | DK | DK | 45
160
- : Canada | Ottawa | 9_984_670 | 36_503_097 | CDN | CA | 1
161
- : France | Paris | 643_801 | 66_991_000 | F | FR | 33
162
- : Russia | Moscow | 17_075_400 | 144_526_636 | RUS | RU | 7
163
- ~~~
164
- transforms to
165
- ~~~
166
- [
167
- { :name=>"Deutschland", :capital=>"Berlin", :area=>357385, :population=>82521653, :vehicleRegistrationCode=>"D", :iso3166code=>"DE", :callingCode=>49 },
168
- { :name=>"USA", :capital=>"Washington, D.C.", :area=>9833520, :population=>325719178, :vehicleRegistrationCode=>"USA", :iso3166code=>"US", :callingCode=>1 },
169
- { :name=>"China", :capital=>"Beijing", :area=>9596961, :population=>1403500365, :vehicleRegistrationCode=>"CHN", :iso3166code=>"CN", :callingCode=>86 },
170
- { :name=>"India", :capital=>"New Dehli", :area=>3287469, :population=>1339180000, :vehicleRegistrationCode=>"IND", :iso3166code=>"IN", :callingCode=>91 },
171
- { :name=>"Austria", :capital=>"Vienna", :area=>83878, :population=>8822267, :vehicleRegistrationCode=>"A", :iso3166code=>"AT", :callingCode=>43 },
172
- { :name=>"Denmark", :capital=>"Copenhagen", :area=>42921, :population=>5748769, :vehicleRegistrationCode=>"DK", :iso3166code=>"DK", :callingCode=>45 },
173
- { :name=>"Canada", :capital=>"Ottawa", :area=>9984670, :population=>36503097, :vehicleRegistrationCode=>"CDN", :iso3166code=>"CA", :callingCode=>1 },
174
- { :name=>"France", :capital=>"Paris", :area=>643801, :population=>66991000, :vehicleRegistrationCode=>"F", :iso3166code=>"FR", :callingCode=>33 },
175
- { :name=>"Russia", :capital=>"Moscow", :area=>17075400, :population=>144526636, :vehicleRegistrationCode=>"RUS", :iso3166code=>"RU", :callingCode=>7 }
176
- ]
177
- ~~~
178
-
179
- Further Information
180
- ==================
181
-
182
- You will find further information here: [urasepandia.de/gds.html](https://urasepandia.de/gds.html)
183
-
184
- Maintainer
185
- ==========
186
-
187
- Uli Ramminger <uli@urasepandia.de>
188
-
189
- Copyright
190
- =========
191
-
192
- Copyright (c) 2018 Ulrich Ramminger
193
-
194
- See MIT-LICENSE for further details.
1
+ gdstruct - GDS - General Data Structure
2
+ =======================================
3
+
4
+ A General Data Structure (GDS) is a universal, composable data structure, used to store any kind of data.
5
+ This could be for example the definition of configurations, specifications and data sets.
6
+ Typical usage is the definition of configurations, specifications and data sets.
7
+ The GDS language is a special DSL (domain specific language) for defining general data structures.
8
+ It uses a succinct, indentation-sensitive syntax which makes data representation clear and readable.
9
+ The building blocks for general data structures are hashes and arrays.
10
+
11
+ Installation
12
+ ============
13
+
14
+ ~~~
15
+ gem install gdstruct
16
+ ~~~
17
+
18
+ A Short Example
19
+ ===============
20
+
21
+ ~~~
22
+ require "gdstruct"
23
+
24
+ h = GDstruct.c( <<-EOS )
25
+ a val a
26
+ b val b
27
+ EOS
28
+
29
+ # => h = { a: 'val a', b: 'val b' }
30
+ ~~~
31
+
32
+ An Introduction
33
+ ===============
34
+
35
+ The GDS language uses two basic symbols (__:__ and __,__) for the creation of hashes and arrays.
36
+
37
+ A colon (__:__) is used to define a hash.
38
+ A comma (__,__) is used to define an array.
39
+
40
+ Use indentation with two spaces for the definition of elements and for nested structures.
41
+ Tab characters are not allowed for indentation.
42
+
43
+ ## Another Example
44
+
45
+ ~~~
46
+ caption foo
47
+ credit bar
48
+ images
49
+ small
50
+ url http://mywebsite.com/image-small.jpg
51
+ dimensions
52
+ height 500
53
+ width 500
54
+ large
55
+ url http://mywebsite.com/image-large.jpg
56
+ dimensions
57
+ height 500
58
+ width 500
59
+ videos
60
+ small
61
+ preview http://mywebsite.com/video.m4v
62
+ dimensions
63
+ height 300
64
+ width 400
65
+ ~~~
66
+
67
+ transforms to
68
+
69
+ ~~~
70
+ {
71
+ :caption => 'foo',
72
+ :credit => 'bar',
73
+ :images => {
74
+ :small => {
75
+ :url => 'http://mywebsite.com/image-small.jpg',
76
+ :dimensions => {
77
+ :height => 500,
78
+ :width => 500
79
+ }
80
+ },
81
+ :large => {
82
+ :url => 'http://mywebsite.com/image-large.jpg',
83
+ :dimensions => {
84
+ :height => 500,
85
+ :width => 500
86
+ }
87
+ },
88
+ },
89
+ :videos => {
90
+ :small => {
91
+ :preview => 'http://mywebsite.com/video.m4v',
92
+ :dimensions => {
93
+ :height => 300,
94
+ :width => 400
95
+ }
96
+ }
97
+ }
98
+ }
99
+ ~~~
100
+
101
+ ## General Example
102
+
103
+ ~~~
104
+ ,
105
+ v1
106
+ : k2 v2
107
+ : k31 v31 | k32 v32 | k33 v33
108
+ k34 v34
109
+ k35 v35 | k36 v36
110
+ :
111
+ k41 v41
112
+ k42 v42
113
+ k43,
114
+ k44, 1 | 2 | 3
115
+ 4 | 5
116
+ 6
117
+ 7
118
+ 8 | 9
119
+ :k441 v441
120
+ v5
121
+
122
+ # => [ 'v1', { k2: 'v2' }, { k31: 'v31', k32: 'v32', k33: 'v33', k34: 'v34', k35: 'v35', k36: 'v36' },
123
+ { k41: 'v41', k42: 'v42', k43: [], k44: [1, 2, 3, 4, 5, 6, 7, 8, 9, { k441: 'v441' } ] }, 'v5' ]
124
+ ~~~
125
+
126
+ ## Motivation and Features
127
+
128
+ * the focus is on the essential data
129
+ * structure and hierarchy is expressed using indentation (whitespace-sensitive) - avoids curly braces and square brackets
130
+ * uses a succinct and minimalist syntax - tries to avoid unnecessary characters
131
+ * in many cases colons, commas and quotes are not necessary
132
+ * less text makes data clearer and more readable
133
+ * for configuration and specification - replacement for XML, JSON, YAML
134
+ * for data/database seeding
135
+ * less text and less potential errors using schema definitions
136
+ * supports block comments, which could be nested
137
+ * allows also the definition of hash and array structures in a kind of restricted classic Ruby like syntax
138
+ * provides an alternative for Ruby hash and array definition without using eval(); can be used as a protection against code injection vulnerabilities, e.g. on web servers
139
+
140
+
141
+ ## Schema specifiers
142
+
143
+ Schema specifiers can be used to predefine the keys of a hash or subhash.
144
+ When you specify the values you no longer need to name the key for each value.
145
+ This facilitates the input for hashes and prevents typos for keys.
146
+ In combination with the pipe symbol (__\|__), which allows to define multiple values on a single line,
147
+ this features a slim and clearly arranged, table-like style for data.
148
+
149
+ ~~~
150
+ @schema country(name,capital,area,population,vehicleRegistrationCode,iso3166code,callingCode)
151
+ , @schema country /*
152
+ name capital area (km^2) population vehicleRegistrationCode iso3166code callingCode
153
+ ---------------------------------------------------------------------------------------------------------------------------- */
154
+ : Deutschland | Berlin | 357_385 | 82_521_653 | D | DE | 49
155
+ : USA | Washington, D.C. | 9_833_520 | 325_719_178 | USA | US | 1
156
+ : China | Beijing | 9_596_961 | 1_403_500_365 | CHN | CN | 86
157
+ : India | New Dehli | 3_287_469 | 1_339_180_000 | IND | IN | 91
158
+ : Austria | Vienna | 83_878 | 8_822_267 | A | AT | 43
159
+ : Denmark | Copenhagen | 42_921 | 5_748_769 | DK | DK | 45
160
+ : Canada | Ottawa | 9_984_670 | 36_503_097 | CDN | CA | 1
161
+ : France | Paris | 643_801 | 66_991_000 | F | FR | 33
162
+ : Russia | Moscow | 17_075_400 | 144_526_636 | RUS | RU | 7
163
+ ~~~
164
+ transforms to
165
+ ~~~
166
+ [
167
+ { :name=>"Deutschland", :capital=>"Berlin", :area=>357385, :population=>82521653, :vehicleRegistrationCode=>"D", :iso3166code=>"DE", :callingCode=>49 },
168
+ { :name=>"USA", :capital=>"Washington, D.C.", :area=>9833520, :population=>325719178, :vehicleRegistrationCode=>"USA", :iso3166code=>"US", :callingCode=>1 },
169
+ { :name=>"China", :capital=>"Beijing", :area=>9596961, :population=>1403500365, :vehicleRegistrationCode=>"CHN", :iso3166code=>"CN", :callingCode=>86 },
170
+ { :name=>"India", :capital=>"New Dehli", :area=>3287469, :population=>1339180000, :vehicleRegistrationCode=>"IND", :iso3166code=>"IN", :callingCode=>91 },
171
+ { :name=>"Austria", :capital=>"Vienna", :area=>83878, :population=>8822267, :vehicleRegistrationCode=>"A", :iso3166code=>"AT", :callingCode=>43 },
172
+ { :name=>"Denmark", :capital=>"Copenhagen", :area=>42921, :population=>5748769, :vehicleRegistrationCode=>"DK", :iso3166code=>"DK", :callingCode=>45 },
173
+ { :name=>"Canada", :capital=>"Ottawa", :area=>9984670, :population=>36503097, :vehicleRegistrationCode=>"CDN", :iso3166code=>"CA", :callingCode=>1 },
174
+ { :name=>"France", :capital=>"Paris", :area=>643801, :population=>66991000, :vehicleRegistrationCode=>"F", :iso3166code=>"FR", :callingCode=>33 },
175
+ { :name=>"Russia", :capital=>"Moscow", :area=>17075400, :population=>144526636, :vehicleRegistrationCode=>"RUS", :iso3166code=>"RU", :callingCode=>7 }
176
+ ]
177
+ ~~~
178
+
179
+ Further Information
180
+ ===================
181
+
182
+ You will find further information here: [urasepandia.de/gds.html](https://urasepandia.de/gds.html)
183
+
184
+ Maintainer
185
+ ==========
186
+
187
+ Uli Ramminger <uli@urasepandia.de>
188
+
189
+ Copyright
190
+ =========
191
+
192
+ Copyright (c) 2018 Ulrich Ramminger
193
+
194
+ See MIT-LICENSE for further details.
@@ -10,7 +10,7 @@ You will find further information here: https://urasepandia.de/gds.html
10
10
  =end
11
11
  #===============================================================================
12
12
 
13
- require_relative 'gdstruct/gds_012'
13
+ require_relative 'gdstruct/gds_013'
14
14
 
15
15
  #===============================================================================
16
16
 
@@ -18,13 +18,37 @@ class GDstruct
18
18
 
19
19
  class << self
20
20
 
21
- def create( def_string, config = {} )
22
- LDLgeneratedLanguage::Gds.parse( def_string, config )
21
+ # create a Ruby Hash/Array structure out of a GDS definition string
22
+ #
23
+ # @param gds_definition [String] GDS definition
24
+ # @option config [true/false] :allow_env (false) allow the @env directive to access environment variables, otherwise the @env directive returns nil
25
+ # @option config [Binding] :context (nil) if a binding is set then the @r directive evaluates embedded ruby code, otherwise the @r directive returns nil
26
+ #
27
+ # @return [Hash,Array] hash/array structure
28
+ #
29
+ # @example
30
+ # require 'gdstruct'
31
+ #
32
+ # h = GDstruct.c( <<-EOS )
33
+ # a value 1
34
+ # b value 2
35
+ # EOS
36
+ #
37
+ # # => h = { a: 'value 1', b: 'value 2' }
38
+ def create( gds_definition, config = {} )
39
+ LDLgeneratedLanguage::Gds.parse( gds_definition, config )
23
40
  end
24
41
  alias :c :create
25
42
 
26
- def create_from_file( name, config = {} )
27
- LDLgeneratedLanguage::Gds.parse( File.read( name ), config )
43
+ # create a Ruby Hash/Array structure out of a GDS definition file
44
+ #
45
+ # @param file_name [String] file name
46
+ # @option config [true/false] :allow_env (false) allow the @env directive to access environment variables, otherwise the @env directive returns nil
47
+ # @option config [Binding] :context (nil) if a binding is set then the @r directive evaluates embedded ruby code, otherwise the @r directive returns nil
48
+ #
49
+ # @return [Hash,Array] hash/array structure
50
+ def create_from_file( file_name, config = {} )
51
+ LDLgeneratedLanguage::Gds.parse( File.read( file_name ), config )
28
52
  end
29
53
  alias :c_from_file :create_from_file
30
54
 
@@ -0,0 +1,51 @@
1
+ #===============================================================================
2
+
3
+ module LDLgeneratedLanguage
4
+
5
+ class Gds_013_data
6
+ def self.config
7
+ @@config ||= {}
8
+ end
9
+ end
10
+
11
+ class Gds
12
+ require 'treetop'
13
+
14
+ class SyntaxError < ::StandardError
15
+ end
16
+
17
+ def self.parse( s, config = {} )
18
+ ::LDLgeneratedLanguage::Gds_013_data.config.replace( { allow_env: false, context: nil }.merge( config ) )
19
+
20
+ @parserClass ||= begin
21
+ Treetop.load_from_string GrammarDef
22
+ instance_eval( 'Gds_013Parser' )
23
+ end
24
+ parser = @parserClass.new
25
+
26
+ parseTree = parser.parse( s + "\n" )
27
+
28
+ unless parseTree
29
+ lineOfFailure = parser.failure_line
30
+ columnOfFailure = parser.failure_column
31
+
32
+ s = "GDS: Error happend, while parsing the definition: line #{lineOfFailure}, column #{columnOfFailure}" + "\n"
33
+ s += parser.failure_reason + "\n" if parser.failure_reason
34
+ s += "--->" + "\n"
35
+ s += parser.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + "\n"
36
+ s += ' '*((parser.failure_column) -1) + '^' + "\n"
37
+ s += "<---" + "\n"
38
+
39
+ raise SyntaxError, s
40
+ end
41
+
42
+ parseTree.ast
43
+ end
44
+
45
+ GrammarDef = "grammar Gds_013\n\n rule top\n &{ |s| @indentationLevels = []; true }\n defs ''\n {\n def ast\n eval 'class ::LDLgeneratedLanguage::Gds_013_data; def self.globalvars; @@globalvars ||= {}; end; end'\n ::LDLgeneratedLanguage::Gds_013_data.globalvars.clear\n defs.ast\n end\n }\n end\n\n rule defs\n wscommnl* predefs wscommnl* defs2 \n {\n def ast\n dummy = predefs.ast\n defs2.ast\n end\n }\n end\n\n rule predefs\n predef* \n {\n def ast\n elements.each { |e| e.ast }\n end\n }\n end\n\n rule predef\n wscommnl2 '@schema' wscommnl2 schemaname wscommnl2 '(' wscommnl2 schema_fieldlist wscommnl2 ')' \n {\n def ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast] = schema_fieldlist.ast\n end\n }\n /\n wscommnl2 '$' varname wscommnl2 '=' wscommnl2 vardef_rvalue \n {\n def ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:gdsglobvars] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:gdsglobvars][varname.ast] = vardef_rvalue.ast\n end\n }\n end\n\n rule schemaname\n identifier '' \n {\n def ast\n identifier.ast\n end\n }\n end\n\n rule varname\n identifier ''\n {\n def ast\n identifier.ast\n end\n }\n end\n\n rule vardef_rvalue\n valuedef_ind ''\n {\n def ast\n valuedef_ind.ast\n end\n }\n end\n\n rule schema_fieldlist\n schemafield ws ',' ws schema_fieldlist \n {\n def ast\n r = []\n r << schemafield.ast\n r.concat( schema_fieldlist.ast )\n r\n end\n }\n /\n schemafield '' \n {\n def ast\n r = []\n r << schemafield.ast\n r\n end\n }\n end\n\n rule schemafield\n identifier '' \n {\n def ast\n identifier.ast\n end\n }\n end\n\n rule defs2\n wscommnl2 ruby_standard_def wscommnl2\n {\n def ast\n ruby_standard_def.ast\n end\n }\n /\n wscommnl* special_indented_def wscommnl2\n {\n def ast\n special_indented_def.ast\n end\n }\n end\n\n rule ruby_standard_def\n hashdef ''\n {\n def ast\n hashdef.ast\n end\n }\n /\n arraydef ''\n {\n def ast\n arraydef.ast\n end\n }\n end\n\n rule special_indented_def\n arraydef_ind ''\n {\n def ast\n arraydef_ind.ast\n end\n }\n /\n hashdef_ind ''\n {\n def ast\n hashdef_ind.ast\n end\n }\n end\n\n rule hashdef\n wscommnl2 '{' wscommnl2 hashsubdefs wscommnl2 '}' \n {\n def ast\n hashsubdefs.ast\n end\n }\n end\n\n rule arraydef\n wscommnl2 '[' wscommnl2 arraysubdefs wscommnl2 ']' \n {\n def ast\n arraysubdefs.ast\n end\n }\n end\n\n rule hashsubdefs\n hashsubdef wscommnl2 morehashsubdefs \n {\n def ast\n r = {}\n r.merge!( hashsubdef.ast )\n r.merge!( morehashsubdefs.ast )\n r\n end\n }\n /\n ''\n {\n def ast\n {}\n end\n }\n end\n\n rule morehashsubdefs\n morehashsubdef*\n {\n def ast\n r = {}\n elements.each { |e| r.merge!( e.ast ) }\n r\n end\n }\n end\n\n rule morehashsubdef\n wscommnl2 ',' wscommnl2 hashsubdef\n {\n def ast\n hashsubdef.ast\n end\n }\n end\n\n rule hashsubdef\n keyvaluedef ''\n {\n def ast\n keyvaluedef.ast\n end\n }\n /\n keydef ':' wscommnl2 hashdef \n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, hashdef.ast ] )\n r\n end\n }\n /\n wscommnl2 ':' keydef wscommnl2 '=>' wscommnl2 hashdef \n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, hashdef.ast ] )\n r\n end\n }\n /\n keydef ':' wscommnl2 arraydef \n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, arraydef.ast ] )\n r\n end\n }\n /\n wscommnl2 ':' keydef wscommnl2 '=>' wscommnl2 arraydef \n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, arraydef.ast ] )\n r\n end\n }\n end\n\n rule arraysubdefs\n arraysubdef wscommnl2 morearraysubdefs \n {\n def ast\n r = []\n r << arraysubdef.ast\n r.concat( morearraysubdefs.ast )\n r\n end\n }\n /\n '' \n {\n def ast\n r = []\n r\n end\n }\n end\n\n rule morearraysubdefs\n morearraysubdef* \n {\n def ast\n r = []\n elements.each do |e|\n r << e.ast\n end\n r\n end\n }\n end\n\n rule morearraysubdef\n wscommnl2 ',' wscommnl2 arraysubdef\n {\n def ast\n arraysubdef.ast\n end\n }\n end\n\n rule arraysubdef\n valuedef ''\n {\n def ast\n valuedef.ast\n end\n }\n /\n arraydef ''\n {\n def ast\n arraydef.ast\n end\n }\n /\n hashdef ''\n {\n def ast\n hashdef.ast\n end\n }\n /\n hashsubdef ''\n {\n def ast\n hashsubdef.ast\n end\n }\n end\n\n rule hashdef_ind\n indentation ': ' ws refdef ws keyvaluedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = keyvaluedefs_ind.ast\n r.merge!( keyvaluedefs_ind.ast )\n r.merge!( hashsubdefs_ind.ast )\n r\n end\n }\n /\n indentation ': ' ws keyvaluedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( keyvaluedefs_ind.ast )\n r.merge!( hashsubdefs_ind.ast )\n r\n end\n }\n /\n indentation ':' wscommnl+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n hashsubdefs_ind.ast\n end\n }\n /\n indentation '' \n &{ |s| level = s[0].text_value.length; @lastIndentation=level; true } \n &{ |s| false }\n {\n def ast\n end\n }\n /\n &{ |s| @indentationLevels << (@lastIndentation-2); true }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( hashsubdefs_ind.ast )\n r\n end\n }\n end\n\n rule arraydef_ind\n indentation ',' ws '@schema' ws schemaname ws '(' ws schema_fieldlist ws ')' wscommnl+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast] = schema_fieldlist.ast\n res = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation ',' ws '@schema' ws '(' ws schema_fieldlist ws ')' wscommnl+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << schema_fieldlist.ast\n res = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation ',' ws '@schema' ws schemaname wscommnl+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata] ||= {}\n unless ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast]\n ###orig-ok# raise SyntaxError, \"GDS: undefined schema specifier: \#{schemaname.ast}\"\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast}, line \#{lineOfFailure}, column \#{columnOfFailure}\" + \"\\n\"\n s += \"--->\" + \"\\n\"\n s += nt.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + \"\\n\"\n s += ' '*((columnOfFailure) -1) + '^' + \"\\n\"\n s += \"<---\" + \"\\n\"\n raise SyntaxError, s\n end\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast]\n res = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation ',' ws refdef ws valuedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = valuedefs_ind.ast\n r = []\n r.concat( valuedefs_ind.ast )\n r.concat( arraysubdefs_ind.ast )\n r\n end\n }\n /\n indentation ',' ws valuedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = []\n r.concat( valuedefs_ind.ast )\n r.concat( arraysubdefs_ind.ast )\n r\n end\n }\n /\n indentation ',' wscommnl+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n arraysubdefs_ind.ast\n end\n }\n end\n\n rule hashsubdefs_ind\n ( \n &{ |s| save = index; i = _nt_indentation; level = i.text_value.length; index = save; ok = (level == (2 + @indentationLevels.last)); ok }\n hashsubdef_ind '' \n )*\n {\n def ast\n r = {}\n elements.each { |e| r.merge!( e.hashsubdef_ind.ast ) }\n r\n end\n }\n end\n\n rule hashsubdef_ind\n indentation bc_0_l:(bc_0*) ws refdef ws keydef ws ',' ws '@schema' ws schemaname wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata] ||= {}\n unless ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast]\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast}, line \#{lineOfFailure}, column \#{columnOfFailure}\" + \"\\n\"\n s += \"--->\" + \"\\n\"\n s += nt.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + \"\\n\"\n s += ' '*((columnOfFailure) -1) + '^' + \"\\n\"\n s += \"<---\" + \"\\n\"\n raise SyntaxError, s\n end\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast]\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r\n res = r\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws refdef ws ',' ws '@schema' ws schemaname wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata] ||= {}\n unless ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast]\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast}, line \#{lineOfFailure}, column \#{columnOfFailure}\" + \"\\n\"\n s += \"--->\" + \"\\n\"\n s += nt.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + \"\\n\"\n s += ' '*((columnOfFailure) -1) + '^' + \"\\n\"\n s += \"<---\" + \"\\n\"\n raise SyntaxError, s\n end\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast]\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = arraysubdefs_schema_ind.ast\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n res = r\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef1 ws keydef ws refdef2 ws ',' ws '@schema' ws schemaname wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata] ||= {}\n unless ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast]\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast}, line \#{lineOfFailure}, column \#{columnOfFailure}\" + \"\\n\"\n s += \"--->\" + \"\\n\"\n s += nt.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + \"\\n\"\n s += ' '*((columnOfFailure) -1) + '^' + \"\\n\"\n s += \"<---\" + \"\\n\"\n raise SyntaxError, s\n end\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast]\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef2.ast] = arraysubdefs_schema_ind.ast\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef1.ast] = r\n res = r\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef1 ws keydef ws refdef2 ws ',' ws '@schema' ws '(' ws schema_fieldlist ws ')' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef2.ast] = arraysubdefs_schema_ind.ast\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef1.ast] = r\n res = r\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef ws keydef ws ',' ws '@schema' ws '(' ws schema_fieldlist ws ')' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << schema_fieldlist.ast\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r\n res = r\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws refdef ws ',' ws '@schema' ws '(' ws schema_fieldlist ws ')' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = arraysubdefs_schema_ind.ast\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n res = r\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws ',' ws '@schema' ws '(' ws schema_fieldlist ws ')' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << schema_fieldlist.ast\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n res = r\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef1 ws keydef ws refdef2 ws ',' ws '@schema' ws schemaname ws '(' ws schema_fieldlist ws ')' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast] = schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef2.ast] = arraysubdefs_schema_ind.ast\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef1.ast] = r\n res = r\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef ws keydef ws ',' ws '@schema' ws schemaname ws '(' ws schema_fieldlist ws ')' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast] = schema_fieldlist.ast\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r\n res = r\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws refdef ws ',' ws '@schema' ws schemaname ws '(' ws schema_fieldlist ws ')' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast] = schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = arraysubdefs_schema_ind.ast\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n res = r\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws ',' ws '@schema' ws schemaname ws '(' ws schema_fieldlist ws ')' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast] = schema_fieldlist.ast\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n res = r\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws ',' ws '@schema' ws schemaname wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata] ||= {}\n unless ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast]\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast}, line \#{lineOfFailure}, column \#{columnOfFailure}\" + \"\\n\"\n s += \"--->\" + \"\\n\"\n s += nt.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + \"\\n\"\n s += ' '*((columnOfFailure) -1) + '^' + \"\\n\"\n s += \"<---\" + \"\\n\"\n raise SyntaxError, s\n end\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast]\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n res = r\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef1 ws keydef ws refdef2 ws ',' ws valuedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, begin [].concat( valuedefs_ind.ast ).concat( arraysubdefs_ind.ast ) end ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef1.ast] = r\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef2.ast] = r[keydef.ast]\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef ws keydef ws ',' ws valuedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, begin [].concat( valuedefs_ind.ast ).concat( arraysubdefs_ind.ast ) end ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws refdef ws ',' ws valuedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, begin [].concat( valuedefs_ind.ast ).concat( arraysubdefs_ind.ast ) end ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r[keydef.ast]\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef1 ws keydef ws refdef2 ws ',' ws refdef3 ws valuedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef3.ast] = valuedefs_ind.ast\n r.merge!( Hash[ keydef.ast, begin [].concat( valuedefs_ind.ast ).concat( arraysubdefs_ind.ast ) end ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef1.ast] = r\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef2.ast] = r[keydef.ast]\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef1 ws keydef ws ',' ws refdef2 ws valuedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef2.ast] = valuedefs_ind.ast\n r.merge!( Hash[ keydef.ast, begin [].concat( valuedefs_ind.ast ).concat( arraysubdefs_ind.ast ) end ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef1.ast] = r\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws refdef1 ws ',' ws refdef2 ws valuedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef2.ast] = valuedefs_ind.ast\n r.merge!( Hash[ keydef.ast, begin [].concat( valuedefs_ind.ast ).concat( arraysubdefs_ind.ast ) end ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef1.ast] = r[keydef.ast]\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws ',' ws refdef ws valuedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = valuedefs_ind.ast\n r.merge!( Hash[ keydef.ast, begin [].concat( valuedefs_ind.ast ).concat( arraysubdefs_ind.ast ) end ] )\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws ',' ws valuedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, begin [].concat( valuedefs_ind.ast ).concat( arraysubdefs_ind.ast ) end ] )\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef1 ws keydef ws refdef2 ws ',' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef2.ast] = arraysubdefs_ind.ast\n r.merge!( Hash[ keydef.ast, arraysubdefs_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef1.ast] = r\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef ws keydef ws ',' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, arraysubdefs_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws refdef ws ',' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = arraysubdefs_ind.ast\n r.merge!( Hash[ keydef.ast, arraysubdefs_ind.ast ] )\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws ',' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, arraysubdefs_ind.ast ] )\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef1 ws keydef ws refdef2 wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef2.ast] = hashsubdefs_ind.ast\n r.merge!( Hash[ keydef.ast, hashsubdefs_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef1.ast] = r\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef ws keydef wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, hashsubdefs_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws refdef wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = hashsubdefs_ind.ast\n r.merge!( Hash[ keydef.ast, hashsubdefs_ind.ast ] )\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, hashsubdefs_ind.ast ] )\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef ws keyvaluedefs_ind \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl+\n {\n def ast\n r = keyvaluedefs_ind.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keyvaluedefs_ind \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl+\n {\n def ast\n keyvaluedefs_ind.ast\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws '@merge' ws refuse_ind \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl+\n {\n def ast\n refuse_ind.ast\n end\n }\n end\n\n rule refdef1\n refdef ''\n {\n def ast\n refdef.ast\n end\n }\n end\n\n rule refdef2\n refdef ''\n {\n def ast\n refdef.ast\n end\n }\n end\n\n rule refdef3\n refdef ''\n {\n def ast\n refdef.ast\n end\n }\n end\n\n rule arraysubdefs_ind\n ( \n &{ |s| save = index; i = _nt_indentation; level = i.text_value.length; index = save; ok = (level == (2 + @indentationLevels.last)); ok }\n arraysubdef_ind '' \n )*\n {\n def ast\n r = []\n elements.each do |e|\n e1 = e.arraysubdef_ind.ast\n if e1.is_a?( Array )\n r.concat e1\n else\n r << e1\n end\n end\n r\n end\n }\n end\n\n rule arraysubdef_ind\n indentation refdef1 ws ': ' ws refdef2 ws keyvaluedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef2.ast] = keyvaluedefs_ind.ast\n r.merge!( keyvaluedefs_ind.ast )\n r.merge!( hashsubdefs_ind.ast )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef1.ast] = r\n r\n end\n }\n /\n indentation refdef ws ': ' ws keyvaluedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( keyvaluedefs_ind.ast )\n r.merge!( hashsubdefs_ind.ast )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r\n r\n end\n }\n /\n indentation ': ' ws refdef ws keyvaluedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = keyvaluedefs_ind.ast\n r.merge!( keyvaluedefs_ind.ast )\n r.merge!( hashsubdefs_ind.ast )\n r\n end\n }\n /\n indentation ': ' ws keyvaluedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( keyvaluedefs_ind.ast )\n r.merge!( hashsubdefs_ind.ast )\n r\n end\n }\n /\n indentation refdef ws ':' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = hashsubdefs_ind.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r\n r\n end\n }\n /\n indentation ':' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n hashsubdefs_ind.ast\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef1 ws keydef ws refdef2 ws ':' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, hashsubdefs_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef1.ast] = r\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef2.ast] = r[keydef.ast]\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef ws keydef ws ':' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, hashsubdefs_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws refdef ws ':' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, hashsubdefs_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r[keydef.ast]\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws ':' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, hashsubdefs_ind.ast ] )\n r\n end\n }\n /\n indentation refdef ws ',' ws '@schema' ws schemaname ws '(' ws schema_fieldlist ws ')' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast] = schema_fieldlist.ast\n r = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r\n res = r\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n [ res ]\n end\n }\n /\n indentation ',' ws '@schema' ws schemaname ws '(' ws schema_fieldlist ws ')' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast] = schema_fieldlist.ast\n res = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n [ res ]\n end\n }\n /\n indentation refdef ws ',' ws '@schema' ws '(' ws schema_fieldlist ws ')' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << schema_fieldlist.ast\n r = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r\n res = r\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n [ res ]\n end\n }\n /\n indentation ',' ws '@schema' ws '(' ws schema_fieldlist ws ')' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << schema_fieldlist.ast\n res = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n [ res ]\n end\n }\n /\n indentation refdef ws ',' ws '@schema' ws schemaname wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata] ||= {}\n unless ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast]\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast}, line \#{lineOfFailure}, column \#{columnOfFailure}\" + \"\\n\"\n s += \"--->\" + \"\\n\"\n s += nt.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + \"\\n\"\n s += ' '*((columnOfFailure) -1) + '^' + \"\\n\"\n s += \"<---\" + \"\\n\"\n raise SyntaxError, s\n end\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast]\n r = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r\n res = r\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n [ res ]\n end\n }\n /\n indentation ',' ws '@schema' ws schemaname wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata] ||= {}\n unless ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast]\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast}, line \#{lineOfFailure}, column \#{columnOfFailure}\" + \"\\n\"\n s += \"--->\" + \"\\n\"\n s += nt.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + \"\\n\"\n s += ' '*((columnOfFailure) -1) + '^' + \"\\n\"\n s += \"<---\" + \"\\n\"\n raise SyntaxError, s\n end\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema] << ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schemata][schemaname.ast]\n res = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].pop\n [ res ]\n end\n }\n /\n indentation refdef1 ws ',' ws refdef2 ws valuedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef2.ast] = valuedefs_ind.ast\n r = []\n r.concat( valuedefs_ind.ast )\n r.concat( arraysubdefs_ind.ast )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef1.ast] = r\n [\n r\n ]\n end\n }\n /\n indentation refdef ws ',' ws valuedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = []\n r.concat( valuedefs_ind.ast )\n r.concat( arraysubdefs_ind.ast )\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r\n [\n r\n ]\n end\n }\n /\n indentation ',' ws refdef ws valuedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = valuedefs_ind.ast\n r = []\n r.concat( valuedefs_ind.ast )\n r.concat( arraysubdefs_ind.ast )\n [\n r\n ]\n end\n }\n /\n indentation ',' ws valuedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = []\n r.concat( valuedefs_ind.ast )\n r.concat( arraysubdefs_ind.ast )\n [\n r\n ]\n end\n }\n /\n indentation refdef ws ',' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = arraysubdefs_ind.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r\n [\n r\n ]\n end\n }\n /\n indentation ',' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n [\n arraysubdefs_ind.ast\n ]\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws '@insert' ws refuse_ind \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl+\n {\n def ast\n refuse_ind.ast\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef ws valuedefs_ind \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl+\n {\n def ast\n r = valuedefs_ind.ast\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws valuedefs_ind \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl+\n {\n def ast\n valuedefs_ind.ast\n end\n }\n end\n\n rule arraysubdefs_schema_ind\n ( \n &{ |s| save = index; i = _nt_indentation; level = i.text_value.length; index = save; ok = (level == (2 + @indentationLevels.last)); ok }\n arraysubdef_schema_ind '' \n )*\n {\n def ast\n r = []\n elements.each do |e|\n e1 = e.arraysubdef_schema_ind.ast\n if e1.is_a?( Array )\n r.concat e1\n else\n r << e1\n end\n end\n r\n end\n }\n end\n\n rule arraysubdef_schema_ind\n indentation refdef1 ws ': ' ws refdef2 ws schemavaluedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n \n if schemavaluedefs_ind.ast.length > ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].last.length\n s = \"GDS: too many values for schema definition: \"\n nt = schemavaluedefs_ind\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"line \#{lineOfFailure}, column \#{columnOfFailure}\" + \"\\n\"\n s += \"--->\" + \"\\n\"\n s += nt.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + \"\\n\"\n s += ' '*((columnOfFailure) -1) + '^' + \"\\n\"\n s += \"<---\" + \"\\n\"\n raise SyntaxError, s\n end\n result = {}\n r1 = schemavaluedefs_ind.ast.each_with_index.map do |e,i|\n (e.is_a?(Hash) && e[:valuedirective]==:@na) ? ({}) : (Hash[ ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].last[i], e ])\n end.inject({}){ |res,e| res.merge!(e) }\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef1.ast] = result\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef2.ast] = r1\n result.merge!( r1 ).merge!( hashsubdefs_ind.ast )\n \n end\n }\n /\n indentation refdef ws ': ' ws schemavaluedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n \n if schemavaluedefs_ind.ast.length > ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].last.length\n s = \"GDS: too many values for schema definition: \"\n nt = schemavaluedefs_ind\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"line \#{lineOfFailure}, column \#{columnOfFailure}\" + \"\\n\"\n s += \"--->\" + \"\\n\"\n s += nt.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + \"\\n\"\n s += ' '*((columnOfFailure) -1) + '^' + \"\\n\"\n s += \"<---\" + \"\\n\"\n raise SyntaxError, s\n end\n result = {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = result\n schemavaluedefs_ind.ast.each_with_index.map do |e,i|\n (e.is_a?(Hash) && e[:valuedirective]==:@na) ? ({}) : (Hash[ ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].last[i], e ])\n end.inject(result){ |res,e1| res.merge!(e1) }.merge!( hashsubdefs_ind.ast )\n \n end\n }\n /\n indentation ': ' ws refdef ws schemavaluedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n \n if schemavaluedefs_ind.ast.length > ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].last.length\n s = \"GDS: too many values for schema definition: \"\n nt = schemavaluedefs_ind\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"line \#{lineOfFailure}, column \#{columnOfFailure}\" + \"\\n\"\n s += \"--->\" + \"\\n\"\n s += nt.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + \"\\n\"\n s += ' '*((columnOfFailure) -1) + '^' + \"\\n\"\n s += \"<---\" + \"\\n\"\n raise SyntaxError, s\n end\n result = {}\n r1 = schemavaluedefs_ind.ast.each_with_index.map do |e,i|\n (e.is_a?(Hash) && e[:valuedirective]==:@na) ? ({}) : (Hash[ ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].last[i], e ])\n end.inject({}){ |res,e| res.merge!(e) }\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][refdef.ast] = r1\n result.merge!( r1 ).merge!( hashsubdefs_ind.ast )\n \n end\n }\n /\n indentation ': ' ws schemavaluedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n \n if schemavaluedefs_ind.ast.length > ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].last.length\n s = \"GDS: too many values for schema definition: \"\n nt = schemavaluedefs_ind\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"line \#{lineOfFailure}, column \#{columnOfFailure}\" + \"\\n\"\n s += \"--->\" + \"\\n\"\n s += nt.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + \"\\n\"\n s += ' '*((columnOfFailure) -1) + '^' + \"\\n\"\n s += \"<---\" + \"\\n\"\n raise SyntaxError, s\n end\n schemavaluedefs_ind.ast.each_with_index.map do |e,i|\n (e.is_a?(Hash) && e[:valuedirective]==:@na) ? ({}) : (Hash[ ::LDLgeneratedLanguage::Gds_013_data.globalvars[:schema].last[i], e ])\n end.inject({}){ |res,e1| res.merge!(e1) }.merge!( hashsubdefs_ind.ast )\n \n end\n }\n /\n arraysubdef_ind ''\n {\n def ast\n arraysubdef_ind.ast\n end\n }\n end\n\n rule schemavaluedefs_ind\n schemavaluedef_ind ws '|' ws schemavaluedefs_ind \n {\n def ast\n r = []\n r << schemavaluedef_ind.ast\n r.concat( schemavaluedefs_ind.ast )\n r\n end\n }\n /\n schemavaluedef_ind '' \n {\n def ast\n r = []\n r << schemavaluedef_ind.ast\n r\n end\n }\n end\n\n rule schemavaluedef_ind\n value_directive_ind ''\n {\n def ast\n value_directive_ind.ast\n end\n }\n /\n valuedef_ind ''\n {\n def ast\n valuedef_ind.ast\n end\n }\n end\n\n rule refdef\n '&' identifier \n {\n def ast\n identifier.ast\n end\n }\n end\n\n rule keyvaluedefs_ind\n keyvaluedef_ind ws '|' ws keyvaluedefs_ind \n {\n def ast\n r = {}\n r.merge!( keyvaluedef_ind.ast )\n r.merge!( keyvaluedefs_ind.ast )\n r\n end\n }\n /\n keyvaluedef_ind ''\n {\n def ast\n keyvaluedef_ind.ast\n end\n }\n end\n\n rule keyvaluedef_ind\n keydef wsc_l:(wsc+) valuedef_ind \n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, valuedef_ind.ast ] )\n r\n end\n }\n end\n\n rule valuedef_ind\n variable_val_ind ''\n {\n def ast\n variable_val_ind.ast\n end\n }\n /\n refuse_ind ''\n {\n def ast\n refuse_ind.ast\n end\n }\n /\n valuedef_gen_ind ''\n {\n def ast\n valuedef_gen_ind.ast\n end\n }\n /\n special_value_ind ''\n {\n def ast\n special_value_ind.ast\n end\n }\n /\n string_no_leading_space ''\n {\n def ast\n string_no_leading_space.ast\n end\n }\n end\n\n rule keyvaluedef\n keydef ':' wscommnl2 valuedef \n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, valuedef.ast ] )\n r\n end\n }\n /\n wscommnl2 ':' keydef wscommnl2 '=>' wscommnl2 valuedef \n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, valuedef.ast ] )\n r\n end\n }\n end\n\n rule valuedefs_ind\n valuedef_ind ws '|' ws valuedefs_ind \n {\n def ast\n r = []\n r << valuedef_ind.ast\n r.concat( valuedefs_ind.ast )\n r\n end\n }\n /\n valuedef_ind '' \n {\n def ast\n r = []\n r << valuedef_ind.ast\n r\n end\n }\n end\n\n rule valuedef\n variable_val ''\n {\n def ast\n variable_val.ast\n end\n }\n /\n valuedef_gen ''\n {\n def ast\n valuedef_gen.ast\n end\n }\n /\n special_value ''\n {\n def ast\n special_value.ast\n end\n }\n end\n\n rule valuedef_gen\n number_float ''\n {\n def ast\n number_float.ast\n end\n }\n /\n number_int ''\n {\n def ast\n number_int.ast\n end\n }\n /\n rubysymbol ''\n {\n def ast\n rubysymbol.ast\n end\n }\n /\n string_with_quotes ''\n {\n def ast\n string_with_quotes.ast\n end\n }\n end\n\n rule valuedef_gen_ind\n ruby_eval ''\n {\n def ast\n ruby_eval.ast\n end\n }\n /\n number_float ''\n {\n def ast\n number_float.ast\n end\n }\n /\n number_int ''\n {\n def ast\n number_int.ast\n end\n }\n /\n rubysymbol_ind ''\n {\n def ast\n rubysymbol_ind.ast\n end\n }\n /\n string_with_quotes ''\n {\n def ast\n string_with_quotes.ast\n end\n }\n end\n\n rule special_value\n 'nil' \n {\n def ast\n nil\n end\n }\n /\n 'true' \n {\n def ast\n true\n end\n }\n /\n 'false' \n {\n def ast\n false\n end\n }\n end\n\n rule special_value_ind\n '!nil' \n {\n def ast\n nil\n end\n }\n /\n '!true' \n {\n def ast\n true\n end\n }\n /\n '!false' \n {\n def ast\n false\n end\n }\n end\n\n rule value_directive_ind\n '@na' \n {\n def ast\n r = {}\n r.merge!( Hash[ :valuedirective, :@na ] )\n r\n end\n }\n end\n\n rule string_with_quotes\n string_with_doublequotes ''\n {\n def ast\n string_with_doublequotes.ast\n end\n }\n /\n string_with_singlequotes ''\n {\n def ast\n string_with_singlequotes.ast\n end\n }\n end\n\n rule string_with_doublequotes\n '\"' string_double_q '\"'\n {\n def ast\n string_double_q.ast\n end\n }\n end\n\n rule string_double_q\n ('\\\\\\\\' / '\\\"' / !'\"' .)* \n {\n def ast\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:gdsglobvars] ||= {}\n text_value.gsub(/(\\\\\\\\)|(\\\\n)|(\\\\\")/, '\\\\\\\\'=>'\\\\', \"\\\\n\"=>\"\\n\", '\\\\\"'=>'\"').gsub( /(?<!\\\\)\\$\\(([_a-zA-Z][_a-zA-Z0-9]*)\\)/ ) { |s1| key = s1.match('[_a-zA-Z0-9]+')[0].to_sym\n unless ::LDLgeneratedLanguage::Gds_013_data.globalvars[:gdsglobvars].key?(key)\n s = \"GDS: undefined variable in string interpolation: \"\n nt = self\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size + text_value.index( /(?<!\\\\)\\$\\(([_a-zA-Z][_a-zA-Z0-9]*)\\)/ ) + 2\n s += \"\#{key}, line \#{lineOfFailure}, column \#{columnOfFailure}\" + \"\\n\"\n s += \"--->\" + \"\\n\"\n s += nt.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + \"\\n\"\n s += ' '*((columnOfFailure) -1) + '^' + \"\\n\"\n s += \"<---\" + \"\\n\"\n raise SyntaxError, s\n end\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:gdsglobvars][key].to_s }.gsub(/\\\\\\$/, \"$\" )\n \n end\n }\n end\n\n rule string_with_singlequotes\n '\\'' string_single_q '\\''\n {\n def ast\n string_single_q.ast\n end\n }\n end\n\n rule string_single_q\n ('\\\\\\\\'/ '\\\\\\'' / !'\\'' .)* \n {\n def ast\n text_value.gsub(/(\\\\\\\\)|(\\\\n)|(\\\\')/, '\\\\\\\\'=>'\\\\', \"\\\\n\"=>\"\\n\", \"\\\\'\"=>\"'\")\n end\n }\n end\n\n rule string_no_leading_space\n (&\"$(\" / ( !\"$\" !';' !'!' !'@' !'&' !'*' !' ' !':' !',' !\"|\" !'#' !'/*')) (!\"\\n\" !\"|\" !'#' !'/*' .)+ \n {\n def ast\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:gdsglobvars] ||= {}\n text_value.rstrip.gsub( /(?<!\\\\)\\$\\(([_a-zA-Z][_a-zA-Z0-9]*)\\)/ ) { |s1| key = s1.match('[_a-zA-Z0-9]+')[0].to_sym\n unless ::LDLgeneratedLanguage::Gds_013_data.globalvars[:gdsglobvars].key?(key)\n s = \"GDS: undefined variable in string interpolation: \"\n nt = self\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size + text_value.index( /(?<!\\\\)\\$\\(([_a-zA-Z][_a-zA-Z0-9]*)\\)/ ) + 2\n s += \"\#{key}, line \#{lineOfFailure}, column \#{columnOfFailure}\" + \"\\n\"\n s += \"--->\" + \"\\n\"\n s += nt.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + \"\\n\"\n s += ' '*((columnOfFailure) -1) + '^' + \"\\n\"\n s += \"<---\" + \"\\n\"\n raise SyntaxError, s\n end\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:gdsglobvars][key].to_s }.gsub(/\\\\\\$/, \"$\" )\n \n end\n }\n end\n\n rule keydef\n string_with_quotes '' \n {\n def ast\n string_with_quotes.ast.to_sym \n end\n }\n /\n identifier ''\n {\n def ast\n identifier.ast\n end\n }\n end\n\n rule variable_val\n wscommnl2 '$' varname \n {\n def ast\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:gdsglobvars] ||= {}\n unless ::LDLgeneratedLanguage::Gds_013_data.globalvars[:gdsglobvars].key?(varname.ast)\n s = \"GDS: undefined variable: \"\n nt = varname\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast}, line \#{lineOfFailure}, column \#{columnOfFailure}\" + \"\\n\"\n s += \"--->\" + \"\\n\"\n s += nt.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + \"\\n\"\n s += ' '*((columnOfFailure) -1) + '^' + \"\\n\"\n s += \"<---\" + \"\\n\"\n raise SyntaxError, s\n end\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:gdsglobvars][varname.ast]\n \n end\n }\n end\n\n rule variable_val_ind\n '$' varname \n {\n def ast\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:gdsglobvars] ||= {}\n unless ::LDLgeneratedLanguage::Gds_013_data.globalvars[:gdsglobvars].key?(varname.ast)\n s = \"GDS: undefined variable: \"\n nt = varname\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast}, line \#{lineOfFailure}, column \#{columnOfFailure}\" + \"\\n\"\n s += \"--->\" + \"\\n\"\n s += nt.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + \"\\n\"\n s += ' '*((columnOfFailure) -1) + '^' + \"\\n\"\n s += \"<---\" + \"\\n\"\n raise SyntaxError, s\n end\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:gdsglobvars][varname.ast]\n \n end\n }\n end\n\n rule refuse_ind\n '*' identifier \n {\n def ast\n \n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences] ||= {}\n unless ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][identifier.ast]\n s = \"GDS: undefined reference: \"\n nt = identifier\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast}, line \#{lineOfFailure}, column \#{columnOfFailure}\" + \"\\n\"\n s += \"--->\" + \"\\n\"\n s += nt.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + \"\\n\"\n s += ' '*((columnOfFailure) -1) + '^' + \"\\n\"\n s += \"<---\" + \"\\n\"\n raise SyntaxError, s\n end\n ::LDLgeneratedLanguage::Gds_013_data.globalvars[:internreferences][identifier.ast]\n \n end\n }\n end\n\n rule number_int\n octal_int ''\n {\n def ast\n octal_int.ast\n end\n }\n /\n binary_int ''\n {\n def ast\n binary_int.ast\n end\n }\n /\n hexa_int ''\n {\n def ast\n hexa_int.ast\n end\n }\n /\n decimal_int ''\n {\n def ast\n decimal_int.ast\n end\n }\n end\n\n rule octal_int\n ('-'/'+')? ( '0o' / '0' ) [0-7] ( [0-7] / '_' [0-7] )* \n {\n def ast\n text_value.to_i(8)\n end\n }\n end\n\n rule binary_int\n ('-'/'+')? '0b' [01] ( [01] / '_' [01] )* \n {\n def ast\n text_value.to_i(2)\n end\n }\n end\n\n rule hexa_int\n ('-'/'+')? '0x' [0-9a-fA-F] ( [0-9a-fA-F] / '_' [0-9a-fA-F] )* \n {\n def ast\n text_value.to_i(16)\n end\n }\n end\n\n rule decimal_int\n ('-'/'+')? ('0d')? [1-9] ( [0-9] / '_' [0-9] )* \n {\n def ast\n text_value.to_i\n end\n }\n /\n ('0d')? [0] \n {\n def ast\n text_value.to_i\n end\n }\n end\n\n rule number_float\n [+-]? ( [0-9] / '_' [0-9] )* [.] [0-9] ( [0-9] / '_' [0-9] )* (('e'/'E') [+-]? [0-9] ( [0-9] / '_' [0-9] )* )? \n {\n def ast\n text_value.to_f\n end\n }\n end\n\n rule rubysymbol\n wscommnl2 ':' rubysymbolcontent \n {\n def ast\n rubysymbolcontent.ast\n end\n }\n end\n\n rule rubysymbolcontent\n wscommnl2 '\"' rubysymbol_in_double_quotes '\"' \n {\n def ast\n rubysymbol_in_double_quotes.ast\n end\n }\n /\n wscommnl2 '\\'' rubysymbol_in_single_quotes '\\'' \n {\n def ast\n rubysymbol_in_single_quotes.ast\n end\n }\n /\n ( !'}' !' ' !',' !']' !'#' !'/*' !'*/' !\"\\n\" .)+ \n {\n def ast\n text_value.to_sym\n end\n }\n end\n\n rule rubysymbol_ind\n ':' rubysymbolcontent_ind \n {\n def ast\n rubysymbolcontent_ind.ast\n end\n }\n end\n\n rule rubysymbolcontent_ind\n '\"' rubysymbol_in_double_quotes '\"' \n {\n def ast\n rubysymbol_in_double_quotes.ast\n end\n }\n /\n '\\'' rubysymbol_in_single_quotes '\\'' \n {\n def ast\n rubysymbol_in_single_quotes.ast\n end\n }\n /\n (!' ' !'|' !'#' !'/*' !'*/' !\"\\n\" .)+ \n {\n def ast\n text_value.to_sym\n end\n }\n end\n\n rule rubysymbol_in_double_quotes\n ('\\\"' / !'\"' !\"\\n\" .)+ \n {\n def ast\n text_value.to_sym\n end\n }\n end\n\n rule rubysymbol_in_single_quotes\n ('\\\\\\'' / !'\\'' !\"\\n\" .)+ \n {\n def ast\n text_value.to_sym\n end\n }\n end\n\n rule ruby_eval\n '@r' ws evalexpr \n {\n def ast\n ::LDLgeneratedLanguage::Gds_013_data.config[:context] ? (eval(evalexpr.ast, ::LDLgeneratedLanguage::Gds_013_data.config[:context])) : nil \n end\n }\n /\n '@env' ws evalexpr \n {\n def ast\n ::LDLgeneratedLanguage::Gds_013_data.config[:allow_env] ? (eval(\"ENV['\#{evalexpr.ast.strip}']\")) : nil \n end\n }\n end\n\n rule evalexpr\n evalexpr_0_with_nesting ''\n {\n def ast\n evalexpr_0_with_nesting.ast\n end\n }\n end\n\n rule evalexpr_0_with_nesting\n &{ |s| @evalexpr_0_with_nestingLevel = 0; true }\n '(' evalexpr_0_with_nesting_sub ')'\n {\n def ast\n evalexpr_0_with_nesting_sub.ast\n end\n }\n end\n\n rule evalexpr_0_with_nesting_sub\n '(' \n &{ |s| @evalexpr_0_with_nestingLevel += 1; true }\n evalexpr_0_with_nesting_sub\n {\n def ast\n '(' + evalexpr_0_with_nesting_sub.ast\n end\n }\n /\n ')' \n &{ |s| ok = (@evalexpr_0_with_nestingLevel > 0); ok } \n &{ |s| @evalexpr_0_with_nestingLevel -= 1; true }\n evalexpr_0_with_nesting_sub\n {\n def ast\n ')' + evalexpr_0_with_nesting_sub.ast\n end\n }\n /\n ( !\"(\" !\")\" . )+ evalexpr_0_with_nesting_sub\n {\n def ast\n text_value\n end\n }\n /\n ''\n {\n def ast\n ''\n end\n }\n end\n\n rule evalexpr_0_with_nesting_onechar\n ( !\")\" . )\n {\n def ast\n text_value\n end\n }\n end\n\n rule bc_0\n &{ |s| @bc_0Level = 0; true }\n '/*' bc_0_sub '*/'\n {\n def ast\n \"/*\" + bc_0_sub.ast + \"*/\"\n end\n }\n end\n\n rule bc_0_sub\n '/*' \n &{ |s| @bc_0Level += 1; true }\n bc_0_sub\n {\n def ast\n '/*' + bc_0_sub.ast\n end\n }\n /\n '*/' \n &{ |s| ok = (@bc_0Level > 0); ok } \n &{ |s| @bc_0Level -= 1; true }\n bc_0_sub\n {\n def ast\n '*/' + bc_0_sub.ast\n end\n }\n /\n ( !\"/*\" !\"*/\" . )+ bc_0_sub\n {\n def ast\n text_value\n end\n }\n /\n ''\n {\n def ast\n ''\n end\n }\n end\n\n rule bc_0_onechar\n ( !\"*/\" . )\n {\n def ast\n text_value\n end\n }\n end\n\n rule wsc\n [ \\t] \n {\n }\n /\n bc_0 '' \n {\n }\n end\n\n rule identifier\n ([a-zA-Z_] [a-zA-Z0-9_]*)\n {\n def ast\n text_value.to_sym\n end\n }\n end\n\n rule string_no_space\n [a-zA-Z0-9_/.:]+\n {\n def ast\n text_value\n end\n }\n end\n\n rule indentation\n ' '*\n end\n\n rule ws\n wsc*\n end\n\n rule icomm\n '#' \n end\n\n rule wscommnl\n ws ( icomm ( !\"\\n\" . )* )? \"\\n\"\n end\n\n rule wscommnl2\n ( icomm ( !\"\\n\" . )* \"\\n\" / \"\\n\" / wsc )*\n end\n\nend\n"
46
+
47
+ end
48
+ end
49
+
50
+ #===============================================================================
51
+
@@ -1,4 +1,4 @@
1
1
 
2
2
  class GDstruct
3
- VERSION = '0.7.1'
3
+ VERSION = '0.8.0'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gdstruct
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Uli Ramminger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-12 00:00:00.000000000 Z
11
+ date: 2018-12-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: treetop
@@ -74,7 +74,7 @@ files:
74
74
  - README.md
75
75
  - Rakefile
76
76
  - lib/gdstruct.rb
77
- - lib/gdstruct/gds_012.rb
77
+ - lib/gdstruct/gds_013.rb
78
78
  - lib/gdstruct/version.rb
79
79
  homepage: https://urasepandia.de/gds.html
80
80
  licenses:
@@ -1,51 +0,0 @@
1
- #===============================================================================
2
-
3
- module LDLgeneratedLanguage
4
-
5
- class Gds_012_data
6
- def self.config
7
- @@config ||= {}
8
- end
9
- end
10
-
11
- class Gds
12
- require 'treetop'
13
-
14
- class SyntaxError < ::StandardError
15
- end
16
-
17
- def self.parse( s, config = {} )
18
- ::LDLgeneratedLanguage::Gds_012_data.config.replace( { allow_env: false, context: nil }.merge( config ) )
19
-
20
- @parserClass ||= begin
21
- Treetop.load_from_string GrammarDef
22
- instance_eval( 'Gds_012Parser' )
23
- end
24
- parser = @parserClass.new
25
-
26
- parseTree = parser.parse( s + "\n" )
27
-
28
- unless parseTree
29
- lineOfFailure = parser.failure_line
30
- columnOfFailure = parser.failure_column
31
-
32
- s = "GDS: Error happend, while parsing the definition: line #{lineOfFailure}, column #{columnOfFailure}" + "\n"
33
- s += parser.failure_reason + "\n" if parser.failure_reason
34
- s += "--->" + "\n"
35
- s += parser.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + "\n"
36
- s += ' '*((parser.failure_column) -1) + '^' + "\n"
37
- s += "<---" + "\n"
38
-
39
- raise SyntaxError, s
40
- end
41
-
42
- parseTree.ast
43
- end
44
-
45
- GrammarDef = "grammar Gds_012\n\n rule top\n &{ |s| @indentationLevels = []; true }\n defs ''\n {\n def ast\n eval 'class ::LDLgeneratedLanguage::Gds_012_data; def self.globalvars; @@globalvars ||= {}; end; end'\n ::LDLgeneratedLanguage::Gds_012_data.globalvars.clear\n defs.ast\n end\n }\n end\n\n rule defs\n wscommnl* schemadefs ws defs2 \n {\n def ast\n ::LDLgeneratedLanguage::Gds_012_data.globalvars[:schemata] = schemadefs.ast\n defs2.ast\n end\n }\n /\n wscommnl* defs2\n {\n def ast\n defs2.ast\n end\n }\n end\n\n rule schemadefs\n schemadef+ \n {\n def ast\n r = []\n elements.each do |e|\n r << e.ast\n end\n r\n end\n }\n end\n\n rule schemadef\n wscommnl2 '$' schemaname wscommnl2 '(' wscommnl2 schema_fieldlist wscommnl2 ')' \n {\n def ast\n r = {}\n r.merge!( Hash[ :name, schemaname.ast ] )\n r.merge!( Hash[ :fields, schema_fieldlist.ast ] )\n r\n end\n }\n end\n\n rule schemaname\n identifier '' \n {\n def ast\n identifier.ast\n end\n }\n end\n\n rule schema_fieldlist\n schemafield wscommnl2 ',' wscommnl2 schema_fieldlist \n {\n def ast\n r = []\n r << schemafield.ast\n r.concat( schema_fieldlist.ast )\n r\n end\n }\n /\n schemafield '' \n {\n def ast\n r = []\n r << schemafield.ast\n r\n end\n }\n end\n\n rule schemafield\n identifier '' \n {\n def ast\n identifier.ast\n end\n }\n end\n\n rule defs2\n wscommnl2 ruby_standard_def wscommnl2\n {\n def ast\n ruby_standard_def.ast\n end\n }\n /\n wscommnl* special_indented_def wscommnl2\n {\n def ast\n special_indented_def.ast\n end\n }\n end\n\n rule ruby_standard_def\n hashdef ''\n {\n def ast\n hashdef.ast\n end\n }\n /\n arraydef ''\n {\n def ast\n arraydef.ast\n end\n }\n end\n\n rule special_indented_def\n arraydef_ind ''\n {\n def ast\n arraydef_ind.ast\n end\n }\n /\n hashdef_ind ''\n {\n def ast\n hashdef_ind.ast\n end\n }\n end\n\n rule hashdef\n wscommnl2 '{' wscommnl2 hashsubdefs wscommnl2 '}' \n {\n def ast\n hashsubdefs.ast\n end\n }\n end\n\n rule arraydef\n wscommnl2 '[' wscommnl2 arraysubdefs wscommnl2 ']' \n {\n def ast\n arraysubdefs.ast\n end\n }\n end\n\n rule hashsubdefs\n hashsubdef wscommnl2 morehashsubdefs \n {\n def ast\n r = {}\n r.merge!( hashsubdef.ast )\n r.merge!( morehashsubdefs.ast )\n r\n end\n }\n /\n ''\n {\n def ast\n {}\n end\n }\n end\n\n rule morehashsubdefs\n morehashsubdef*\n {\n def ast\n r = {}\n elements.each { |e| r.merge!( e.ast ) }\n r\n end\n }\n end\n\n rule morehashsubdef\n wscommnl2 ',' wscommnl2 hashsubdef\n {\n def ast\n hashsubdef.ast\n end\n }\n end\n\n rule hashsubdef\n keyvaluedef ''\n {\n def ast\n keyvaluedef.ast\n end\n }\n /\n keydef ':' wscommnl2 hashdef \n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, hashdef.ast ] )\n r\n end\n }\n /\n wscommnl2 ':' keydef wscommnl2 '=>' wscommnl2 hashdef \n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, hashdef.ast ] )\n r\n end\n }\n /\n keydef ':' wscommnl2 arraydef \n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, arraydef.ast ] )\n r\n end\n }\n /\n wscommnl2 ':' keydef wscommnl2 '=>' wscommnl2 arraydef \n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, arraydef.ast ] )\n r\n end\n }\n end\n\n rule arraysubdefs\n arraysubdef wscommnl2 morearraysubdefs \n {\n def ast\n r = []\n r << arraysubdef.ast\n r.concat( morearraysubdefs.ast )\n r\n end\n }\n /\n '' \n {\n def ast\n r = []\n r\n end\n }\n end\n\n rule morearraysubdefs\n morearraysubdef* \n {\n def ast\n r = []\n elements.each do |e|\n r << e.ast\n end\n r\n end\n }\n end\n\n rule morearraysubdef\n wscommnl2 ',' wscommnl2 arraysubdef\n {\n def ast\n arraysubdef.ast\n end\n }\n end\n\n rule arraysubdef\n valuedef ''\n {\n def ast\n valuedef.ast\n end\n }\n /\n arraydef ''\n {\n def ast\n arraydef.ast\n end\n }\n /\n hashdef ''\n {\n def ast\n hashdef.ast\n end\n }\n /\n hashsubdef ''\n {\n def ast\n hashsubdef.ast\n end\n }\n end\n\n rule hashdef_ind\n indentation ': ' ws keyvaluedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( keyvaluedefs_ind.ast )\n r.merge!( hashsubdefs_ind.ast )\n r\n end\n }\n /\n indentation ':' wscommnl+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n hashsubdefs_ind.ast\n end\n }\n /\n indentation '' \n &{ |s| level = s[0].text_value.length; @lastIndentation=level; true } \n &{ |s| false }\n {\n def ast\n end\n }\n /\n &{ |s| @indentationLevels << (@lastIndentation-2); true }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( hashsubdefs_ind.ast )\n r\n end\n }\n end\n\n rule arraydef_ind\n indentation ',' ws '$' schemaname wscommnl+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n ::LDLgeneratedLanguage::Gds_012_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_012_data.globalvars[:schema] << schemaname.ast\n res = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_012_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation ',' ws valuedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = []\n r.concat( valuedefs_ind.ast )\n r.concat( arraysubdefs_ind.ast )\n r\n end\n }\n /\n indentation ',' wscommnl+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n arraysubdefs_ind.ast\n end\n }\n end\n\n rule hashsubdefs_ind\n ( \n &{ |s| save = index; i = _nt_indentation; level = i.text_value.length; index = save; ok = (level == (2 + @indentationLevels.last)); ok }\n hashsubdef_ind '' \n )*\n {\n def ast\n r = {}\n elements.each { |e| r.merge!( e.hashsubdef_ind.ast ) }\n r\n end\n }\n end\n\n rule hashsubdef_ind\n indentation bc_0_l:(bc_0*) ws keyvaluedefs_ind \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl+\n {\n def ast\n keyvaluedefs_ind.ast\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws ',' ws '$' schemaname wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n ::LDLgeneratedLanguage::Gds_012_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_012_data.globalvars[:schema] << schemaname.ast\n r = {}\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n res = r\n ::LDLgeneratedLanguage::Gds_012_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws ',' ws valuedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, begin [].concat( valuedefs_ind.ast ).concat( arraysubdefs_ind.ast ) end ] )\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws ',' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, arraysubdefs_ind.ast ] )\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, hashsubdefs_ind.ast ] )\n r\n end\n }\n end\n\n rule arraysubdefs_ind\n ( \n &{ |s| save = index; i = _nt_indentation; level = i.text_value.length; index = save; ok = (level == (2 + @indentationLevels.last)); ok }\n arraysubdef_ind '' \n )*\n {\n def ast\n r = []\n elements.each do |e|\n e1 = e.arraysubdef_ind.ast\n if e1.is_a?( Array )\n r.concat e1\n else\n r << e1\n end\n end\n r\n end\n }\n end\n\n rule arraysubdef_ind\n indentation ': ' ws keyvaluedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( keyvaluedefs_ind.ast )\n r.merge!( hashsubdefs_ind.ast )\n r\n end\n }\n /\n indentation ': ' ws keyvaluedefs_ind \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl+\n {\n def ast\n keyvaluedefs_ind.ast\n end\n }\n /\n indentation ':' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n hashsubdefs_ind.ast\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws keydef ws ':' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, hashsubdefs_ind.ast ] )\n r\n end\n }\n /\n indentation ',' ws '$' schemaname wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n ::LDLgeneratedLanguage::Gds_012_data.globalvars[:schema] ||= []\n ::LDLgeneratedLanguage::Gds_012_data.globalvars[:schema] << schemaname.ast\n res = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_012_data.globalvars[:schema].pop\n [ res ]\n end\n }\n /\n indentation ',' ws valuedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = []\n r.concat( valuedefs_ind.ast )\n r.concat( arraysubdefs_ind.ast )\n [\n r\n ]\n end\n }\n /\n indentation ',' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n [\n arraysubdefs_ind.ast\n ]\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws valuedefs_ind \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl+\n {\n def ast\n valuedefs_ind.ast\n end\n }\n end\n\n rule arraysubdefs_schema_ind\n ( \n &{ |s| save = index; i = _nt_indentation; level = i.text_value.length; index = save; ok = (level == (2 + @indentationLevels.last)); ok }\n arraysubdef_schema_ind '' \n )*\n {\n def ast\n r = []\n elements.each do |e|\n r << e.arraysubdef_schema_ind.ast\n end\n r\n end\n }\n end\n\n rule arraysubdef_schema_ind\n indentation ':' ws schemavaluedefs_ind wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n schemavaluedefs_ind.ast .each_with_index.map do |e,i|\n Hash[ ::LDLgeneratedLanguage::Gds_012_data.globalvars[:schemata].find{|s| s[:name] == ::LDLgeneratedLanguage::Gds_012_data.globalvars[:schema].last }[:fields][i], e ]\n end.inject({}){ |res,e1| res.merge!(e1);res }.merge!( hashsubdefs_ind.ast )\n \n end\n }\n /\n indentation ':' ws schemavaluedefs_ind \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl+\n {\n def ast\n schemavaluedefs_ind.ast .each_with_index.map do |e,i|\n Hash[ ::LDLgeneratedLanguage::Gds_012_data.globalvars[:schemata].find{|s| s[:name] == ::LDLgeneratedLanguage::Gds_012_data.globalvars[:schema].last }[:fields][i], e ]\n end.inject({}){ |res,e1| res.merge!(e1);res }\n \n end\n }\n /\n indentation ':' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n hashsubdefs_ind.ast\n end\n }\n /\n indentation keydef ws ':' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, hashsubdefs_ind.ast ] )\n r\n end\n }\n /\n indentation ',' wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n arraysubdefs_ind.ast\n end\n }\n /\n indentation valuedef_ind \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl+\n {\n def ast\n valuedef_ind.ast\n end\n }\n end\n\n rule schemavaluedefs_ind\n schemavaluedef_ind ws '|' ws schemavaluedefs_ind \n {\n def ast\n r = []\n r << schemavaluedef_ind.ast\n r.concat( schemavaluedefs_ind.ast )\n r\n end\n }\n /\n schemavaluedef_ind '' \n {\n def ast\n r = []\n r << schemavaluedef_ind.ast\n r\n end\n }\n end\n\n rule schemavaluedef_ind\n valuedef_ind '' \n {\n def ast\n valuedef_ind.ast\n end\n }\n end\n\n rule keyvaluedefs_ind\n keyvaluedef_ind ws '|' ws keyvaluedefs_ind \n {\n def ast\n r = {}\n r.merge!( keyvaluedef_ind.ast )\n r.merge!( keyvaluedefs_ind.ast )\n r\n end\n }\n /\n keyvaluedef_ind ''\n {\n def ast\n keyvaluedef_ind.ast\n end\n }\n end\n\n rule keyvaluedef_ind\n keydef wsc_l:(wsc+) valuedef_ind \n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, valuedef_ind.ast ] )\n r\n end\n }\n end\n\n rule valuedef_ind\n valuedef_gen_ind ''\n {\n def ast\n valuedef_gen_ind.ast\n end\n }\n /\n special_value_ind ''\n {\n def ast\n special_value_ind.ast\n end\n }\n /\n string_no_leading_space ''\n {\n def ast\n string_no_leading_space.ast\n end\n }\n end\n\n rule keyvaluedef\n keydef ':' wscommnl2 valuedef \n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, valuedef.ast ] )\n r\n end\n }\n /\n wscommnl2 ':' keydef wscommnl2 '=>' wscommnl2 valuedef \n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, valuedef.ast ] )\n r\n end\n }\n end\n\n rule valuedefs_ind\n valuedef_ind ws '|' ws valuedefs_ind \n {\n def ast\n r = []\n r << valuedef_ind.ast\n r.concat( valuedefs_ind.ast )\n r\n end\n }\n /\n valuedef_ind '' \n {\n def ast\n r = []\n r << valuedef_ind.ast\n r\n end\n }\n end\n\n rule valuedef\n valuedef_gen ''\n {\n def ast\n valuedef_gen.ast\n end\n }\n /\n special_value ''\n {\n def ast\n special_value.ast\n end\n }\n end\n\n rule valuedef_gen\n number_float ''\n {\n def ast\n number_float.ast\n end\n }\n /\n number_int ''\n {\n def ast\n number_int.ast\n end\n }\n /\n rubysymbol ''\n {\n def ast\n rubysymbol.ast\n end\n }\n /\n string_with_quotes ''\n {\n def ast\n string_with_quotes.ast\n end\n }\n end\n\n rule special_value\n 'nil' \n {\n def ast\n nil\n end\n }\n /\n 'true' \n {\n def ast\n true\n end\n }\n /\n 'false' \n {\n def ast\n false\n end\n }\n end\n\n rule valuedef_gen_ind\n ruby_eval ''\n {\n def ast\n ruby_eval.ast\n end\n }\n /\n number_float ''\n {\n def ast\n number_float.ast\n end\n }\n /\n number_int ''\n {\n def ast\n number_int.ast\n end\n }\n /\n rubysymbol_ind ''\n {\n def ast\n rubysymbol_ind.ast\n end\n }\n /\n string_with_quotes ''\n {\n def ast\n string_with_quotes.ast\n end\n }\n end\n\n rule special_value_ind\n '!nil' \n {\n def ast\n nil\n end\n }\n /\n '!true' \n {\n def ast\n true\n end\n }\n /\n '!false' \n {\n def ast\n false\n end\n }\n end\n\n rule string_with_quotes\n string_with_doublequotes ''\n {\n def ast\n string_with_doublequotes.ast\n end\n }\n /\n string_with_singlequotes ''\n {\n def ast\n string_with_singlequotes.ast\n end\n }\n end\n\n rule string_with_doublequotes\n '\"' string_double_q '\"'\n {\n def ast\n string_double_q.ast\n end\n }\n end\n\n rule string_double_q\n ('\\\\\\\\' / '\\\"' / !'\"' .)* \n {\n def ast\n text_value.gsub(/(\\\\\\\\)|(\\\\n)|(\\\\\")/, '\\\\\\\\'=>'\\\\', \"\\\\n\"=>\"\\n\", '\\\\\"'=>'\"' )\n end\n }\n end\n\n rule string_with_singlequotes\n '\\'' string_single_q '\\''\n {\n def ast\n string_single_q.ast\n end\n }\n end\n\n rule string_single_q\n ('\\\\\\\\'/ '\\\\\\'' / !'\\'' .)* \n {\n def ast\n text_value.gsub(/(\\\\\\\\)|(\\\\n)|(\\\\')/, '\\\\\\\\'=>'\\\\', \"\\\\n\"=>\"\\n\", \"\\\\'\"=>\"'\" )\n end\n }\n end\n\n rule string_no_leading_space\n !' ' !',' !\"|\" !'#' !'/*' (!\"\\n\" !\"|\" !'#' !'/*' .)+ \n {\n def ast\n text_value.rstrip\n end\n }\n end\n\n rule keydef\n string_with_quotes '' \n {\n def ast\n string_with_quotes.ast.to_sym \n end\n }\n /\n identifier ''\n {\n def ast\n identifier.ast\n end\n }\n end\n\n rule number_int\n octal_int ''\n {\n def ast\n octal_int.ast\n end\n }\n /\n binary_int ''\n {\n def ast\n binary_int.ast\n end\n }\n /\n hexa_int ''\n {\n def ast\n hexa_int.ast\n end\n }\n /\n decimal_int ''\n {\n def ast\n decimal_int.ast\n end\n }\n end\n\n rule octal_int\n ('-'/'+')? ( '0o' / '0' ) [0-7] ( [0-7] / '_' [0-7] )* \n {\n def ast\n text_value.to_i(8)\n end\n }\n end\n\n rule binary_int\n ('-'/'+')? '0b' [01] ( [01] / '_' [01] )* \n {\n def ast\n text_value.to_i(2)\n end\n }\n end\n\n rule hexa_int\n ('-'/'+')? '0x' [0-9a-fA-F] ( [0-9a-fA-F] / '_' [0-9a-fA-F] )* \n {\n def ast\n text_value.to_i(16)\n end\n }\n end\n\n rule decimal_int\n ('-'/'+')? ('0d')? [1-9] ( [0-9] / '_' [0-9] )* \n {\n def ast\n text_value.to_i\n end\n }\n /\n ('0d')? [0] \n {\n def ast\n text_value.to_i\n end\n }\n end\n\n rule number_float\n [+-]? ( [0-9] / '_' [0-9] )* [.] [0-9] ( [0-9] / '_' [0-9] )* (('e'/'E') [+-]? [0-9] ( [0-9] / '_' [0-9] )* )? \n {\n def ast\n text_value.to_f\n end\n }\n end\n\n rule rubysymbol\n wscommnl2 ':' rubysymbolcontent \n {\n def ast\n rubysymbolcontent.ast\n end\n }\n end\n\n rule rubysymbolcontent\n wscommnl2 '\"' rubysymbol_in_double_quotes '\"' \n {\n def ast\n rubysymbol_in_double_quotes.ast\n end\n }\n /\n wscommnl2 '\\'' rubysymbol_in_single_quotes '\\'' \n {\n def ast\n rubysymbol_in_single_quotes.ast\n end\n }\n /\n ( !'}' !' ' !',' !']' !'#' !'/*' !'*/' !\"\\n\" .)+ \n {\n def ast\n text_value.to_sym\n end\n }\n end\n\n rule rubysymbol_ind\n ':' rubysymbolcontent_ind \n {\n def ast\n rubysymbolcontent_ind.ast\n end\n }\n end\n\n rule rubysymbolcontent_ind\n '\"' rubysymbol_in_double_quotes '\"' \n {\n def ast\n rubysymbol_in_double_quotes.ast\n end\n }\n /\n '\\'' rubysymbol_in_single_quotes '\\'' \n {\n def ast\n rubysymbol_in_single_quotes.ast\n end\n }\n /\n (!' ' !'|' !'#' !'/*' !'*/' !\"\\n\" .)+ \n {\n def ast\n text_value.to_sym\n end\n }\n end\n\n rule rubysymbol_in_double_quotes\n ('\\\"' / !'\"' !\"\\n\" .)+ \n {\n def ast\n text_value.to_sym\n end\n }\n end\n\n rule rubysymbol_in_single_quotes\n ('\\\\\\'' / !'\\'' !\"\\n\" .)+ \n {\n def ast\n text_value.to_sym\n end\n }\n end\n\n rule ruby_eval\n '@r' ws evalexpr \n {\n def ast\n ::LDLgeneratedLanguage::Gds_012_data.config[:context] ? (eval(evalexpr.ast, ::LDLgeneratedLanguage::Gds_012_data.config[:context])) : nil \n end\n }\n /\n '@env' ws evalexpr \n {\n def ast\n ::LDLgeneratedLanguage::Gds_012_data.config[:allow_env] ? (eval(\"ENV['\#{evalexpr.ast.strip}']\")) : nil \n end\n }\n end\n\n rule evalexpr\n evalexpr_0_with_nesting ''\n {\n def ast\n evalexpr_0_with_nesting.ast\n end\n }\n end\n\n rule evalexpr_0_with_nesting\n &{ |s| @evalexpr_0_with_nestingLevel = 0; true }\n '(' evalexpr_0_with_nesting_sub ')'\n {\n def ast\n evalexpr_0_with_nesting_sub.ast\n end\n }\n end\n\n rule evalexpr_0_with_nesting_sub\n '(' \n &{ |s| @evalexpr_0_with_nestingLevel += 1; true }\n evalexpr_0_with_nesting_sub\n {\n def ast\n '(' + evalexpr_0_with_nesting_sub.ast\n end\n }\n /\n ')' \n &{ |s| ok = (@evalexpr_0_with_nestingLevel > 0); ok } \n &{ |s| @evalexpr_0_with_nestingLevel -= 1; true }\n evalexpr_0_with_nesting_sub\n {\n def ast\n ')' + evalexpr_0_with_nesting_sub.ast\n end\n }\n /\n ( !\"(\" !\")\" . )+ evalexpr_0_with_nesting_sub\n {\n def ast\n text_value\n end\n }\n /\n ''\n {\n def ast\n ''\n end\n }\n end\n\n rule evalexpr_0_with_nesting_onechar\n ( !\")\" . )\n {\n def ast\n text_value\n end\n }\n end\n\n rule bc_0\n &{ |s| @bc_0Level = 0; true }\n '/*' bc_0_sub '*/'\n {\n def ast\n \"/*\" + bc_0_sub.ast + \"*/\"\n end\n }\n end\n\n rule bc_0_sub\n '/*' \n &{ |s| @bc_0Level += 1; true }\n bc_0_sub\n {\n def ast\n '/*' + bc_0_sub.ast\n end\n }\n /\n '*/' \n &{ |s| ok = (@bc_0Level > 0); ok } \n &{ |s| @bc_0Level -= 1; true }\n bc_0_sub\n {\n def ast\n '*/' + bc_0_sub.ast\n end\n }\n /\n ( !\"/*\" !\"*/\" . )+ bc_0_sub\n {\n def ast\n text_value\n end\n }\n /\n ''\n {\n def ast\n ''\n end\n }\n end\n\n rule bc_0_onechar\n ( !\"*/\" . )\n {\n def ast\n text_value\n end\n }\n end\n\n rule wsc\n [ \\t] \n {\n }\n /\n bc_0 '' \n {\n }\n end\n\n rule identifier\n ([a-zA-Z_] [a-zA-Z0-9_]*)\n {\n def ast\n text_value.to_sym\n end\n }\n end\n\n rule string_no_space\n [a-zA-Z0-9_/.:]+\n {\n def ast\n text_value\n end\n }\n end\n\n rule indentation\n ' '*\n end\n\n rule ws\n wsc*\n end\n\n rule icomm\n '#' \n end\n\n rule wscommnl\n ws ( icomm ( !\"\\n\" . )* )? \"\\n\"\n end\n\n rule wscommnl2\n ( icomm ( !\"\\n\" . )* \"\\n\" / \"\\n\" / wsc )*\n end\n\nend\n"
46
-
47
- end
48
- end
49
-
50
- #===============================================================================
51
-