gdstruct 0.8.2 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +61 -4
- data/README.md +34 -21
- data/lib/gdstruct.rb +66 -25
- data/lib/gdstruct/lng_gds.rb +50 -0
- data/lib/gdstruct/version.rb +1 -1
- metadata +3 -4
- data/lib/gdstruct/gds_014.rb +0 -51
- data/lib/gdstruct/gds_015.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: 8a5bedf16817e2fe70f72b44d65b976586ad7910
|
4
|
+
data.tar.gz: 16eeaad19a989d7d4f22f297e4cd09a756675ed3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b00d28a8b42b292c0165971284e30fb09a21059abca45375768a16c58565cbca6a9286fcb83a66c51503a14f53a845c84da91277243b9b6a38f2b4052a2339f8
|
7
|
+
data.tar.gz: bce0e6ac86cb8ecc98669e9464dc43abedc47f13b573ff32cf102c3b3d7ccded943e56dff86a227e109faeff510f90656ce4925442e75d9c720463a21409dbee
|
data/CHANGELOG.md
CHANGED
@@ -1,15 +1,72 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
### 0.9.0 - (2019-07-15)
|
4
|
+
|
5
|
+
* __feature__
|
6
|
+
class GDstruct::Creator
|
7
|
+
for the creation of a Ruby Hash/Array structure out of possibly several separated GDS definition strings
|
8
|
+
arbitrary combination of #include and #include_file method calls
|
9
|
+
final call of #create method
|
10
|
+
~~~
|
11
|
+
# file: data.gdstruct
|
12
|
+
&persons persons, @schema person /*
|
13
|
+
firstname lastname yearOfBirth */
|
14
|
+
: John | McArthur | 1987
|
15
|
+
: Berry | Miller | 1976
|
16
|
+
~~~
|
17
|
+
~~~
|
18
|
+
# file: example.rb
|
19
|
+
require 'gdstruct'
|
20
|
+
|
21
|
+
creator = GDstruct::Creator.new
|
22
|
+
|
23
|
+
creator.include( <<-EOS )
|
24
|
+
@schema person( firstname, lastname, yearOfBirth )
|
25
|
+
EOS
|
26
|
+
|
27
|
+
creator.include_file( 'data.gdstruct' )
|
28
|
+
|
29
|
+
creator.include( <<-EOS )
|
30
|
+
all
|
31
|
+
mypersons *persons
|
32
|
+
EOS
|
33
|
+
|
34
|
+
res = creator.create
|
35
|
+
|
36
|
+
# => res = {:persons=>[{:firstname=>"John", :lastname=>"McArthur", :yearOfBirth=>1987}, {:firstname=>"Berry", :lastname=>"Miller", :yearOfBirth=>1976}],
|
37
|
+
# :all=>{:mypersons=>{:persons=>[{:firstname=>"John", :lastname=>"McArthur", :yearOfBirth=>1987}, {:firstname=>"Berry", :lastname=>"Miller", :yearOfBirth=>1976}]}}}
|
38
|
+
~~~
|
39
|
+
|
40
|
+
* __feature__
|
41
|
+
on top level: a single key, for the definition of a subhash can now follow a colon (:) on the same line; before you had to put it on a new line
|
42
|
+
the following syntax is allowed now
|
43
|
+
~~~
|
44
|
+
: k
|
45
|
+
~~~
|
46
|
+
~~~
|
47
|
+
: k1
|
48
|
+
k11 v11
|
49
|
+
~~~
|
50
|
+
~~~
|
51
|
+
: k1
|
52
|
+
k11 v11
|
53
|
+
k2
|
54
|
+
~~~
|
55
|
+
~~~
|
56
|
+
: k1
|
57
|
+
k2
|
58
|
+
~~~
|
59
|
+
|
3
60
|
### 0.8.2 - (2019-03-18)
|
4
61
|
|
5
62
|
* __feature__
|
6
63
|
modification for classic Ruby syntax
|
7
64
|
inside an array definition: after the last element a comma (,) is allowed
|
8
|
-
this conforms to the Ruby syntax
|
65
|
+
this conforms to the Ruby syntax: a trailing comma is ignored
|
9
66
|
~~~
|
10
67
|
[ 1, 2, ]
|
11
68
|
~~~
|
12
|
-
|
69
|
+
|
13
70
|
* __feature__
|
14
71
|
modification for classic Ruby syntax
|
15
72
|
inside a hash definition: after the last key-value pair a comma (,) is allowed
|
@@ -17,9 +74,9 @@
|
|
17
74
|
~~~
|
18
75
|
{ k1: 'v1', k2: 'v2', }
|
19
76
|
~~~
|
20
|
-
|
77
|
+
|
21
78
|
* __feature__
|
22
|
-
a single key, for the definition of a subhash can now follow a colon (:) on the same line
|
79
|
+
after an array definition: a single key, for the definition of a subhash can now follow a colon (:) on the same line; before you had to put it on a new line
|
23
80
|
the following syntax is allowed now
|
24
81
|
~~~
|
25
82
|
,
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@ 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
|
-
The building blocks for general data structures are hashes and arrays.
|
5
|
+
The building blocks for general data structures are hashes and arrays.
|
6
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
7
|
|
8
8
|
The defined data can be used in the following situations:
|
@@ -11,7 +11,7 @@ The defined data can be used in the following situations:
|
|
11
11
|
* to convert to other data representation formats like JSON, XML, YAML
|
12
12
|
|
13
13
|
The GDS language is a special DSL (domain specific language) for defining general data structures.
|
14
|
-
It uses a succinct, indentation-sensitive syntax which makes data representation clear and readable.
|
14
|
+
It uses a succinct, indentation-sensitive syntax which makes data representation clear and readable.
|
15
15
|
|
16
16
|
Installation
|
17
17
|
============
|
@@ -19,7 +19,7 @@ Installation
|
|
19
19
|
~~~
|
20
20
|
gem install gdstruct
|
21
21
|
~~~
|
22
|
-
|
22
|
+
|
23
23
|
A Short Example
|
24
24
|
===============
|
25
25
|
|
@@ -42,7 +42,7 @@ The GDS language uses two basic symbols (__:__ and __,__) for the creation of ha
|
|
42
42
|
A colon (__:__) is used to define a hash.
|
43
43
|
A comma (__,__) is used to define an array.
|
44
44
|
|
45
|
-
Use indentation with two spaces for the definition of elements and for nested structures.
|
45
|
+
Use indentation with two spaces for the definition of elements and for nested structures.
|
46
46
|
Tab characters are not allowed for indentation.
|
47
47
|
|
48
48
|
The default data structure is a hash.
|
@@ -125,7 +125,7 @@ transforms to
|
|
125
125
|
|
126
126
|
## Schema Definitions
|
127
127
|
|
128
|
-
Schema specifiers can be used to predefine the keys of a hash or subhash.
|
128
|
+
Schema specifiers can be used to predefine the keys of a hash or subhash.
|
129
129
|
When you specify the values you no longer need to name the key for each value.
|
130
130
|
This facilitates the input for hashes and prevents typos for keys.
|
131
131
|
In combination with the pipe symbol (__\|__), which allows to define multiple values on a single line,
|
@@ -158,7 +158,7 @@ transforms to
|
|
158
158
|
{ :name=>"Canada", :capital=>"Ottawa", :area=>9984670, :population=>36503097, :vehicleRegistrationCode=>"CDN", :iso3166code=>"CA", :callingCode=>1 },
|
159
159
|
{ :name=>"France", :capital=>"Paris", :area=>643801, :population=>66991000, :vehicleRegistrationCode=>"F", :iso3166code=>"FR", :callingCode=>33 },
|
160
160
|
{ :name=>"Russia", :capital=>"Moscow", :area=>17075400, :population=>144526636, :vehicleRegistrationCode=>"RUS", :iso3166code=>"RU", :callingCode=>7 }
|
161
|
-
]
|
161
|
+
]
|
162
162
|
~~~
|
163
163
|
|
164
164
|
## References
|
@@ -174,7 +174,7 @@ categories , @schema( name )
|
|
174
174
|
&mountain_bike : Mountain Bike
|
175
175
|
&city_bike : City Bike
|
176
176
|
&kids_bike : Kids Bike
|
177
|
-
|
177
|
+
|
178
178
|
bikes , @schema( name, frame_size, wheel_diameter, weight, category ) /*
|
179
179
|
----------------------------------------------------------------------------------------
|
180
180
|
name frame size ["] wheel diameter ["] weight [kg] category
|
@@ -184,8 +184,8 @@ bikes , @schema( name, frame_size, wheel_diameter, weight, category )
|
|
184
184
|
: Speedstar II | 22 | 27.5 | 25.5 | *city_bike
|
185
185
|
: Little Pony | 16 | 16 | 5.98 | *kids_bike
|
186
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
|
187
|
+
: Easy Cruiser | 20 | 28 | 29.4 | *e_bike
|
188
|
+
: Rough Buffalo | 19 | 26 | 14.7 | *mountain_bike
|
189
189
|
~~~
|
190
190
|
transforms to
|
191
191
|
~~~
|
@@ -212,16 +212,13 @@ initial_settings &init
|
|
212
212
|
max_age 10
|
213
213
|
|
214
214
|
all_log_files ,
|
215
|
-
:
|
216
|
-
@merge *init
|
215
|
+
: @merge *init
|
217
216
|
file $(logpath)/logfile_1.log
|
218
|
-
|
219
|
-
:
|
220
|
-
@merge *init
|
217
|
+
|
218
|
+
: @merge *init
|
221
219
|
file $(logpath)/logfile_2.log
|
222
|
-
|
223
|
-
:
|
224
|
-
@merge *init
|
220
|
+
|
221
|
+
: @merge *init
|
225
222
|
file $(logpath)/logfile_3.log
|
226
223
|
max_age 8 # overwrite an existing hash entry
|
227
224
|
~~~
|
@@ -241,11 +238,11 @@ The __@insert__ directive can be used to insert an array specified with a refere
|
|
241
238
|
config_files &config_files ,
|
242
239
|
Gemfile
|
243
240
|
config/application.gdstruct
|
244
|
-
|
241
|
+
|
245
242
|
docu_files &docu_files ,
|
246
243
|
README.md
|
247
244
|
CHANGELOG.md
|
248
|
-
|
245
|
+
|
249
246
|
app_files &app_files ,
|
250
247
|
appmodel.rb
|
251
248
|
appview.rb
|
@@ -259,10 +256,10 @@ complete_file_list ,
|
|
259
256
|
~~~
|
260
257
|
transforms to
|
261
258
|
~~~
|
262
|
-
{ config_files: [ "Gemfile", "config/application.gdstruct" ],
|
259
|
+
{ config_files: [ "Gemfile", "config/application.gdstruct" ],
|
263
260
|
docu_files: [ "README.md", "CHANGELOG.md" ],
|
264
261
|
app_files: [ "appmodel.rb", "appview.rb", "appcontroller.rb" ],
|
265
|
-
complete_file_list: [ "Gemfile", "config/application.gdstruct", "README.md", "CHANGELOG.md",
|
262
|
+
complete_file_list: [ "Gemfile", "config/application.gdstruct", "README.md", "CHANGELOG.md",
|
266
263
|
"appmodel.rb", "appview.rb", "appcontroller.rb", "my_special.rb" ] }
|
267
264
|
~~~
|
268
265
|
|
@@ -281,6 +278,22 @@ transforms to
|
|
281
278
|
* allows also the definition of hash and array structures in a kind of restricted classic Ruby like syntax
|
282
279
|
* 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
280
|
|
281
|
+
Ruby Gem
|
282
|
+
========
|
283
|
+
|
284
|
+
You can find it on RubyGems.org:
|
285
|
+
|
286
|
+
[rubygems.org/gems/gdstruct](https://rubygems.org/gems/gdstruct)
|
287
|
+
|
288
|
+
<div class="topic-separator"></div>
|
289
|
+
<div id="l-source-code" class="fragment-link"></div>
|
290
|
+
|
291
|
+
Source Code
|
292
|
+
===========
|
293
|
+
|
294
|
+
You can find the source code on GitHub:
|
295
|
+
|
296
|
+
[github.com/uliramminger/gdstruct](https://github.com/uliramminger/gdstruct)
|
284
297
|
|
285
298
|
Further Information
|
286
299
|
===================
|
data/lib/gdstruct.rb
CHANGED
@@ -1,34 +1,25 @@
|
|
1
|
-
|
2
|
-
# file name : gdstruct.rb
|
3
|
-
#===============================================================================
|
4
|
-
=begin - Description
|
5
|
-
--------------------------------------------------------------------------------
|
1
|
+
# gdstruct.rb
|
6
2
|
|
7
|
-
You will find further information here: https://urasepandia.de/gds.html
|
3
|
+
# You will find further information here: https://urasepandia.de/gds.html
|
8
4
|
|
9
|
-
|
10
|
-
|
11
|
-
#===============================================================================
|
12
|
-
|
13
|
-
require_relative 'gdstruct/gds_015'
|
14
|
-
|
15
|
-
#===============================================================================
|
5
|
+
require_relative 'gdstruct/version'
|
6
|
+
require_relative 'gdstruct/lng_gds'
|
16
7
|
|
17
8
|
class GDstruct
|
18
|
-
|
9
|
+
|
19
10
|
class << self
|
20
|
-
|
11
|
+
|
21
12
|
# create a Ruby Hash/Array structure out of a GDS definition string
|
22
13
|
#
|
23
14
|
# @param gds_definition [String] GDS definition
|
24
|
-
# @option config [true/false] :allow_env (false) allow the @env directive to access environment variables, otherwise the @env directive returns nil
|
25
|
-
# @option config [Binding] :context (nil) if a binding is set then the @r directive evaluates embedded ruby code, otherwise the @r directive returns nil
|
15
|
+
# @option config [true/false] :allow_env (false) allow the @env directive to access environment variables, otherwise the @env directive returns nil
|
16
|
+
# @option config [Binding] :context (nil) if a binding is set then the @r directive evaluates embedded ruby code, otherwise the @r directive returns nil
|
26
17
|
#
|
27
18
|
# @return [Hash,Array] hash/array structure
|
28
19
|
#
|
29
20
|
# @example
|
30
21
|
# require 'gdstruct'
|
31
|
-
#
|
22
|
+
#
|
32
23
|
# h = GDstruct.c( <<-EOS )
|
33
24
|
# a value 1
|
34
25
|
# b value 2
|
@@ -39,21 +30,71 @@ class GDstruct
|
|
39
30
|
LDLgeneratedLanguage::Gds.parse( gds_definition, config )
|
40
31
|
end
|
41
32
|
alias :c :create
|
42
|
-
|
33
|
+
|
43
34
|
# create a Ruby Hash/Array structure out of a GDS definition file
|
44
35
|
#
|
45
36
|
# @param file_name [String] file name
|
46
|
-
# @option config [true/false] :allow_env (false) allow the @env directive to access environment variables, otherwise the @env directive returns nil
|
47
|
-
# @option config [Binding] :context (nil) if a binding is set then the @r directive evaluates embedded ruby code, otherwise the @r directive returns nil
|
37
|
+
# @option config [true/false] :allow_env (false) allow the @env directive to access environment variables, otherwise the @env directive returns nil
|
38
|
+
# @option config [Binding] :context (nil) if a binding is set then the @r directive evaluates embedded ruby code, otherwise the @r directive returns nil
|
48
39
|
#
|
49
40
|
# @return [Hash,Array] hash/array structure
|
50
41
|
def create_from_file( file_name, config = {} )
|
51
42
|
LDLgeneratedLanguage::Gds.parse( File.read( file_name ), config )
|
52
43
|
end
|
53
44
|
alias :c_from_file :create_from_file
|
54
|
-
|
45
|
+
|
55
46
|
end
|
56
|
-
|
57
|
-
end
|
58
47
|
|
59
|
-
|
48
|
+
# create a Ruby Hash/Array structure out of possibly several separated GDS definition strings
|
49
|
+
#
|
50
|
+
# # file: data.gdstruct
|
51
|
+
# &persons persons, @schema person /*
|
52
|
+
# firstname lastname yearOfBirth */
|
53
|
+
# : John | McArthur | 1987
|
54
|
+
# : Berry | Miller | 1976
|
55
|
+
#
|
56
|
+
# @example
|
57
|
+
# require 'gdstruct'
|
58
|
+
#
|
59
|
+
# creator = GDstruct::Creator.new
|
60
|
+
#
|
61
|
+
# creator.include( <<-EOS )
|
62
|
+
# @schema person( firstname, lastname, yearOfBirth )
|
63
|
+
# EOS
|
64
|
+
#
|
65
|
+
# creator.include_file( 'data.gdstruct' )
|
66
|
+
#
|
67
|
+
# creator.include( <<-EOS )
|
68
|
+
# all
|
69
|
+
# mypersons *persons
|
70
|
+
# EOS
|
71
|
+
#
|
72
|
+
# res = creator.create
|
73
|
+
#
|
74
|
+
# # => res = {:persons=>[{:firstname=>"John", :lastname=>"McArthur", :yearOfBirth=>1987}, {:firstname=>"Berry", :lastname=>"Miller", :yearOfBirth=>1976}],
|
75
|
+
# # :all=>{:mypersons=>{:persons=>[{:firstname=>"John", :lastname=>"McArthur", :yearOfBirth=>1987}, {:firstname=>"Berry", :lastname=>"Miller", :yearOfBirth=>1976}]}}}
|
76
|
+
class Creator
|
77
|
+
|
78
|
+
def initialize
|
79
|
+
@gdsDefinition = ""
|
80
|
+
end
|
81
|
+
|
82
|
+
def reset
|
83
|
+
@gdsDefinition = ""
|
84
|
+
end
|
85
|
+
|
86
|
+
def include( gds_definition )
|
87
|
+
@gdsDefinition << gds_definition << "\n"
|
88
|
+
end
|
89
|
+
|
90
|
+
def include_file( file_name )
|
91
|
+
@gdsDefinition << File.read( file_name ) << "\n"
|
92
|
+
end
|
93
|
+
|
94
|
+
def create( config = {} )
|
95
|
+
LDLgeneratedLanguage::Gds.parse( @gdsDefinition, config )
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# lng_gds.rb
|
2
|
+
|
3
|
+
# ATTENTION: this file is generated
|
4
|
+
|
5
|
+
module LDLgeneratedLanguage
|
6
|
+
|
7
|
+
class Language_gds_03_data
|
8
|
+
def self.config
|
9
|
+
@@config ||= {}
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Gds
|
14
|
+
require 'treetop'
|
15
|
+
|
16
|
+
class SyntaxError < ::StandardError
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.parse( s, config = {} )
|
20
|
+
::LDLgeneratedLanguage::Language_gds_03_data.config.replace( { allow_env: false, context: nil }.merge( config ) )
|
21
|
+
|
22
|
+
@parserClass ||= begin
|
23
|
+
Treetop.load_from_string GrammarDef
|
24
|
+
instance_eval( 'Language_gds_03Parser' )
|
25
|
+
end
|
26
|
+
parser = @parserClass.new
|
27
|
+
|
28
|
+
parseTree = parser.parse( s + "\n" )
|
29
|
+
|
30
|
+
unless parseTree
|
31
|
+
lineOfFailure = parser.failure_line
|
32
|
+
columnOfFailure = parser.failure_column
|
33
|
+
|
34
|
+
s = "GDS: Error happend, while parsing the definition: line #{lineOfFailure}, column #{columnOfFailure}" + "\n"
|
35
|
+
s += parser.failure_reason + "\n" if parser.failure_reason
|
36
|
+
s += "--->" + "\n"
|
37
|
+
s += parser.input.lines[((lineOfFailure-1-5)>0 ? (lineOfFailure-1-5) : 0)..(lineOfFailure-1)].join.chomp + "\n"
|
38
|
+
s += ' '*((parser.failure_column) -1) + '^' + "\n"
|
39
|
+
s += "<---" + "\n"
|
40
|
+
|
41
|
+
raise SyntaxError, s
|
42
|
+
end
|
43
|
+
|
44
|
+
parseTree.ast
|
45
|
+
end
|
46
|
+
|
47
|
+
GrammarDef = "grammar Language_gds_03\n\n rule top\n &{ |s| @indentationLevels = []; true }\n defs ''\n {\n def ast\n eval 'class ::LDLgeneratedLanguage::Language_gds_03_data; def self.globalvars; @@globalvars ||= {}; end; end'\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars.clear\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:schemata] ||= {}\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:gdsglobvars] ||= {}\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Language_gds_03_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::Language_gds_03_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::Language_gds_03_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 r2 = schema_fieldlist.ast\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\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 wscommnl2 ','? \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 wscommnl2 ','? \n {\n def ast\n r = []\n r << arraysubdef.ast\n r2 = morearraysubdefs.ast\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\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::Language_gds_03_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 ': ' ws keydef ws refdef_tl:refdef? wscommnl+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; @indentationLevels << (2+level); true }\n hashsub1:hashsubdefs_ind? \n &{ |s| node_cache[:hashsubdefs_ind].delete( index ); @indentationLevels.pop; true }\n hashsub2:hashsubdefs_ind? \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, hashsub1.ast ] )\n r.merge!( hashsub2.ast )\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:internreferences][refdef_tl.ast] = r[keydef.ast] unless refdef_tl.empty?\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::Language_gds_03_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:schemata][schemaname.ast] = schema_fieldlist.ast\n res = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Language_gds_03_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::Language_gds_03_data.globalvars[:schema] << schema_fieldlist.ast\n res = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Language_gds_03_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::Language_gds_03_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::Language_gds_03_data.globalvars[:schema] << ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:schemata][schemaname.ast]\n res = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Language_gds_03_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::Language_gds_03_data.globalvars[:internreferences][refdef_tl.ast] = valuedefs_ind.ast unless refdef_tl.empty?\n r = []\n r2 = valuedefs_ind.ast\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n r2 = arraysubdefs_ind.ast\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\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::Language_gds_03_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::Language_gds_03_data.globalvars[:schema] << ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:schemata][schemaname.ast]\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:internreferences][rd2.ast] = arraysubdefs_schema_ind.ast unless rd2.empty?\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n res = r\n ::LDLgeneratedLanguage::Language_gds_03_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::Language_gds_03_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:internreferences][rd2.ast] = arraysubdefs_schema_ind.ast unless rd2.empty?\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n res = r\n ::LDLgeneratedLanguage::Language_gds_03_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::Language_gds_03_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:schemata][schemaname.ast] = schema_fieldlist.ast\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:internreferences][rd2.ast] = arraysubdefs_schema_ind.ast unless rd2.empty?\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n res = r\n ::LDLgeneratedLanguage::Language_gds_03_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::Language_gds_03_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::Language_gds_03_data.globalvars[:schema] << ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:schemata][schemaname.ast]\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n res = r\n ::LDLgeneratedLanguage::Language_gds_03_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::Language_gds_03_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::Language_gds_03_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n ::LDLgeneratedLanguage::Language_gds_03_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::Language_gds_03_data.globalvars[:internreferences][rd2.ast] = arraysubdefs_ind.ast unless rd2.empty?\n r.merge!( Hash[ keydef.ast, arraysubdefs_ind.ast ] )\n ::LDLgeneratedLanguage::Language_gds_03_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::Language_gds_03_data.globalvars[:internreferences][rd2.ast] = hashsubdefs_ind.ast unless rd2.empty?\n r.merge!( Hash[ keydef.ast, hashsubdefs_ind.ast ] )\n ::LDLgeneratedLanguage::Language_gds_03_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::Language_gds_03_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::Language_gds_03_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::Language_gds_03_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::Language_gds_03_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 refdef_tl:refdef? ws ':' ws '@merge' ws refuse_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!( refuse_ind.ast )\n r.merge!( hashsubdefs_ind.ast )\n ::LDLgeneratedLanguage::Language_gds_03_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 ': ' ws keydef ws rd2:refdef? wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n hashsub1:hashsubdefs_ind? \n &{ |s| node_cache[:hashsubdefs_ind].delete( index ); @indentationLevels.pop; true }\n hashsub2:hashsubdefs_ind? \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, hashsub1.ast ] )\n r.merge!( hashsub2.ast )\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n ::LDLgeneratedLanguage::Language_gds_03_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 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::Language_gds_03_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n ::LDLgeneratedLanguage::Language_gds_03_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::Language_gds_03_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:schemata][schemaname.ast] = schema_fieldlist.ast\n r = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:internreferences][refdef_tl.ast] = r unless refdef_tl.empty?\n res = r\n ::LDLgeneratedLanguage::Language_gds_03_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::Language_gds_03_data.globalvars[:schema] << schema_fieldlist.ast\n r = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:internreferences][refdef_tl.ast] = r unless refdef_tl.empty?\n res = r\n ::LDLgeneratedLanguage::Language_gds_03_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::Language_gds_03_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::Language_gds_03_data.globalvars[:schema] << ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:schemata][schemaname.ast]\n r = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:internreferences][refdef_tl.ast] = r unless refdef_tl.empty?\n res = r\n ::LDLgeneratedLanguage::Language_gds_03_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::Language_gds_03_data.globalvars[:internreferences][rd2.ast] = valuedefs_ind.ast unless rd2.empty?\n r = []\n r2 = valuedefs_ind.ast\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n r2 = arraysubdefs_ind.ast\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n ::LDLgeneratedLanguage::Language_gds_03_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::Language_gds_03_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::Language_gds_03_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::Language_gds_03_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::Language_gds_03_data.globalvars[:schema].last[i], e ])\n end.inject({}){ |res,e| res.merge!(e) }\n ::LDLgeneratedLanguage::Language_gds_03_data.globalvars[:internreferences][rd1.ast] = result unless rd1.empty?\n ::LDLgeneratedLanguage::Language_gds_03_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 r2 = schemavaluedefs_ind.ast\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\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 r2 = valuedefs_ind.ast\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\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::Language_gds_03_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::Language_gds_03_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::Language_gds_03_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::Language_gds_03_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::Language_gds_03_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::Language_gds_03_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::Language_gds_03_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::Language_gds_03_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::Language_gds_03_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::Language_gds_03_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::Language_gds_03_data.config[:context] ? (eval(evalexpr.ast, ::LDLgeneratedLanguage::Language_gds_03_data.config[:context])) : nil \n end\n }\n /\n '@env' ws evalexpr \n {\n def ast\n ::LDLgeneratedLanguage::Language_gds_03_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"
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
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.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Uli Ramminger
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-07-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: treetop
|
@@ -74,8 +74,7 @@ files:
|
|
74
74
|
- README.md
|
75
75
|
- Rakefile
|
76
76
|
- lib/gdstruct.rb
|
77
|
-
- lib/gdstruct/
|
78
|
-
- lib/gdstruct/gds_015.rb
|
77
|
+
- lib/gdstruct/lng_gds.rb
|
79
78
|
- lib/gdstruct/version.rb
|
80
79
|
homepage: https://urasepandia.de/gds.html
|
81
80
|
licenses:
|
data/lib/gdstruct/gds_014.rb
DELETED
@@ -1,51 +0,0 @@
|
|
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/gds_015.rb
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
#===============================================================================
|
2
|
-
|
3
|
-
module LDLgeneratedLanguage
|
4
|
-
|
5
|
-
class Gds_015_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_015_data.config.replace( { allow_env: false, context: nil }.merge( config ) )
|
19
|
-
|
20
|
-
@parserClass ||= begin
|
21
|
-
Treetop.load_from_string GrammarDef
|
22
|
-
instance_eval( 'Gds_015Parser' )
|
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_015\n\n rule top\n &{ |s| @indentationLevels = []; true }\n defs ''\n {\n def ast\n eval 'class ::LDLgeneratedLanguage::Gds_015_data; def self.globalvars; @@globalvars ||= {}; end; end'\n ::LDLgeneratedLanguage::Gds_015_data.globalvars.clear\n ::LDLgeneratedLanguage::Gds_015_data.globalvars[:schemata] ||= {}\n ::LDLgeneratedLanguage::Gds_015_data.globalvars[:gdsglobvars] ||= {}\n ::LDLgeneratedLanguage::Gds_015_data.globalvars[:internreferences] ||= {}\n ::LDLgeneratedLanguage::Gds_015_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_015_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_015_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 r2 = schema_fieldlist.ast\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\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 wscommnl2 ','? \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 wscommnl2 ','? \n {\n def ast\n r = []\n r << arraysubdef.ast\n r2 = morearraysubdefs.ast\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\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_015_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_015_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_015_data.globalvars[:schemata][schemaname.ast] = schema_fieldlist.ast\n res = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_015_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_015_data.globalvars[:schema] << schema_fieldlist.ast\n res = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_015_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_015_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_015_data.globalvars[:schema] << ::LDLgeneratedLanguage::Gds_015_data.globalvars[:schemata][schemaname.ast]\n res = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_015_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_015_data.globalvars[:internreferences][refdef_tl.ast] = valuedefs_ind.ast unless refdef_tl.empty?\n r = []\n r2 = valuedefs_ind.ast\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n r2 = arraysubdefs_ind.ast\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\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_015_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_015_data.globalvars[:schema] << ::LDLgeneratedLanguage::Gds_015_data.globalvars[:schemata][schemaname.ast]\n ::LDLgeneratedLanguage::Gds_015_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_015_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n res = r\n ::LDLgeneratedLanguage::Gds_015_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_015_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_015_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_015_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n res = r\n ::LDLgeneratedLanguage::Gds_015_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_015_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_015_data.globalvars[:schemata][schemaname.ast] = schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_015_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_015_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n res = r\n ::LDLgeneratedLanguage::Gds_015_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_015_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_015_data.globalvars[:schema] << ::LDLgeneratedLanguage::Gds_015_data.globalvars[:schemata][schemaname.ast]\n r.merge!( Hash[ keydef.ast, arraysubdefs_schema_ind.ast ] )\n res = r\n ::LDLgeneratedLanguage::Gds_015_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_015_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_015_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n ::LDLgeneratedLanguage::Gds_015_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_015_data.globalvars[:internreferences][rd2.ast] = arraysubdefs_ind.ast unless rd2.empty?\n r.merge!( Hash[ keydef.ast, arraysubdefs_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_015_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_015_data.globalvars[:internreferences][rd2.ast] = hashsubdefs_ind.ast unless rd2.empty?\n r.merge!( Hash[ keydef.ast, hashsubdefs_ind.ast ] )\n ::LDLgeneratedLanguage::Gds_015_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_015_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_015_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_015_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_015_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 refdef_tl:refdef? ws ':' ws '@merge' ws refuse_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!( refuse_ind.ast )\n r.merge!( hashsubdefs_ind.ast )\n ::LDLgeneratedLanguage::Gds_015_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 ': ' ws keydef ws rd2:refdef? wscommnl+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n hashsub1:hashsubdefs_ind? \n &{ |s| node_cache[:hashsubdefs_ind].delete( index ); @indentationLevels.pop; true }\n hashsub2:hashsubdefs_ind? \n &{ |s| @indentationLevels.pop; true }\n wscommnl*\n {\n def ast\n r = {}\n r.merge!( Hash[ keydef.ast, hashsub1.ast ] )\n r.merge!( hashsub2.ast )\n ::LDLgeneratedLanguage::Gds_015_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n ::LDLgeneratedLanguage::Gds_015_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 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_015_data.globalvars[:internreferences][rd1.ast] = r unless rd1.empty?\n ::LDLgeneratedLanguage::Gds_015_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_015_data.globalvars[:schema] << schema_fieldlist.ast\n ::LDLgeneratedLanguage::Gds_015_data.globalvars[:schemata][schemaname.ast] = schema_fieldlist.ast\n r = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_015_data.globalvars[:internreferences][refdef_tl.ast] = r unless refdef_tl.empty?\n res = r\n ::LDLgeneratedLanguage::Gds_015_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_015_data.globalvars[:schema] << schema_fieldlist.ast\n r = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_015_data.globalvars[:internreferences][refdef_tl.ast] = r unless refdef_tl.empty?\n res = r\n ::LDLgeneratedLanguage::Gds_015_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_015_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_015_data.globalvars[:schema] << ::LDLgeneratedLanguage::Gds_015_data.globalvars[:schemata][schemaname.ast]\n r = arraysubdefs_schema_ind.ast\n ::LDLgeneratedLanguage::Gds_015_data.globalvars[:internreferences][refdef_tl.ast] = r unless refdef_tl.empty?\n res = r\n ::LDLgeneratedLanguage::Gds_015_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_015_data.globalvars[:internreferences][rd2.ast] = valuedefs_ind.ast unless rd2.empty?\n r = []\n r2 = valuedefs_ind.ast\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n r2 = arraysubdefs_ind.ast\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n ::LDLgeneratedLanguage::Gds_015_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_015_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_015_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_015_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_015_data.globalvars[:schema].last[i], e ])\n end.inject({}){ |res,e| res.merge!(e) }\n ::LDLgeneratedLanguage::Gds_015_data.globalvars[:internreferences][rd1.ast] = result unless rd1.empty?\n ::LDLgeneratedLanguage::Gds_015_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 r2 = schemavaluedefs_ind.ast\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\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 r2 = valuedefs_ind.ast\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\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_015_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_015_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_015_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_015_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_015_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_015_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_015_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_015_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_015_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_015_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_015_data.config[:context] ? (eval(evalexpr.ast, ::LDLgeneratedLanguage::Gds_015_data.config[:context])) : nil \n end\n }\n /\n '@env' ws evalexpr \n {\n def ast\n ::LDLgeneratedLanguage::Gds_015_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
|
-
|