gdstruct 0.8.0 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +35 -19
- data/MIT-LICENSE +1 -1
- data/README.md +190 -78
- data/lib/gdstruct.rb +1 -1
- data/lib/gdstruct/gds_014.rb +51 -0
- data/lib/gdstruct/version.rb +1 -1
- metadata +3 -3
- data/lib/gdstruct/gds_013.rb +0 -51
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b240f3ba1af106aee50c90fe52c39d5ce3be3094
|
|
4
|
+
data.tar.gz: 0f4c4c2cd017f3c876a868a6891822e84529d824
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2a29d61e3454509f5a38099a809bced2c4f43b49aa36443a8f67226eaf780c9198c81cb49a577f2660d8dcde97ce28e84b342f5a2bd6e861b76ddf393482e56e
|
|
7
|
+
data.tar.gz: 136228b7786224a2d5ea20cbf81d10241add2d851fa0833245b19da69c5d3d58fe3658639dc4def1f494b9875b98be3d4d396889ed9f8a2eaf5dd1b0b9b4c261
|
data/CHANGELOG.md
CHANGED
|
@@ -1,48 +1,64 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
+
### 0.8.1 - (2019-02-08)
|
|
4
|
+
|
|
5
|
+
* __feature__
|
|
6
|
+
improving the consistency of block comments; they can appear now at the beginning of every line and every construct
|
|
7
|
+
now they even can appear before a colon (:) for the definition of a hash, and before a comma (,) for the definition of an array
|
|
8
|
+
you just need to pay attention for the proper indentation
|
|
9
|
+
|
|
10
|
+
* __change__
|
|
11
|
+
internal change: improving the grammar for the GDS language - reducing the number of rule alternatives
|
|
12
|
+
|
|
3
13
|
### 0.8.0 - (2018-12-14)
|
|
4
14
|
|
|
5
15
|
* __feature__
|
|
6
16
|
string interpolation
|
|
7
17
|
the values of variables are substituted into string literals
|
|
8
|
-
string interpolation works for double-quoted strings and default strings
|
|
9
|
-
example:
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
18
|
+
string interpolation works for double-quoted strings and default strings
|
|
19
|
+
example:
|
|
20
|
+
~~~
|
|
21
|
+
$object = house
|
|
22
|
+
setup "This is a $(object)."
|
|
23
|
+
# => { setup: "This is a house." }
|
|
24
|
+
~~~
|
|
13
25
|
|
|
14
26
|
* __feature__
|
|
15
27
|
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
|
|
28
|
+
if there are more values listed than keys for the schema specifier are defined, then an exception is raised
|
|
29
|
+
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
30
|
|
|
19
31
|
* __breaking change__, __bugfix__
|
|
20
32
|
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
|
|
33
|
+
syntax change: now after colon (:) for defining a hash, there needs to be at least one space character between the colon
|
|
22
34
|
and the next expression on the same line
|
|
23
35
|
|
|
24
36
|
* __feature__
|
|
25
37
|
schema specifiers can now also be defined at the time of use
|
|
26
38
|
example:
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
39
|
+
~~~
|
|
40
|
+
persons1 , @schema person(firstname,lastname,age)
|
|
41
|
+
: Harry | Langemann | 44
|
|
42
|
+
: Susi | Heimstett | 32
|
|
43
|
+
persons2 , @schema person
|
|
44
|
+
: Ludwig | Reinemann | 33
|
|
45
|
+
~~~
|
|
32
46
|
|
|
33
47
|
* __feature__
|
|
34
48
|
anonymous schema specifiers
|
|
35
49
|
defined when used, defined without a name, for one-time use
|
|
36
50
|
example:
|
|
37
|
-
|
|
38
|
-
|
|
51
|
+
~~~
|
|
52
|
+
persons , @schema(firstname,lastname,age)
|
|
53
|
+
: Harry | Langemann | 44
|
|
54
|
+
~~~
|
|
39
55
|
|
|
40
56
|
* __breaking change__
|
|
41
57
|
change of the definition of a schema specifier
|
|
42
58
|
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
|
|
59
|
+
now : @schema name(key1,key2,...)
|
|
60
|
+
this makes it different from variables
|
|
61
|
+
change of the use of a schema specifier
|
|
46
62
|
before : , $name
|
|
47
63
|
now : , @schema name
|
|
48
64
|
|
|
@@ -56,7 +72,7 @@
|
|
|
56
72
|
@insert *ref : in an array
|
|
57
73
|
|
|
58
74
|
* __feature__
|
|
59
|
-
supporting references, definition: &ref, use: *ref
|
|
75
|
+
supporting references, definition: &ref, use: *ref
|
|
60
76
|
if a reference is used which was not defined before, then an exception is raised
|
|
61
77
|
|
|
62
78
|
* __feature__
|
data/MIT-LICENSE
CHANGED
data/README.md
CHANGED
|
@@ -2,11 +2,16 @@ gdstruct - GDS - General Data Structure
|
|
|
2
2
|
=======================================
|
|
3
3
|
|
|
4
4
|
A General Data Structure (GDS) is a universal, composable data structure, used to store any kind of data.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
The building blocks for general data structures are hashes and arrays.
|
|
6
|
+
In this definition a General Data Structure (GDS) is either a hash or an array or any composition of nested hashes and arrays.
|
|
7
|
+
|
|
8
|
+
The defined data can be used in the following situations:
|
|
9
|
+
* for the configuration or specification of systems, processes, services, frameworks, objects, methods or functions
|
|
10
|
+
* for seeding a database or any other data model
|
|
11
|
+
* to convert to other data representation formats like JSON, XML, YAML
|
|
12
|
+
|
|
13
|
+
The GDS language is a special DSL (domain specific language) for defining general data structures.
|
|
8
14
|
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
15
|
|
|
11
16
|
Installation
|
|
12
17
|
============
|
|
@@ -22,11 +27,11 @@ A Short Example
|
|
|
22
27
|
require "gdstruct"
|
|
23
28
|
|
|
24
29
|
h = GDstruct.c( <<-EOS )
|
|
25
|
-
|
|
26
|
-
|
|
30
|
+
key1 value a
|
|
31
|
+
key2 value b
|
|
27
32
|
EOS
|
|
28
33
|
|
|
29
|
-
# => h = {
|
|
34
|
+
# => h = { key1: 'value a', key2: 'value b' }
|
|
30
35
|
~~~
|
|
31
36
|
|
|
32
37
|
An Introduction
|
|
@@ -40,6 +45,9 @@ A comma (__,__) is used to define an array.
|
|
|
40
45
|
Use indentation with two spaces for the definition of elements and for nested structures.
|
|
41
46
|
Tab characters are not allowed for indentation.
|
|
42
47
|
|
|
48
|
+
The default data structure is a hash.
|
|
49
|
+
By default, the key of a key-value pair is always converted into a symbol.
|
|
50
|
+
|
|
43
51
|
## Another Example
|
|
44
52
|
|
|
45
53
|
~~~
|
|
@@ -61,84 +69,61 @@ videos
|
|
|
61
69
|
preview http://mywebsite.com/video.m4v
|
|
62
70
|
dimensions
|
|
63
71
|
height 300
|
|
64
|
-
width 400
|
|
72
|
+
width 400
|
|
65
73
|
~~~
|
|
66
74
|
|
|
67
75
|
transforms to
|
|
68
76
|
|
|
69
77
|
~~~
|
|
70
|
-
{
|
|
71
|
-
:
|
|
72
|
-
:
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
:
|
|
76
|
-
|
|
77
|
-
:
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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' ]
|
|
78
|
+
{ caption: "foo",
|
|
79
|
+
credit: "bar",
|
|
80
|
+
images: {
|
|
81
|
+
small: {
|
|
82
|
+
url: "http://mywebsite.com/image-small.jpg",
|
|
83
|
+
dimensions: {
|
|
84
|
+
height: 500,
|
|
85
|
+
width: 500 } },
|
|
86
|
+
large: {
|
|
87
|
+
url: "http://mywebsite.com/image-large.jpg",
|
|
88
|
+
dimensions: {
|
|
89
|
+
height: 500,
|
|
90
|
+
width: 500 } } },
|
|
91
|
+
videos: {
|
|
92
|
+
small: {
|
|
93
|
+
preview: "http://mywebsite.com/video.m4v",
|
|
94
|
+
dimensions: {
|
|
95
|
+
height: 300,
|
|
96
|
+
width: 400 } } } }
|
|
124
97
|
~~~
|
|
125
98
|
|
|
126
|
-
##
|
|
99
|
+
## Variables and String Interpolation
|
|
127
100
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
|
101
|
+
You can define a variable as a placeholder for a basic value.
|
|
102
|
+
In conjunction with variables, there is string interpolation supported.
|
|
103
|
+
The values of variables are substituted into string literals.
|
|
139
104
|
|
|
105
|
+
~~~
|
|
106
|
+
$main_path = /usr/john
|
|
107
|
+
$service_dir = docker-compose-service01
|
|
108
|
+
$app01_dir = application_001
|
|
109
|
+
$app02_dir = application_002
|
|
110
|
+
$app03_dir = application_003
|
|
111
|
+
$service_path = $(main_path)/$(service_dir)
|
|
140
112
|
|
|
141
|
-
|
|
113
|
+
config
|
|
114
|
+
app01_path $(main_path)/$(service_dir)/$(app01_dir)
|
|
115
|
+
app02_path $(main_path)/$(service_dir)/$(app02_dir)
|
|
116
|
+
app03_path $(service_path)/$(app03_dir)
|
|
117
|
+
~~~
|
|
118
|
+
transforms to
|
|
119
|
+
~~~
|
|
120
|
+
{ config: {
|
|
121
|
+
app01_path: "/usr/john/docker-compose-service01/application_001",
|
|
122
|
+
app02_path: "/usr/john/docker-compose-service01/application_002",
|
|
123
|
+
app03_path: "/usr/john/docker-compose-service01/application_003" } }
|
|
124
|
+
~~~
|
|
125
|
+
|
|
126
|
+
## Schema Definitions
|
|
142
127
|
|
|
143
128
|
Schema specifiers can be used to predefine the keys of a hash or subhash.
|
|
144
129
|
When you specify the values you no longer need to name the key for each value.
|
|
@@ -148,7 +133,7 @@ this features a slim and clearly arranged, table-like style for data.
|
|
|
148
133
|
|
|
149
134
|
~~~
|
|
150
135
|
@schema country(name,capital,area,population,vehicleRegistrationCode,iso3166code,callingCode)
|
|
151
|
-
, @schema country
|
|
136
|
+
, @schema country /*
|
|
152
137
|
name capital area (km^2) population vehicleRegistrationCode iso3166code callingCode
|
|
153
138
|
---------------------------------------------------------------------------------------------------------------------------- */
|
|
154
139
|
: Deutschland | Berlin | 357_385 | 82_521_653 | D | DE | 49
|
|
@@ -176,10 +161,137 @@ transforms to
|
|
|
176
161
|
]
|
|
177
162
|
~~~
|
|
178
163
|
|
|
164
|
+
## References
|
|
165
|
+
|
|
166
|
+
References can be used to define an alias for a certain sub structure, that means for a nested array or a nested hash.
|
|
167
|
+
Afterwards in the GDS definition, you can use the reference to refer to this sub structure.
|
|
168
|
+
|
|
169
|
+
For the definition of a reference you prefix an identifier (unique name) with an __&__ ampersand.
|
|
170
|
+
For the use of a reference you prefix the same identifier with an __*__ asterisk.
|
|
171
|
+
~~~
|
|
172
|
+
categories , @schema( name )
|
|
173
|
+
&e_bike : E-Bike
|
|
174
|
+
&mountain_bike : Mountain Bike
|
|
175
|
+
&city_bike : City Bike
|
|
176
|
+
&kids_bike : Kids Bike
|
|
177
|
+
|
|
178
|
+
bikes , @schema( name, frame_size, wheel_diameter, weight, category ) /*
|
|
179
|
+
----------------------------------------------------------------------------------------
|
|
180
|
+
name frame size ["] wheel diameter ["] weight [kg] category
|
|
181
|
+
---------------------------------------------------------------------------------------- */
|
|
182
|
+
: Speedstar I | 18 | 27.5 | 23.3 | *city_bike
|
|
183
|
+
: Speedstar I | 20 | 27.5 | 24.4 | *city_bike
|
|
184
|
+
: Speedstar II | 22 | 27.5 | 25.5 | *city_bike
|
|
185
|
+
: Little Pony | 16 | 16 | 5.98 | *kids_bike
|
|
186
|
+
: Rocket | 20 | 20 | 7.13 | *kids_bike
|
|
187
|
+
: Easy Cruiser | 20 | 28 | 29.4 | *e_bike
|
|
188
|
+
: Rough Buffalo | 19 | 26 | 14.7 | *mountain_bike
|
|
189
|
+
~~~
|
|
190
|
+
transforms to
|
|
191
|
+
~~~
|
|
192
|
+
{ categories: [ { name: "E-Bike" }, { name: "Mountain Bike" }, { name: "City Bike" }, { name: "Kids Bike" } ],
|
|
193
|
+
bikes: [ { name: "Speedstar I", frame_size: 18, wheel_diameter: 27.5, weight: 23.3, category: { name: "City Bike" } },
|
|
194
|
+
{ name: "Speedstar I", frame_size: 20, wheel_diameter: 27.5, weight: 24.4, category: { name: "City Bike" } },
|
|
195
|
+
{ name: "Speedstar II", frame_size: 22, wheel_diameter: 27.5, weight: 25.5, category: { name: "City Bike" } },
|
|
196
|
+
{ name: "Little Pony", frame_size: 16, wheel_diameter: 16, weight: 5.98, category: { name: "Kids Bike" } },
|
|
197
|
+
{ name: "Rocket", frame_size: 20, wheel_diameter: 20, weight: 7.13, category: { name: "Kids Bike" } },
|
|
198
|
+
{ name: "Easy Cruiser", frame_size: 20, wheel_diameter: 28, weight: 29.4, category: { name: "E-Bike" } },
|
|
199
|
+
{ name: "Rough Buffalo", frame_size: 19, wheel_diameter: 26, weight: 14.7, category: { name: "Mountain Bike" } } ] }
|
|
200
|
+
~~~
|
|
201
|
+
|
|
202
|
+
### Merging a hash into another - @merge
|
|
203
|
+
|
|
204
|
+
The __@merge__ directive can be used to merge a hash specified with a reference into another hash.
|
|
205
|
+
|
|
206
|
+
~~~
|
|
207
|
+
$logpath = /var/log/myapp
|
|
208
|
+
|
|
209
|
+
initial_settings &init
|
|
210
|
+
priority 10
|
|
211
|
+
max_size 2000
|
|
212
|
+
max_age 10
|
|
213
|
+
|
|
214
|
+
all_log_files ,
|
|
215
|
+
:
|
|
216
|
+
@merge *init
|
|
217
|
+
file $(logpath)/logfile_1.log
|
|
218
|
+
|
|
219
|
+
:
|
|
220
|
+
@merge *init
|
|
221
|
+
file $(logpath)/logfile_2.log
|
|
222
|
+
|
|
223
|
+
:
|
|
224
|
+
@merge *init
|
|
225
|
+
file $(logpath)/logfile_3.log
|
|
226
|
+
max_age 8 # overwrite an existing hash entry
|
|
227
|
+
~~~
|
|
228
|
+
transforms to
|
|
229
|
+
~~~
|
|
230
|
+
{ initial_settings: { priority: 10, max_size: 2000, max_age: 10 },
|
|
231
|
+
all_log_files: [ { priority: 10, max_size: 2000, max_age: 10, file: "/var/log/myapp/logfile_1.log" },
|
|
232
|
+
{ priority: 10, max_size: 2000, max_age: 10, file: "/var/log/myapp/logfile_2.log" },
|
|
233
|
+
{ priority: 10, max_size: 2000, max_age: 8, file: "/var/log/myapp/logfile_3.log" } ] }
|
|
234
|
+
~~~
|
|
235
|
+
|
|
236
|
+
### Inserting an array into another - @insert
|
|
237
|
+
|
|
238
|
+
The __@insert__ directive can be used to insert an array specified with a reference into another array.
|
|
239
|
+
|
|
240
|
+
~~~
|
|
241
|
+
config_files &config_files ,
|
|
242
|
+
Gemfile
|
|
243
|
+
config/application.gdstruct
|
|
244
|
+
|
|
245
|
+
docu_files &docu_files ,
|
|
246
|
+
README.md
|
|
247
|
+
CHANGELOG.md
|
|
248
|
+
|
|
249
|
+
app_files &app_files ,
|
|
250
|
+
appmodel.rb
|
|
251
|
+
appview.rb
|
|
252
|
+
appcontroller.rb
|
|
253
|
+
|
|
254
|
+
complete_file_list ,
|
|
255
|
+
@insert *config_files
|
|
256
|
+
@insert *docu_files
|
|
257
|
+
@insert *app_files
|
|
258
|
+
my_special.rb
|
|
259
|
+
~~~
|
|
260
|
+
transforms to
|
|
261
|
+
~~~
|
|
262
|
+
{ config_files: [ "Gemfile", "config/application.gdstruct" ],
|
|
263
|
+
docu_files: [ "README.md", "CHANGELOG.md" ],
|
|
264
|
+
app_files: [ "appmodel.rb", "appview.rb", "appcontroller.rb" ],
|
|
265
|
+
complete_file_list: [ "Gemfile", "config/application.gdstruct", "README.md", "CHANGELOG.md",
|
|
266
|
+
"appmodel.rb", "appview.rb", "appcontroller.rb", "my_special.rb" ] }
|
|
267
|
+
~~~
|
|
268
|
+
|
|
269
|
+
## Motivation and Features
|
|
270
|
+
|
|
271
|
+
* the focus is on the essential data
|
|
272
|
+
* a language for humans, a human-writable format
|
|
273
|
+
* structure and hierarchy is expressed using indentation (whitespace-sensitive) - avoids curly braces and square brackets
|
|
274
|
+
* uses a succinct and minimalist syntax - tries to avoid unnecessary characters
|
|
275
|
+
* in many cases colons, commas and quotes are not necessary
|
|
276
|
+
* less text makes data clearer and more readable
|
|
277
|
+
* for configuration and specification - replacement for XML, JSON, YAML
|
|
278
|
+
* for data/database seeding
|
|
279
|
+
* less text and less potential errors using schema definitions
|
|
280
|
+
* supports block comments, which could be nested
|
|
281
|
+
* allows also the definition of hash and array structures in a kind of restricted classic Ruby like syntax
|
|
282
|
+
* 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
|
|
283
|
+
|
|
284
|
+
|
|
179
285
|
Further Information
|
|
180
286
|
===================
|
|
181
287
|
|
|
182
|
-
You will find
|
|
288
|
+
You will find detailed information here: [urasepandia.de/gds.html](https://urasepandia.de/gds.html)
|
|
289
|
+
|
|
290
|
+
Use the GDS Converter, play with it and give the GDS language a try: [urasepandia.de/gdsconverter.html](https://urasepandia.de/gdsconverter.html)
|
|
291
|
+
The GDS Converter translates a GDS definition into various data representation formats and languages like Ruby, JSON, Python, XML and YAML.
|
|
292
|
+
|
|
293
|
+
There is a collection of practical examples on GitHub:
|
|
294
|
+
[github.com/uliramminger/gds-examples](https://github.com/uliramminger/gds-examples)
|
|
183
295
|
|
|
184
296
|
Maintainer
|
|
185
297
|
==========
|
|
@@ -189,6 +301,6 @@ Uli Ramminger <uli@urasepandia.de>
|
|
|
189
301
|
Copyright
|
|
190
302
|
=========
|
|
191
303
|
|
|
192
|
-
Copyright (c) 2018 Ulrich Ramminger
|
|
304
|
+
Copyright (c) 2018-2019 Ulrich Ramminger
|
|
193
305
|
|
|
194
306
|
See MIT-LICENSE for further details.
|
data/lib/gdstruct.rb
CHANGED
|
@@ -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/
|
|
13
|
+
require_relative 'gdstruct/gds_014'
|
|
14
14
|
|
|
15
15
|
#===============================================================================
|
|
16
16
|
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#===============================================================================
|
|
2
|
+
|
|
3
|
+
module LDLgeneratedLanguage
|
|
4
|
+
|
|
5
|
+
class Gds_014_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_014_data.config.replace( { allow_env: false, context: nil }.merge( config ) )
|
|
19
|
+
|
|
20
|
+
@parserClass ||= begin
|
|
21
|
+
Treetop.load_from_string GrammarDef
|
|
22
|
+
instance_eval( 'Gds_014Parser' )
|
|
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_014\n\n rule top\n &{ |s| @indentationLevels = []; true }\n defs ''\n {\n def ast\n eval 'class ::LDLgeneratedLanguage::Gds_014_data; def self.globalvars; @@globalvars ||= {}; end; end'\n ::LDLgeneratedLanguage::Gds_014_data.globalvars.clear\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:schemata] ||= {}\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:gdsglobvars] ||= {}\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:schema] ||= []\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_014_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_014_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 bc_0_l:(bc_0*) ws ': ' ws refdef_tl: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_014_data.globalvars[:internreferences][refdef_tl.ast] = keyvaluedefs_ind.ast unless refdef_tl.empty?\n r.merge!( keyvaluedefs_ind.ast )\n r.merge!( hashsubdefs_ind.ast )\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws ':' 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 bc_0_l:(bc_0*) ws ',' 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_014_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:schemata][schemaname.ast] = schema_fieldlist.ast\n res = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws ',' 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_014_data.globalvars[:schema] << schema_fieldlist.ast\n res = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws ',' 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 unless ::LDLgeneratedLanguage::Gds_014_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_014_data.globalvars[:schema] << ::LDLgeneratedLanguage::Gds_014_data.globalvars[:schemata][schemaname.ast]\n res = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws ',' ws refdef_tl: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_014_data.globalvars[:internreferences][refdef_tl.ast] = valuedefs_ind.ast unless refdef_tl.empty?\n r = []\n r.concat( valuedefs_ind.ast )\n r.concat( arraysubdefs_ind.ast )\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws ',' 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 rd1:refdef? ws keydef ws rd2: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 unless ::LDLgeneratedLanguage::Gds_014_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_014_data.globalvars[:schema] << ::LDLgeneratedLanguage::Gds_014_data.globalvars[:schemata][schemaname.ast]\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences][rd2.ast] = arraysubdefs_schema_ind.ast unless rd2.empty?\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n res = r\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws rd1:refdef? ws keydef ws rd2: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_014_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences][rd2.ast] = arraysubdefs_schema_ind.ast unless rd2.empty?\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n res = r\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws rd1:refdef? ws keydef ws rd2: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_014_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:schemata][schemaname.ast] = schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences][rd2.ast] = arraysubdefs_schema_ind.ast unless rd2.empty?\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n res = r\n ::LDLgeneratedLanguage::Gds_014_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 unless ::LDLgeneratedLanguage::Gds_014_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_014_data.globalvars[:schema] << ::LDLgeneratedLanguage::Gds_014_data.globalvars[:schemata][schemaname.ast]\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n res = r\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:schema].pop\n res\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws rd1:refdef? ws keydef ws rd2:refdef? ws ',' ws rd3: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_014_data.globalvars[:internreferences][rd3.ast] = valuedefs_ind.ast unless rd3.empty?\n r.merge!( Hash[ keydef.ast, begin [].concat( valuedefs_ind.ast ).concat( arraysubdefs_ind.ast ) end ] )\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences][rd2.ast] = r[keydef.ast] unless rd2.empty?\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws rd1:refdef? ws keydef ws rd2: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_014_data.globalvars[:internreferences][rd2.ast] = arraysubdefs_ind.ast unless rd2.empty?\n r.merge!( Hash[ keydef.ast, arraysubdefs_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws rd1:refdef? ws keydef ws rd2: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_014_data.globalvars[:internreferences][rd2.ast] = hashsubdefs_ind.ast unless rd2.empty?\n r.merge!( Hash[ keydef.ast, hashsubdefs_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef_tl: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_014_data.globalvars[:internreferences][refdef_tl.ast] = r unless refdef_tl.empty?\n r\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 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 bc_0_l:(bc_0*) ws rd1:refdef? ws ': ' ws rd2: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_014_data.globalvars[:internreferences][rd2.ast] = keyvaluedefs_ind.ast unless rd2.empty?\n r.merge!( keyvaluedefs_ind.ast )\n r.merge!( hashsubdefs_ind.ast )\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef_tl: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_014_data.globalvars[:internreferences][refdef_tl.ast] = r unless refdef_tl.empty?\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws rd1:refdef? ws keydef ws rd2: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_014_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences][rd2.ast] = r[keydef.ast] unless rd2.empty?\n r\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef_tl: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_014_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:schemata][schemaname.ast] = schema_fieldlist.ast\n r = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences][refdef_tl.ast] = r unless refdef_tl.empty?\n res = r\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:schema].pop\n [ res ]\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef_tl: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_014_data.globalvars[:schema] << schema_fieldlist.ast\n r = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences][refdef_tl.ast] = r unless refdef_tl.empty?\n res = r\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:schema].pop\n [ res ]\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef_tl: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 unless ::LDLgeneratedLanguage::Gds_014_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_014_data.globalvars[:schema] << ::LDLgeneratedLanguage::Gds_014_data.globalvars[:schemata][schemaname.ast]\n r = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences][refdef_tl.ast] = r unless refdef_tl.empty?\n res = r\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:schema].pop\n [ res ]\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws rd1:refdef? ws ',' ws rd2: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_014_data.globalvars[:internreferences][rd2.ast] = valuedefs_ind.ast unless rd2.empty?\n r = []\n r.concat( valuedefs_ind.ast )\n r.concat( arraysubdefs_ind.ast )\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n [\n r\n ]\n end\n }\n /\n indentation bc_0_l:(bc_0*) ws refdef_tl: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_014_data.globalvars[:internreferences][refdef_tl.ast] = r unless refdef_tl.empty?\n [\n r\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_tl: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_014_data.globalvars[:internreferences][refdef_tl.ast] = r unless refdef_tl.empty?\n r\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 rd1:refdef? ws ': ' ws rd2: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_014_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_014_data.globalvars[:schema].last[i], e ])\n end.inject({}){ |res,e| res.merge!(e) }\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences][rd1.ast] = result unless rd1.empty?\n ::LDLgeneratedLanguage::Gds_014_data.globalvars[:internreferences][rd2.ast] = r1 unless rd2.empty?\n result.merge!( r1 ).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 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_014_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_014_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 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_014_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_014_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 unless ::LDLgeneratedLanguage::Gds_014_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_014_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 unless ::LDLgeneratedLanguage::Gds_014_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_014_data.globalvars[:gdsglobvars][varname.ast]\n \n end\n }\n end\n\n rule refuse_ind\n '*' identifier \n {\n def ast\n \n unless ::LDLgeneratedLanguage::Gds_014_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_014_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_014_data.config[:context] ? (eval(evalexpr.ast, ::LDLgeneratedLanguage::Gds_014_data.config[:context])) : nil \n end\n }\n /\n '@env' ws evalexpr \n {\n def ast\n ::LDLgeneratedLanguage::Gds_014_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
|
+
|
data/lib/gdstruct/version.rb
CHANGED
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.8.
|
|
4
|
+
version: 0.8.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Uli Ramminger
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2019-02-08 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/
|
|
77
|
+
- lib/gdstruct/gds_014.rb
|
|
78
78
|
- lib/gdstruct/version.rb
|
|
79
79
|
homepage: https://urasepandia.de/gds.html
|
|
80
80
|
licenses:
|
data/lib/gdstruct/gds_013.rb
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
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
|
-
|