gdstruct 0.9.3 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b86f66bb75720b88a546ab58c83d8b13be2f4f444d36afd55b79ed84d47f2d22
4
- data.tar.gz: c49892116726acf04745c951272cb15bae4627862d66ef71621c76989a1e5e63
3
+ metadata.gz: 45ab18551aa11c1d5619963163b54d7714a9e7dd965bc73e00042f386e84898b
4
+ data.tar.gz: bd4dd877147c753b91e7a51442a21f62d955e92ddf68ca3c2b336b4061f8ff58
5
5
  SHA512:
6
- metadata.gz: cccc3d2d5e150d8329881005a018a44923e66f84c5a1845c9536c21f8c13d997b466e7b88f5c6c729869c65c527a1f7d579f28c2f332777a2a678907099cb5f6
7
- data.tar.gz: 14e71fc3d18b4592c32880c8431bc92b27b086f5fe4f7f7b464467430e0984639c551d6a43c9d193d17f4b062ee97593ba2b40fbe7e2b068663e8fedd0783f0f
6
+ metadata.gz: 8ba812e5c8ca23c8aa0bd9c75a7759c6dca1e05e660a55b6d6dda3a1c69d37bafc3ba8e010b0f561a31801abb655ab390b7c4b512ad730bf639e29814e6b4ede
7
+ data.tar.gz: 8f85f7d2950db6affb3b60331fe53dc71cea2d0c470b44220521e73171bdbd1ab53dac7f6ca9de1f3deb9dbbbe1c3fce84b33072841425947dbe81a2f27f70dc
data/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # CHANGELOG
2
2
 
3
+ ### 0.9.4 - (2025-03-02)
4
+
5
+ * __feature__
6
+ schema for single hash definition
7
+ ~~~
8
+ @schema adr (
9
+ firstname , lastname , age ) /*
10
+ -----------------------------------*/
11
+ addresses
12
+ hla @schema adr
13
+ Harry | Langemann | 44
14
+ she @schema adr
15
+ Susi | Heimstett | 32
16
+ bme @schema adr
17
+ Bob | Meiermann | 57
18
+
19
+ # => { addresses: { hla: { firstname: "Harry", lastname: "Langemann", age: 44 }, she: { firstname: "Susi" , lastname: "Heimstett", age: 32 }, bme: { firstname: "Bob" , lastname: "Meiermann", age: 57 } } }
20
+ ~~~
21
+
3
22
  ### 0.9.3 - (2024-04-30)
4
23
 
5
24
  * __fix__
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2018-2020 Ulrich Ramminger
1
+ Copyright (c) 2018-2025 Ulrich Ramminger
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to
data/README.md CHANGED
@@ -314,6 +314,6 @@ Uli Ramminger <uli@urasepandia.de>
314
314
  Copyright
315
315
  =========
316
316
 
317
- Copyright (c) 2018-2024 Ulrich Ramminger
317
+ Copyright (c) 2018-2025 Ulrich Ramminger
318
318
 
319
319
  See MIT-LICENSE for further details.
@@ -37,7 +37,7 @@ module LDLgeneratedLanguage
37
37
  parseTree.ast( context )
38
38
  end
39
39
 
40
- GrammarDef = "grammar Language_gds_03\n\n rule top_r\n &{ |s| @indentationLevels = []; true }\n defs_r ''\n {\n def ast( context )\n context.globalvars[:schemata] ||= {}\n context.globalvars[:gdsglobvars] ||= {}\n context.globalvars[:internreferences] ||= {}\n context.globalvars[:schema] ||= []\n defs_r.ast( context )\n end\n }\n end\n\n rule defs_r\n wscommnl_r* predefs_r wscommnl_r* defs2_r \n {\n def ast( context )\n dummy = predefs_r.ast( context )\n r = defs2_r.ast( context )\n r\n end\n }\n end\n\n rule predefs_r\n predef_r* \n {\n def ast( context )\n elements.each { |e| e.ast( context ) }\n end\n }\n end\n\n rule predef_r\n wscommnl2_r '@schema' wscommnl2_r schemaname_r wscommnl2_r '(' wscommnl2_r schema_fieldlist_r wscommnl2_r ')' \n {\n def ast( context )\n context.globalvars[:schemata][schemaname_r.ast( context )] = schema_fieldlist_r.ast( context )\n end\n }\n /\n wscommnl2_r '$' varname_r wscommnl2_r '=' wscommnl2_r vardef_rvalue_r \n {\n def ast( context )\n context.globalvars[:gdsglobvars][varname_r.ast( context )] = vardef_rvalue_r.ast( context )\n end\n }\n end\n\n rule schemaname_r\n identifier_r '' \n {\n def ast( context )\n r = identifier_r.ast( context )\n r\n end\n }\n end\n\n rule varname_r\n identifier_r ''\n {\n def ast( context )\n identifier_r.ast( context )\n end\n }\n end\n\n rule vardef_rvalue_r\n valuedef_ind_r ''\n {\n def ast( context )\n valuedef_ind_r.ast( context )\n end\n }\n end\n\n rule schema_fieldlist_r\n schemafield_r ws_r ',' ws_r schema_fieldlist_r \n {\n def ast( context )\n r = []\n r << schemafield_r.ast( context )\n r2 = schema_fieldlist_r.ast( context )\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n r\n end\n }\n /\n schemafield_r '' \n {\n def ast( context )\n r = []\n r << schemafield_r.ast( context )\n r\n end\n }\n end\n\n rule schemafield_r\n identifier_r '' \n {\n def ast( context )\n r = identifier_r.ast( context )\n r\n end\n }\n end\n\n rule defs2_r\n wscommnl2_r ruby_standard_def_r wscommnl2_r\n {\n def ast( context )\n ruby_standard_def_r.ast( context )\n end\n }\n /\n wscommnl_r* special_indented_def_r wscommnl2_r\n {\n def ast( context )\n special_indented_def_r.ast( context )\n end\n }\n end\n\n rule ruby_standard_def_r\n hashdef_r ''\n {\n def ast( context )\n hashdef_r.ast( context )\n end\n }\n /\n arraydef_r ''\n {\n def ast( context )\n arraydef_r.ast( context )\n end\n }\n end\n\n rule special_indented_def_r\n arraydef_ind_r ''\n {\n def ast( context )\n arraydef_ind_r.ast( context )\n end\n }\n /\n hashdef_ind_r ''\n {\n def ast( context )\n hashdef_ind_r.ast( context )\n end\n }\n end\n\n rule hashdef_r\n wscommnl2_r '{' wscommnl2_r hashsubdefs_r wscommnl2_r '}' \n {\n def ast( context )\n r = hashsubdefs_r.ast( context )\n r\n end\n }\n end\n\n rule arraydef_r\n wscommnl2_r '[' wscommnl2_r arraysubdefs_r wscommnl2_r ']' \n {\n def ast( context )\n r = arraysubdefs_r.ast( context )\n r\n end\n }\n end\n\n rule hashsubdefs_r\n hashsubdef_r wscommnl2_r morehashsubdefs_r wscommnl2_r ','? \n {\n def ast( context )\n r = {}\n r.merge!( hashsubdef_r.ast( context ) )\n r.merge!( morehashsubdefs_r.ast( context ) )\n r\n end\n }\n /\n ''\n {\n def ast( context )\n {}\n end\n }\n end\n\n rule morehashsubdefs_r\n morehashsubdef_r*\n {\n def ast( context )\n r = {}\n elements.each { |e| r.merge!( e.ast( context ) ) }\n r\n end\n }\n end\n\n rule morehashsubdef_r\n wscommnl2_r ',' wscommnl2_r hashsubdef_r\n {\n def ast( context )\n hashsubdef_r.ast( context )\n end\n }\n end\n\n rule hashsubdef_r\n keyvaluedef_r ''\n {\n def ast( context )\n keyvaluedef_r.ast( context )\n end\n }\n /\n keydef_r ':' wscommnl2_r hashdef_r \n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), hashdef_r.ast( context ) ] )\n r\n end\n }\n /\n wscommnl2_r ':' keydef_r wscommnl2_r '=>' wscommnl2_r hashdef_r \n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), hashdef_r.ast( context ) ] )\n r\n end\n }\n /\n keydef_r ':' wscommnl2_r arraydef_r \n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), arraydef_r.ast( context ) ] )\n r\n end\n }\n /\n wscommnl2_r ':' keydef_r wscommnl2_r '=>' wscommnl2_r arraydef_r \n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), arraydef_r.ast( context ) ] )\n r\n end\n }\n end\n\n rule arraysubdefs_r\n arraysubdef_r wscommnl2_r morearraysubdefs_r wscommnl2_r ','? \n {\n def ast( context )\n r = []\n r << arraysubdef_r.ast( context )\n r2 = morearraysubdefs_r.ast( context )\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n r\n end\n }\n /\n '' \n {\n def ast( context )\n r = []\n r\n end\n }\n end\n\n rule morearraysubdefs_r\n morearraysubdef_r* \n {\n def ast( context )\n r = []\n elements.each do |e|\n r << e.ast( context )\n end\n r\n end\n }\n end\n\n rule morearraysubdef_r\n wscommnl2_r ',' wscommnl2_r arraysubdef_r\n {\n def ast( context )\n arraysubdef_r.ast( context )\n end\n }\n end\n\n rule arraysubdef_r\n valuedef_r ''\n {\n def ast( context )\n valuedef_r.ast( context )\n end\n }\n /\n arraydef_r ''\n {\n def ast( context )\n arraydef_r.ast( context )\n end\n }\n /\n hashdef_r ''\n {\n def ast( context )\n hashdef_r.ast( context )\n end\n }\n /\n hashsubdef_r ''\n {\n def ast( context )\n hashsubdef_r.ast( context )\n end\n }\n end\n\n rule hashdef_ind_r\n indentation_r bc_0_l:(bc_0_r*) ws_r ': ' ws_r refdef_tl:refdef_r? ws_r keyvaluedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:internreferences][refdef_tl.ast( context )] = keyvaluedefs_ind_r.ast( context ) unless refdef_tl.empty?\n r.merge!( keyvaluedefs_ind_r.ast( context ) )\n r.merge!( hashsubdefs_ind_r.ast( context ) )\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ': ' ws_r keydef_r ws_r refdef_tl:refdef_r? wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; @indentationLevels << (2+level); true }\n hashsub1_r:hashsubdefs_ind_r? \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub2_r:hashsubdefs_ind_r? \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), hashsub1_r.ast( context ) ] )\n r.merge!( hashsub2_r.ast( context ) )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = r[keydef_r.ast( context )] unless refdef_tl.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ':' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = hashsubdefs_ind_r.ast( context )\n r\n end\n }\n /\n indentation_r '' \n &{ |s| level = s[0].text_value.length; @lastIndentation=level; true } \n &{ |s| false }\n {\n def ast( context )\n end\n }\n /\n &{ |s| @indentationLevels << (@lastIndentation-2); true }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n r.merge!( hashsubdefs_ind_r.ast( context ) )\n r\n end\n }\n end\n\n rule arraydef_ind_r\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r '@schema' ws_r schemaname_r ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n context.globalvars[:schemata][schemaname_r.ast( context )] = schema_fieldlist_r.ast( context )\n r = arraysubdefs_schema_ind_r.ast( context )\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r '@schema' ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n r = arraysubdefs_schema_ind_r.ast( context )\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r '@schema' ws_r schemaname_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n \n unless context.globalvars[:schemata][schemaname_r.ast( context )]\n ###orig-ok# raise SyntaxError, \"GDS: undefined schema specifier: \#{schemaname.ast}\"\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname_r\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast( context )}, 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 context.globalvars[:schema] << context.globalvars[:schemata][schemaname_r.ast( context )]\n r = arraysubdefs_schema_ind_r.ast( context )\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r ':' ws_r rd1_r:refdef_r? ws_r keyvaluedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; @indentationLevels << (2+level); true }\n hashsubdefs_ind_r \n &{ |s| node_cache[:arraysubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:internreferences][rd1_r.ast( context )] = keyvaluedefs_ind_r.ast( context ) unless rd1_r.empty?\n r = begin [].push( ->(;r){ r={};r.merge!( keyvaluedefs_ind_r.ast( context ) );r.merge!( hashsubdefs_ind_r.ast( context ) ); r }.() ).concat( arraysubdefs_ind_r.ast( context ) ) end\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; @indentationLevels << (2+level); @indentationLevels << (4+level); true }\n hashsub1_r:hashsubdefs_ind_r? \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub2_r:hashsubdefs_ind_r? \n &{ |s| node_cache[:arraysubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:internreferences][rd2_r.ast( context )] = hashsub1_r.ast( context ) unless rd2_r.empty?\n r = begin [].push( ->(;r){ r={};r.store( keydef_r.ast( context ), hashsub1_r.ast( context ) );r.merge!( hashsub2_r.ast( context ) ); r }.() ).concat( arraysubdefs_ind_r.ast( context ) ) end\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r ':' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; @indentationLevels << (2+level); true }\n hashsubdefs_ind_r \n &{ |s| node_cache[:arraysubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = begin [].push( ->(;r){ r={};r.merge!( hashsubdefs_ind_r.ast( context ) ); r }.() ).concat( arraysubdefs_ind_r.ast( context ) ) end\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r refdef_tl:refdef_r? ws_r valuedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = valuedefs_ind_r.ast( context ) unless refdef_tl.empty?\n r = []\n r2 = valuedefs_ind_r.ast( context )\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n r2 = arraysubdefs_ind_r.ast( context )\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = arraysubdefs_ind_r.ast( context )\n r\n end\n }\n end\n\n rule hashsubdefs_ind_r\n ( \n &{ |s| save = index; i = _nt_indentation_r; level = i.text_value.length; index = save; ok = (level == (2 + @indentationLevels.last)); ok }\n hashsubdef_ind_r '' \n )*\n {\n def ast( context )\n r = {}\n elements.each { |e| r.merge!( e.hashsubdef_ind_r.ast( context ) ) }\n r\n end\n }\n end\n\n rule hashsubdef_ind_r\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' ws_r '@schema' ws_r schemaname_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n \n unless context.globalvars[:schemata][schemaname_r.ast( context )]\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname_r\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast( context )}, 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 context.globalvars[:schema] << context.globalvars[:schemata][schemaname_r.ast( context )]\n context.globalvars[:internreferences][rd2_r.ast( context )] = arraysubdefs_schema_ind_r.ast( context ) unless rd2_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), arraysubdefs_schema_ind_r.ast( context ) ] )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' ws_r '@schema' ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n context.globalvars[:internreferences][rd2_r.ast( context )] = arraysubdefs_schema_ind_r.ast( context ) unless rd2_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), arraysubdefs_schema_ind_r.ast( context ) ] )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' ws_r '@schema' ws_r schemaname_r ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n context.globalvars[:schemata][schemaname_r.ast( context )] = schema_fieldlist_r.ast( context )\n context.globalvars[:internreferences][rd2_r.ast( context )] = arraysubdefs_schema_ind_r.ast( context ) unless rd2_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), arraysubdefs_schema_ind_r.ast( context ) ] )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r keydef_r ws_r ',' ws_r '@schema' ws_r schemaname_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n \n unless context.globalvars[:schemata][schemaname_r.ast( context )]\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname_r\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast( context )}, 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 context.globalvars[:schema] << context.globalvars[:schemata][schemaname_r.ast( context )]\n r.merge!( Hash[ keydef_r.ast( context ), arraysubdefs_schema_ind_r.ast( context ) ] )\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' ws_r rd3_r:refdef_r? ws_r valuedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:internreferences][rd3_r.ast( context )] = valuedefs_ind_r.ast( context ) unless rd3_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), begin [].concat( valuedefs_ind_r.ast( context ) ).concat( arraysubdefs_ind_r.ast( context ) ) end ] )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r[keydef_r.ast( context )] unless rd2_r.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:internreferences][rd2_r.ast( context )] = arraysubdefs_ind_r.ast( context ) unless rd2_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), arraysubdefs_ind_r.ast( context ) ] )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r keydef_r ws_r rd2_r:refdef_r? wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:internreferences][rd2_r.ast( context )] = hashsubdefs_ind_r.ast( context ) unless rd2_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), hashsubdefs_ind_r.ast( context ) ] )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r refdef_tl:refdef_r? ws_r keyvaluedefs_ind_r \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl_r+\n {\n def ast( context )\n r = keyvaluedefs_ind_r.ast( context )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = r unless refdef_tl.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r '@merge' ws_r refuse_ind_r \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl_r+\n {\n def ast( context )\n r = refuse_ind_r.ast( context )\n r\n end\n }\n end\n\n rule arraysubdefs_ind_r\n ( \n &{ |s| save = index; i = _nt_indentation_r; level = i.text_value.length; index = save; ok = (level == (2 + @indentationLevels.last)); ok }\n arraysubdef_ind_r '' \n )*\n {\n def ast( context )\n r = []\n elements.each do |e|\n e1 = e.arraysubdef_ind_r.ast( context )\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_r\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' ws_r '@schema' ws_r schemaname_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub1_r:hashsubdefs_ind_r? \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n \n unless context.globalvars[:schemata][schemaname_r.ast( context )]\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname_r\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast( context )}, 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 context.globalvars[:schema] << context.globalvars[:schemata][schemaname_r.ast( context )]\n context.globalvars[:internreferences][rd2_r.ast( context )] = arraysubdefs_schema_ind_r.ast( context ) unless rd2_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), arraysubdefs_schema_ind_r.ast( context ) ] )\n r.merge!( hashsub1_r.ast( context ) )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' ws_r '@schema' ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub1_r:hashsubdefs_ind_r? \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n context.globalvars[:internreferences][rd2_r.ast( context )] = arraysubdefs_schema_ind_r.ast( context ) unless rd2_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), arraysubdefs_schema_ind_r.ast( context ) ] )\n r.merge!( hashsub1_r.ast( context ) )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' ws_r '@schema' ws_r schemaname_r ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub1_r:hashsubdefs_ind_r? \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n context.globalvars[:schemata][schemaname_r.ast( context )] = schema_fieldlist_r.ast( context )\n r.merge!( Hash[ keydef_r.ast( context ), arraysubdefs_schema_ind_r.ast( context ) ] )\n r.merge!( hashsub1_r.ast( context ) )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r[keydef_r.ast( context )] unless rd2_r.empty?\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ': ' ws_r rd2_r:refdef_r? ws_r keyvaluedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:internreferences][rd2_r.ast( context )] = keyvaluedefs_ind_r.ast( context ) unless rd2_r.empty?\n r.merge!( keyvaluedefs_ind_r.ast( context ) )\n r.merge!( hashsubdefs_ind_r.ast( context ) )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r refdef_tl:refdef_r? ws_r ':' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = hashsubdefs_ind_r.ast( context )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = r unless refdef_tl.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r refdef_tl:refdef_r? ws_r ':' ws_r '@merge' ws_r refuse_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n r.merge!( refuse_ind_r.ast( context ) )\n r.merge!( hashsubdefs_ind_r.ast( context ) )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = r unless refdef_tl.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' ws_r rd3_r:refdef_r? ws_r valuedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n arraysubdefs_ind_r \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub1_r:hashsubdefs_ind_r? \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:internreferences][rd3_r.ast( context )] = valuedefs_ind_r.ast( context ) unless rd3_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), begin [].concat( valuedefs_ind_r.ast( context ) ).concat( arraysubdefs_ind_r.ast( context ) ) end ] )\n r.merge!( hashsub1_r.ast( context ) )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r[keydef_r.ast( context )] unless rd2_r.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n arraysubdefs_ind_r \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub1_r:hashsubdefs_ind_r? \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), arraysubdefs_ind_r.ast( context ) ] )\n r.merge!( hashsub1_r.ast( context ) )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r[keydef_r.ast( context )] unless rd2_r.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n hashsub1_r:hashsubdefs_ind_r? \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub2_r:hashsubdefs_ind_r? \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), hashsub1_r.ast( context ) ] )\n r.merge!( hashsub2_r.ast( context ) )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r[keydef_r.ast( context )] unless rd2_r.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ':' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), hashsubdefs_ind_r.ast( context ) ] )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r[keydef_r.ast( context )] unless rd2_r.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r refdef_tl:refdef_r? ws_r ',' ws_r '@schema' ws_r schemaname_r ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n context.globalvars[:schemata][schemaname_r.ast( context )] = schema_fieldlist_r.ast( context )\n r = arraysubdefs_schema_ind_r.ast( context )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = r unless refdef_tl.empty?\n res = r\n context.globalvars[:schema].pop\n [ res ]\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r refdef_tl:refdef_r? ws_r ',' ws_r '@schema' ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n r = arraysubdefs_schema_ind_r.ast( context )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = r unless refdef_tl.empty?\n res = r\n context.globalvars[:schema].pop\n [ res ]\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r refdef_tl:refdef_r? ws_r ',' ws_r '@schema' ws_r schemaname_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n \n unless context.globalvars[:schemata][schemaname_r.ast( context )]\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname_r\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast( context )}, 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 context.globalvars[:schema] << context.globalvars[:schemata][schemaname_r.ast( context )]\n r = arraysubdefs_schema_ind_r.ast( context )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = r unless refdef_tl.empty?\n res = r\n context.globalvars[:schema].pop\n [ res ]\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r ':' ws_r rd1_r:refdef_r? ws_r keyvaluedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n hashsubdefs_ind_r \n &{ |s| node_cache[:arraysubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:internreferences][rd1_r.ast( context )] = keyvaluedefs_ind_r.ast( context ) unless rd1_r.empty?\n r = begin [].push( begin [].push( ->(;r){ r={};r.merge!( keyvaluedefs_ind_r.ast( context ) );r.merge!( hashsubdefs_ind_r.ast( context ) ); r }.() ).concat( arraysubdefs_ind_r.ast( context ) ) end ) end\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); @indentationLevels << (4+level); end; ok }\n hashsub1_r:hashsubdefs_ind_r? \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub2_r:hashsubdefs_ind_r? \n &{ |s| node_cache[:arraysubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:internreferences][rd2_r.ast( context )] = hashsub1_r.ast( context ) unless rd2_r.empty?\n r = begin [].push( begin [].push( ->(;r){ r={};r.store( keydef_r.ast( context ), hashsub1_r.ast( context ) );r.merge!( hashsub2_r.ast( context ) ); r }.() ).concat( arraysubdefs_ind_r.ast( context ) ) end ) end\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r ':' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n hashsubdefs_ind_r \n &{ |s| node_cache[:arraysubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = begin [].push( begin [].push( ->(;r){ r={};r.merge!( hashsubdefs_ind_r.ast( context ) ); r }.() ).concat( arraysubdefs_ind_r.ast( context ) ) end ) end\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ',' ws_r rd2_r:refdef_r? ws_r valuedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:internreferences][rd2_r.ast( context )] = valuedefs_ind_r.ast( context ) unless rd2_r.empty?\n r = []\n r2 = valuedefs_ind_r.ast( context )\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n r2 = arraysubdefs_ind_r.ast( context )\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n [\n r\n ]\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r refdef_tl:refdef_r? ws_r ',' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = arraysubdefs_ind_r.ast( context )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = r unless refdef_tl.empty?\n [\n r\n ]\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r '@insert' ws_r refuse_ind_r \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl_r+\n {\n def ast( context )\n r = refuse_ind_r.ast( context )\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r refdef_tl:refdef_r? ws_r valuedefs_ind_r \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl_r+\n {\n def ast( context )\n r = valuedefs_ind_r.ast( context )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = r unless refdef_tl.empty?\n r\n end\n }\n end\n\n rule arraysubdefs_schema_ind_r\n ( \n &{ |s| save = index; i = _nt_indentation_r; level = i.text_value.length; index = save; ok = (level == (2 + @indentationLevels.last)); ok }\n arraysubdef_schema_ind_r '' \n )*\n {\n def ast( context )\n r = []\n elements.each do |e|\n e1 = e.arraysubdef_schema_ind_r.ast( context )\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_r\n indentation_r rd1_r:refdef_r? ws_r ': ' ws_r rd2_r:refdef_r? ws_r schemavaluedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n \n if schemavaluedefs_ind_r.ast( context ).length > context.globalvars[:schema].last.length\n s = \"GDS: too many values for schema definition: \"\n nt = schemavaluedefs_ind_r\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_r.ast( context ).each_with_index.map do |e,i|\n (e.is_a?(Hash) && e[:valuedirective]==:@na) ? ({}) : (Hash[ context.globalvars[:schema].last[i], e ])\n end.inject({}){ |res,e| res.merge!(e) }\n context.globalvars[:internreferences][rd1_r.ast( context )] = result unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r1 unless rd2_r.empty?\n result.merge!( r1 ).merge!( hashsubdefs_ind_r.ast( context ) )\n \n end\n }\n /\n arraysubdef_ind_r ''\n {\n def ast( context )\n arraysubdef_ind_r.ast( context )\n end\n }\n end\n\n rule schemavaluedefs_ind_r\n schemavaluedef_ind_r ws_r '|' ws_r schemavaluedefs_ind_r \n {\n def ast( context )\n r = []\n r << schemavaluedef_ind_r.ast( context )\n r2 = schemavaluedefs_ind_r.ast( context )\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n r\n end\n }\n /\n schemavaluedef_ind_r '' \n {\n def ast( context )\n r = []\n r << schemavaluedef_ind_r.ast( context )\n r\n end\n }\n end\n\n rule schemavaluedef_ind_r\n value_directive_ind_r ''\n {\n def ast( context )\n value_directive_ind_r.ast( context )\n end\n }\n /\n valuedef_ind_r ''\n {\n def ast( context )\n valuedef_ind_r.ast( context )\n end\n }\n end\n\n rule refdef_r\n '&' identifier_r \n {\n def ast( context )\n r = identifier_r.ast( context )\n r\n end\n }\n end\n\n rule keyvaluedefs_ind_r\n keyvaluedef_ind_r ws_r '|' ws_r keyvaluedefs_ind_r \n {\n def ast( context )\n r = {}\n r.merge!( keyvaluedef_ind_r.ast( context ) )\n r.merge!( keyvaluedefs_ind_r.ast( context ) )\n r\n end\n }\n /\n keyvaluedef_ind_r ''\n {\n def ast( context )\n keyvaluedef_ind_r.ast( context )\n end\n }\n end\n\n rule keyvaluedef_ind_r\n keydef_r wsc_l:(wsc_r+) valuedef_ind_r \n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), valuedef_ind_r.ast( context ) ] )\n r\n end\n }\n end\n\n rule valuedef_ind_r\n variable_val_ind_r ''\n {\n def ast( context )\n variable_val_ind_r.ast( context )\n end\n }\n /\n refuse_ind_r ''\n {\n def ast( context )\n refuse_ind_r.ast( context )\n end\n }\n /\n valuedef_gen_ind_r ''\n {\n def ast( context )\n valuedef_gen_ind_r.ast( context )\n end\n }\n /\n special_value_ind_r ''\n {\n def ast( context )\n special_value_ind_r.ast( context )\n end\n }\n /\n string_no_leading_space_r ''\n {\n def ast( context )\n string_no_leading_space_r.ast( context )\n end\n }\n end\n\n rule keyvaluedef_r\n keydef_r ':' wscommnl2_r valuedef_r \n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), valuedef_r.ast( context ) ] )\n r\n end\n }\n /\n wscommnl2_r ':' keydef_r wscommnl2_r '=>' wscommnl2_r valuedef_r \n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), valuedef_r.ast( context ) ] )\n r\n end\n }\n end\n\n rule valuedefs_ind_r\n valuedef_ind_r ws_r '|' ws_r valuedefs_ind_r \n {\n def ast( context )\n r = []\n r << valuedef_ind_r.ast( context )\n r2 = valuedefs_ind_r.ast( context )\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n r\n end\n }\n /\n valuedef_ind_r '' \n {\n def ast( context )\n r = []\n r << valuedef_ind_r.ast( context )\n r\n end\n }\n end\n\n rule valuedef_r\n variable_val_r ''\n {\n def ast( context )\n variable_val_r.ast( context )\n end\n }\n /\n valuedef_gen_r ''\n {\n def ast( context )\n valuedef_gen_r.ast( context )\n end\n }\n /\n special_value_r ''\n {\n def ast( context )\n special_value_r.ast( context )\n end\n }\n end\n\n rule valuedef_gen_r\n number_float_r ''\n {\n def ast( context )\n number_float_r.ast( context )\n end\n }\n /\n number_int_r ''\n {\n def ast( context )\n number_int_r.ast( context )\n end\n }\n /\n rubysymbol_r ''\n {\n def ast( context )\n rubysymbol_r.ast( context )\n end\n }\n /\n string_with_quotes_r ''\n {\n def ast( context )\n string_with_quotes_r.ast( context )\n end\n }\n end\n\n rule valuedef_gen_ind_r\n ruby_eval_r ''\n {\n def ast( context )\n ruby_eval_r.ast( context )\n end\n }\n /\n number_float_r ''\n {\n def ast( context )\n number_float_r.ast( context )\n end\n }\n /\n number_int_r ''\n {\n def ast( context )\n number_int_r.ast( context )\n end\n }\n /\n rubysymbol_ind_r ''\n {\n def ast( context )\n rubysymbol_ind_r.ast( context )\n end\n }\n /\n string_with_quotes_r ''\n {\n def ast( context )\n string_with_quotes_r.ast( context )\n end\n }\n end\n\n rule special_value_r\n 'nil' \n {\n def ast( context )\n nil\n end\n }\n /\n 'true' \n {\n def ast( context )\n true\n end\n }\n /\n 'false' \n {\n def ast( context )\n false\n end\n }\n end\n\n rule special_value_ind_r\n '!nil' \n {\n def ast( context )\n nil\n end\n }\n /\n '@nil' \n {\n def ast( context )\n nil\n end\n }\n /\n '!true' \n {\n def ast( context )\n true\n end\n }\n /\n '@true' \n {\n def ast( context )\n true\n end\n }\n /\n '!false' \n {\n def ast( context )\n false\n end\n }\n /\n '@false' \n {\n def ast( context )\n false\n end\n }\n end\n\n rule value_directive_ind_r\n '@na' \n {\n def ast( context )\n r = {}\n r.merge!( Hash[ :valuedirective, :@na ] )\n r\n end\n }\n end\n\n rule string_with_quotes_r\n string_with_doublequotes_r ''\n {\n def ast( context )\n string_with_doublequotes_r.ast( context )\n end\n }\n /\n string_with_singlequotes_r ''\n {\n def ast( context )\n string_with_singlequotes_r.ast( context )\n end\n }\n end\n\n rule string_with_doublequotes_r\n '\"' string_double_q_r '\"'\n {\n def ast( context )\n string_double_q_r.ast( context )\n end\n }\n end\n\n rule string_double_q_r\n ('\\\\\\\\' / '\\\"' / !'\"' .)* \n {\n def ast( context )\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 context.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 context.globalvars[:gdsglobvars][key].to_s }.gsub(/\\\\\\$/, \"$\" )\n \n end\n }\n end\n\n rule string_with_singlequotes_r\n '\\'' string_single_q_r '\\''\n {\n def ast( context )\n string_single_q_r.ast( context )\n end\n }\n end\n\n rule string_single_q_r\n ('\\\\\\\\' / '\\\\\\'' / !'\\'' .)* \n {\n def ast( context )\n r = text_value\n r.gsub(/(\\\\\\\\)|(\\\\n)|(\\\\')/, '\\\\\\\\'=>'\\\\', \"\\\\n\"=>\"\\n\", \"\\\\'\"=>\"'\")\n end\n }\n end\n\n rule string_no_leading_space_r\n (&\"$(\" / ( !\"$\" !';' !'!' !'@' !'&' !'*' !' ' !':' !',' !\"|\" !'#' !'/*')) (!\"\\n\" !\"|\" !'#' !'/*' .)+ \n {\n def ast( context )\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 context.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 context.globalvars[:gdsglobvars][key].to_s }.gsub(/\\\\\\$/, \"$\" )\n \n end\n }\n end\n\n rule keydef_r\n string_with_quotes_r '' \n {\n def ast( context )\n string_with_quotes_r.ast( context ).to_sym \n end\n }\n /\n identifier_r ''\n {\n def ast( context )\n identifier_r.ast( context )\n end\n }\n end\n\n rule variable_val_r\n wscommnl2_r '$' varname_r \n {\n def ast( context )\n \n unless context.globalvars[:gdsglobvars].key?(varname_r.ast( context ))\n s = \"GDS: undefined variable: \"\n nt = varname_r\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast( context )}, 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 context.globalvars[:gdsglobvars][varname_r.ast( context )]\n \n end\n }\n end\n\n rule variable_val_ind_r\n '$' varname_r \n {\n def ast( context )\n \n unless context.globalvars[:gdsglobvars].key?(varname_r.ast( context ))\n s = \"GDS: undefined variable: \"\n nt = varname_r\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast( context )}, 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 context.globalvars[:gdsglobvars][varname_r.ast( context )]\n \n end\n }\n end\n\n rule refuse_ind_r\n '*' identifier_r \n {\n def ast( context )\n \n unless context.globalvars[:internreferences][identifier_r.ast( context )]\n s = \"GDS: undefined reference: \"\n nt = identifier_r\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast( context )}, 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 context.globalvars[:internreferences][identifier_r.ast( context )]\n \n end\n }\n end\n\n rule number_int_r\n octal_int_r ''\n {\n def ast( context )\n octal_int_r.ast( context )\n end\n }\n /\n binary_int_r ''\n {\n def ast( context )\n binary_int_r.ast( context )\n end\n }\n /\n hexa_int_r ''\n {\n def ast( context )\n hexa_int_r.ast( context )\n end\n }\n /\n decimal_int_r ''\n {\n def ast( context )\n decimal_int_r.ast( context )\n end\n }\n end\n\n rule octal_int_r\n ('-'/'+')? ( '0o' / '0' ) [0-7] ( [0-7] / '_' [0-7] )* \n {\n def ast( context )\n r = text_value\n r.to_i(8)\n end\n }\n end\n\n rule binary_int_r\n ('-'/'+')? '0b' [01] ( [01] / '_' [01] )* \n {\n def ast( context )\n r = text_value\n r.to_i(2)\n end\n }\n end\n\n rule hexa_int_r\n ('-'/'+')? '0x' [0-9a-fA-F] ( [0-9a-fA-F] / '_' [0-9a-fA-F] )* \n {\n def ast( context )\n r = text_value\n r.to_i(16)\n end\n }\n end\n\n rule decimal_int_r\n ('-'/'+')? ('0d')? [1-9] ( [0-9] / '_' [0-9] )* \n {\n def ast( context )\n text_value.to_i\n end\n }\n /\n ('0d')? [0] \n {\n def ast( context )\n text_value.to_i\n end\n }\n end\n\n rule number_float_r\n [+-]? ( [0-9] / '_' [0-9] )* [.] [0-9] ( [0-9] / '_' [0-9] )* (('e'/'E') [+-]? [0-9] ( [0-9] / '_' [0-9] )* )? \n {\n def ast( context )\n text_value.to_f\n end\n }\n end\n\n rule rubysymbol_r\n wscommnl2_r ':' rubysymbolcontent_r \n {\n def ast( context )\n r = rubysymbolcontent_r.ast( context )\n r\n end\n }\n end\n\n rule rubysymbolcontent_r\n wscommnl2_r '\"' rubysymbol_in_double_quotes_r '\"' \n {\n def ast( context )\n r = rubysymbol_in_double_quotes_r.ast( context )\n r\n end\n }\n /\n wscommnl2_r '\\'' rubysymbol_in_single_quotes_r '\\'' \n {\n def ast( context )\n r = rubysymbol_in_single_quotes_r.ast( context )\n r\n end\n }\n /\n ( !\"'\" !'\"' !'}' !' ' !',' !']' !'#' !'/*' !'*/' !\"\\n\" .)+\n {\n def ast( context )\n text_value.to_sym\n end\n }\n end\n\n rule rubysymbol_ind_r\n ':' rubysymbolcontent_ind_r \n {\n def ast( context )\n r = rubysymbolcontent_ind_r.ast( context )\n r\n end\n }\n end\n\n rule rubysymbolcontent_ind_r\n '\"' rubysymbol_in_double_quotes_r '\"' \n {\n def ast( context )\n r = rubysymbol_in_double_quotes_r.ast( context )\n r\n end\n }\n /\n '\\'' rubysymbol_in_single_quotes_r '\\'' \n {\n def ast( context )\n r = rubysymbol_in_single_quotes_r.ast( context )\n r\n end\n }\n /\n (!\"'\" !'\"' !' ' !'|' !'#' !'/*' !'*/' !\"\\n\" .)+\n {\n def ast( context )\n text_value.to_sym\n end\n }\n end\n\n rule rubysymbol_in_double_quotes_r\n ('\\\\\\\\' / '\\\\\"' / !'\"' !\"\\n\" .)* \n {\n def ast( context )\n r = text_value\n r.gsub(/(\\\\\\\\)|(\\\\\")/, '\\\\\\\\'=>'\\\\', '\\\\\"'=>'\"').to_sym\n end\n }\n end\n\n rule rubysymbol_in_single_quotes_r\n ('\\\\\\\\' / '\\\\\\'' / !'\\'' !\"\\n\" .)* \n {\n def ast( context )\n r = text_value\n r.gsub(/(\\\\\\\\)|(\\\\')/, '\\\\\\\\'=>'\\\\', \"\\\\'\"=>\"'\").to_sym\n end\n }\n end\n\n rule ruby_eval_r\n '@r' ws_r evalexpr_r \n {\n def ast( context )\n context.config[:context] ? (eval(evalexpr_r.ast( context ), context.config[:context])) : nil \n end\n }\n /\n '@env' ws_r '(' ws_r envvar_r ws_r ',' ws_r string_with_quotes_r ws_r ')' \n {\n def ast( context )\n context.config[:allow_env] ? ( (res=eval(\"ENV['\#{envvar_r.ast( context ).strip}']\")) ? res : string_with_quotes_r.ast( context ) ) : string_with_quotes_r.ast( context ) \n end\n }\n /\n '@env' ws_r evalexpr_r \n {\n def ast( context )\n context.config[:allow_env] ? (eval(\"ENV['\#{evalexpr_r.ast( context ).strip}']\")) : nil \n end\n }\n end\n\n rule envvar_r\n identifier_r '' \n {\n def ast( context )\n text_value\n end\n }\n end\n\n rule evalexpr_r\n evalexpr_0_with_nesting_r ''\n {\n def ast( context )\n evalexpr_0_with_nesting_r.ast( context )\n end\n }\n end\n\n rule evalexpr_0_with_nesting_r\n &{ |s| @evalexpr_0_with_nestingLevel = 0; true }\n '(' evalexpr_0_with_nesting_sub_r ')'\n {\n def ast( context )\n evalexpr_0_with_nesting_sub_r.ast( context )\n end\n }\n end\n\n rule evalexpr_0_with_nesting_sub_r\n '(' \n &{ |s| @evalexpr_0_with_nestingLevel += 1; true }\n evalexpr_0_with_nesting_sub_r\n {\n def ast( context )\n '(' + evalexpr_0_with_nesting_sub_r.ast( context )\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_r\n {\n def ast( context )\n ')' + evalexpr_0_with_nesting_sub_r.ast( context )\n end\n }\n /\n ( !\"(\" !\")\" . )+ evalexpr_0_with_nesting_sub_r\n {\n def ast( context )\n text_value\n end\n }\n /\n ''\n {\n def ast( context )\n ''\n end\n }\n end\n\n rule evalexpr_0_with_nesting_onechar_r\n ( !\")\" . )\n {\n def ast( context )\n text_value\n end\n }\n end\n\n rule bc_0_r\n &{ |s| @bc_0Level = 0; true }\n '/*' bc_0_sub_r '*/'\n {\n def ast( context )\n \"/*\" + bc_0_sub_r.ast( context ) + \"*/\"\n end\n }\n end\n\n rule bc_0_sub_r\n '/*' \n &{ |s| @bc_0Level += 1; true }\n bc_0_sub_r\n {\n def ast( context )\n '/*' + bc_0_sub_r.ast( context )\n end\n }\n /\n '*/' \n &{ |s| ok = (@bc_0Level > 0); ok } \n &{ |s| @bc_0Level -= 1; true }\n bc_0_sub_r\n {\n def ast( context )\n '*/' + bc_0_sub_r.ast( context )\n end\n }\n /\n ( !\"/*\" !\"*/\" . )+ bc_0_sub_r\n {\n def ast( context )\n text_value\n end\n }\n /\n ''\n {\n def ast( context )\n ''\n end\n }\n end\n\n rule bc_0_onechar_r\n ( !\"*/\" . )\n {\n def ast( context )\n text_value\n end\n }\n end\n\n rule wsc_r\n [ \\t] \n {\n }\n /\n bc_0_r '' \n {\n }\n end\n\n rule identifier_r\n ([a-zA-Z_] [a-zA-Z0-9_]*)\n {\n def ast( context )\n text_value.to_sym\n end\n }\n end\n\n rule identifierstr_r\n ([a-zA-Z_] [a-zA-Z0-9_]*)\n {\n def ast( context )\n text_value\n end\n }\n end\n\n rule string_no_space_r\n [a-zA-Z0-9_/.:]+\n {\n def ast( context )\n text_value\n end\n }\n end\n\n rule indentation_r\n ' '*\n end\n\n rule ws_r\n wsc_r*\n end\n\n rule icomm_r\n '#' \n end\n\n rule wscommnl_r\n ws_r ( icomm_r ( !\"\\n\" . )* )? \"\\n\"\n end\n\n rule wscommnl2_r\n ( icomm_r ( !\"\\n\" . )* \"\\n\" / \"\\n\" / wsc_r )*\n end\n\nend\n"
40
+ GrammarDef = "grammar Language_gds_03\n\n rule top_r\n &{ |s| @indentationLevels = []; true }\n defs_r ''\n {\n def ast( context )\n context.globalvars[:schemata] ||= {}\n context.globalvars[:gdsglobvars] ||= {}\n context.globalvars[:internreferences] ||= {}\n context.globalvars[:schema] ||= []\n defs_r.ast( context )\n end\n }\n end\n\n rule defs_r\n wscommnl_r* predefs_r wscommnl_r* defs2_r \n {\n def ast( context )\n dummy = predefs_r.ast( context )\n r = defs2_r.ast( context )\n r\n end\n }\n end\n\n rule predefs_r\n predef_r* \n {\n def ast( context )\n elements.each { |e| e.ast( context ) }\n end\n }\n end\n\n rule predef_r\n wscommnl2_r '@schema' wscommnl2_r schemaname_r wscommnl2_r '(' wscommnl2_r schema_fieldlist_r wscommnl2_r ')' \n {\n def ast( context )\n context.globalvars[:schemata][schemaname_r.ast( context )] = schema_fieldlist_r.ast( context )\n end\n }\n /\n wscommnl2_r '$' varname_r wscommnl2_r '=' wscommnl2_r vardef_rvalue_r \n {\n def ast( context )\n context.globalvars[:gdsglobvars][varname_r.ast( context )] = vardef_rvalue_r.ast( context )\n end\n }\n end\n\n rule schemaname_r\n identifier_r '' \n {\n def ast( context )\n r = identifier_r.ast( context )\n r\n end\n }\n end\n\n rule varname_r\n identifier_r ''\n {\n def ast( context )\n identifier_r.ast( context )\n end\n }\n end\n\n rule vardef_rvalue_r\n valuedef_ind_r ''\n {\n def ast( context )\n valuedef_ind_r.ast( context )\n end\n }\n end\n\n rule schema_fieldlist_r\n schemafield_r ws_r ',' ws_r schema_fieldlist_r \n {\n def ast( context )\n r = []\n r << schemafield_r.ast( context )\n r2 = schema_fieldlist_r.ast( context )\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n r\n end\n }\n /\n schemafield_r '' \n {\n def ast( context )\n r = []\n r << schemafield_r.ast( context )\n r\n end\n }\n end\n\n rule schemafield_r\n identifier_r '' \n {\n def ast( context )\n r = identifier_r.ast( context )\n r\n end\n }\n end\n\n rule defs2_r\n wscommnl2_r ruby_standard_def_r wscommnl2_r\n {\n def ast( context )\n ruby_standard_def_r.ast( context )\n end\n }\n /\n wscommnl_r* special_indented_def_r wscommnl2_r\n {\n def ast( context )\n special_indented_def_r.ast( context )\n end\n }\n end\n\n rule ruby_standard_def_r\n hashdef_r ''\n {\n def ast( context )\n hashdef_r.ast( context )\n end\n }\n /\n arraydef_r ''\n {\n def ast( context )\n arraydef_r.ast( context )\n end\n }\n end\n\n rule special_indented_def_r\n arraydef_ind_r ''\n {\n def ast( context )\n arraydef_ind_r.ast( context )\n end\n }\n /\n hashdef_ind_r ''\n {\n def ast( context )\n hashdef_ind_r.ast( context )\n end\n }\n end\n\n rule hashdef_r\n wscommnl2_r '{' wscommnl2_r hashsubdefs_r wscommnl2_r '}' \n {\n def ast( context )\n r = hashsubdefs_r.ast( context )\n r\n end\n }\n end\n\n rule arraydef_r\n wscommnl2_r '[' wscommnl2_r arraysubdefs_r wscommnl2_r ']' \n {\n def ast( context )\n r = arraysubdefs_r.ast( context )\n r\n end\n }\n end\n\n rule hashsubdefs_r\n hashsubdef_r wscommnl2_r morehashsubdefs_r wscommnl2_r ','? \n {\n def ast( context )\n r = {}\n r.merge!( hashsubdef_r.ast( context ) )\n r.merge!( morehashsubdefs_r.ast( context ) )\n r\n end\n }\n /\n ''\n {\n def ast( context )\n {}\n end\n }\n end\n\n rule morehashsubdefs_r\n morehashsubdef_r*\n {\n def ast( context )\n r = {}\n elements.each { |e| r.merge!( e.ast( context ) ) }\n r\n end\n }\n end\n\n rule morehashsubdef_r\n wscommnl2_r ',' wscommnl2_r hashsubdef_r\n {\n def ast( context )\n hashsubdef_r.ast( context )\n end\n }\n end\n\n rule hashsubdef_r\n keyvaluedef_r ''\n {\n def ast( context )\n keyvaluedef_r.ast( context )\n end\n }\n /\n keydef_r ':' wscommnl2_r hashdef_r \n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), hashdef_r.ast( context ) ] )\n r\n end\n }\n /\n wscommnl2_r ':' keydef_r wscommnl2_r '=>' wscommnl2_r hashdef_r \n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), hashdef_r.ast( context ) ] )\n r\n end\n }\n /\n keydef_r ':' wscommnl2_r arraydef_r \n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), arraydef_r.ast( context ) ] )\n r\n end\n }\n /\n wscommnl2_r ':' keydef_r wscommnl2_r '=>' wscommnl2_r arraydef_r \n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), arraydef_r.ast( context ) ] )\n r\n end\n }\n end\n\n rule arraysubdefs_r\n arraysubdef_r wscommnl2_r morearraysubdefs_r wscommnl2_r ','? \n {\n def ast( context )\n r = []\n r << arraysubdef_r.ast( context )\n r2 = morearraysubdefs_r.ast( context )\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n r\n end\n }\n /\n '' \n {\n def ast( context )\n r = []\n r\n end\n }\n end\n\n rule morearraysubdefs_r\n morearraysubdef_r* \n {\n def ast( context )\n r = []\n elements.each do |e|\n r << e.ast( context )\n end\n r\n end\n }\n end\n\n rule morearraysubdef_r\n wscommnl2_r ',' wscommnl2_r arraysubdef_r\n {\n def ast( context )\n arraysubdef_r.ast( context )\n end\n }\n end\n\n rule arraysubdef_r\n valuedef_r ''\n {\n def ast( context )\n valuedef_r.ast( context )\n end\n }\n /\n arraydef_r ''\n {\n def ast( context )\n arraydef_r.ast( context )\n end\n }\n /\n hashdef_r ''\n {\n def ast( context )\n hashdef_r.ast( context )\n end\n }\n /\n hashsubdef_r ''\n {\n def ast( context )\n hashsubdef_r.ast( context )\n end\n }\n end\n\n rule hashdef_ind_r\n indentation_r bc_0_l:(bc_0_r*) ws_r ': ' ws_r refdef_tl:refdef_r? ws_r keyvaluedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:internreferences][refdef_tl.ast( context )] = keyvaluedefs_ind_r.ast( context ) unless refdef_tl.empty?\n r.merge!( keyvaluedefs_ind_r.ast( context ) )\n r.merge!( hashsubdefs_ind_r.ast( context ) )\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ': ' ws_r keydef_r ws_r refdef_tl:refdef_r? wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; @indentationLevels << (2+level); true }\n hashsub1_r:hashsubdefs_ind_r? \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub2_r:hashsubdefs_ind_r? \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), hashsub1_r.ast( context ) ] )\n r.merge!( hashsub2_r.ast( context ) )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = r[keydef_r.ast( context )] unless refdef_tl.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ':' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = hashsubdefs_ind_r.ast( context )\n r\n end\n }\n /\n indentation_r '' \n &{ |s| level = s[0].text_value.length; @lastIndentation=level; true } \n &{ |s| false }\n {\n def ast( context )\n end\n }\n /\n &{ |s| @indentationLevels << (@lastIndentation-2); true }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n r.merge!( hashsubdefs_ind_r.ast( context ) )\n r\n end\n }\n end\n\n rule arraydef_ind_r\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r '@schema' ws_r schemaname_r ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n context.globalvars[:schemata][schemaname_r.ast( context )] = schema_fieldlist_r.ast( context )\n r = arraysubdefs_schema_ind_r.ast( context )\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r '@schema' ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n r = arraysubdefs_schema_ind_r.ast( context )\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r '@schema' ws_r schemaname_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n \n unless context.globalvars[:schemata][schemaname_r.ast( context )]\n ###orig-ok# raise SyntaxError, \"GDS: undefined schema specifier: \#{schemaname.ast}\"\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname_r\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast( context )}, 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 context.globalvars[:schema] << context.globalvars[:schemata][schemaname_r.ast( context )]\n r = arraysubdefs_schema_ind_r.ast( context )\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r ':' ws_r rd1_r:refdef_r? ws_r keyvaluedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; @indentationLevels << (2+level); true }\n hashsubdefs_ind_r \n &{ |s| node_cache[:arraysubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:internreferences][rd1_r.ast( context )] = keyvaluedefs_ind_r.ast( context ) unless rd1_r.empty?\n r = begin [].push( ->(;r){ r={};r.merge!( keyvaluedefs_ind_r.ast( context ) );r.merge!( hashsubdefs_ind_r.ast( context ) ); r }.() ).concat( arraysubdefs_ind_r.ast( context ) ) end\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; @indentationLevels << (2+level); @indentationLevels << (4+level); true }\n hashsub1_r:hashsubdefs_ind_r? \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub2_r:hashsubdefs_ind_r? \n &{ |s| node_cache[:arraysubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:internreferences][rd2_r.ast( context )] = hashsub1_r.ast( context ) unless rd2_r.empty?\n r = begin [].push( ->(;r){ r={};r.store( keydef_r.ast( context ), hashsub1_r.ast( context ) );r.merge!( hashsub2_r.ast( context ) ); r }.() ).concat( arraysubdefs_ind_r.ast( context ) ) end\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r ':' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; @indentationLevels << (2+level); true }\n hashsubdefs_ind_r \n &{ |s| node_cache[:arraysubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = begin [].push( ->(;r){ r={};r.merge!( hashsubdefs_ind_r.ast( context ) ); r }.() ).concat( arraysubdefs_ind_r.ast( context ) ) end\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r refdef_tl:refdef_r? ws_r valuedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = valuedefs_ind_r.ast( context ) unless refdef_tl.empty?\n r = []\n r2 = valuedefs_ind_r.ast( context )\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n r2 = arraysubdefs_ind_r.ast( context )\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; @indentationLevels << level; true }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = arraysubdefs_ind_r.ast( context )\n r\n end\n }\n end\n\n rule hashsubdefs_ind_r\n ( \n &{ |s| save = index; i = _nt_indentation_r; level = i.text_value.length; index = save; ok = (level == (2 + @indentationLevels.last)); ok }\n hashsubdef_ind_r '' \n )*\n {\n def ast( context )\n r = {}\n elements.each { |e| r.merge!( e.hashsubdef_ind_r.ast( context ) ) }\n r\n end\n }\n end\n\n rule hashsubdef_ind_r\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r keydef_r ws_r rd2_r:refdef_r? ws_r '@schema' ws_r schemaname_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n \n unless context.globalvars[:schemata][schemaname_r.ast( context )]\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname_r\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast( context )}, 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 context.globalvars[:schema] << context.globalvars[:schemata][schemaname_r.ast( context )]\n context.globalvars[:internreferences][rd2_r.ast( context )] = hashsubdefs_schema_ind_r.ast( context ) unless rd2_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), hashsubdefs_schema_ind_r.ast( context ) ] )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r keydef_r ws_r rd2_r:refdef_r? ws_r '@schema' ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n r.merge!( Hash[ keydef_r.ast( context ), hashsubdefs_schema_ind_r.ast( context ) ] )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r[keydef_r.ast( context )] unless rd2_r.empty?\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r keydef_r ws_r rd2_r:refdef_r? ws_r '@schema' ws_r schemaname_r ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n context.globalvars[:schemata][schemaname_r.ast( context )] = schema_fieldlist_r.ast( context )\n r.merge!( Hash[ keydef_r.ast( context ), hashsubdefs_schema_ind_r.ast( context ) ] )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r[keydef_r.ast( context )] unless rd2_r.empty?\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' ws_r '@schema' ws_r schemaname_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n \n unless context.globalvars[:schemata][schemaname_r.ast( context )]\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname_r\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast( context )}, 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 context.globalvars[:schema] << context.globalvars[:schemata][schemaname_r.ast( context )]\n context.globalvars[:internreferences][rd2_r.ast( context )] = arraysubdefs_schema_ind_r.ast( context ) unless rd2_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), arraysubdefs_schema_ind_r.ast( context ) ] )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' ws_r '@schema' ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n context.globalvars[:internreferences][rd2_r.ast( context )] = arraysubdefs_schema_ind_r.ast( context ) unless rd2_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), arraysubdefs_schema_ind_r.ast( context ) ] )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' ws_r '@schema' ws_r schemaname_r ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n context.globalvars[:schemata][schemaname_r.ast( context )] = schema_fieldlist_r.ast( context )\n context.globalvars[:internreferences][rd2_r.ast( context )] = arraysubdefs_schema_ind_r.ast( context ) unless rd2_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), arraysubdefs_schema_ind_r.ast( context ) ] )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r keydef_r ws_r ',' ws_r '@schema' ws_r schemaname_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n \n unless context.globalvars[:schemata][schemaname_r.ast( context )]\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname_r\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast( context )}, 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 context.globalvars[:schema] << context.globalvars[:schemata][schemaname_r.ast( context )]\n r.merge!( Hash[ keydef_r.ast( context ), arraysubdefs_schema_ind_r.ast( context ) ] )\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' ws_r rd3_r:refdef_r? ws_r valuedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:internreferences][rd3_r.ast( context )] = valuedefs_ind_r.ast( context ) unless rd3_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), begin [].concat( valuedefs_ind_r.ast( context ) ).concat( arraysubdefs_ind_r.ast( context ) ) end ] )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r[keydef_r.ast( context )] unless rd2_r.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:internreferences][rd2_r.ast( context )] = arraysubdefs_ind_r.ast( context ) unless rd2_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), arraysubdefs_ind_r.ast( context ) ] )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r keydef_r ws_r rd2_r:refdef_r? wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:internreferences][rd2_r.ast( context )] = hashsubdefs_ind_r.ast( context ) unless rd2_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), hashsubdefs_ind_r.ast( context ) ] )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r refdef_tl:refdef_r? ws_r keyvaluedefs_ind_r \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl_r+\n {\n def ast( context )\n r = keyvaluedefs_ind_r.ast( context )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = r unless refdef_tl.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r '@merge' ws_r refuse_ind_r \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl_r+\n {\n def ast( context )\n r = refuse_ind_r.ast( context )\n r\n end\n }\n end\n\n rule hashsubdefs_schema_ind_r\n indentation_r schemavaluedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n \n if schemavaluedefs_ind_r.ast( context ).length > context.globalvars[:schema].last.length\n s = \"GDS: too many values for schema definition: \"\n nt = schemavaluedefs_ind_r\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_r.ast( context ).each_with_index.map do |e,i|\n (e.is_a?(Hash) && e[:valuedirective]==:@na) ? ({}) : (Hash[ context.globalvars[:schema].last[i], e ])\n end.inject({}){ |res,e| res.merge!(e) }\n result.merge!( r1 ).merge!( hashsubdefs_ind_r.ast( context ) )\n \n end\n }\n end\n\n rule arraysubdefs_ind_r\n ( \n &{ |s| save = index; i = _nt_indentation_r; level = i.text_value.length; index = save; ok = (level == (2 + @indentationLevels.last)); ok }\n arraysubdef_ind_r '' \n )*\n {\n def ast( context )\n r = []\n elements.each do |e|\n e1 = e.arraysubdef_ind_r.ast( context )\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_r\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' ws_r '@schema' ws_r schemaname_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub1_r:hashsubdefs_ind_r? \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n \n unless context.globalvars[:schemata][schemaname_r.ast( context )]\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname_r\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast( context )}, 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 context.globalvars[:schema] << context.globalvars[:schemata][schemaname_r.ast( context )]\n context.globalvars[:internreferences][rd2_r.ast( context )] = arraysubdefs_schema_ind_r.ast( context ) unless rd2_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), arraysubdefs_schema_ind_r.ast( context ) ] )\n r.merge!( hashsub1_r.ast( context ) )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' ws_r '@schema' ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub1_r:hashsubdefs_ind_r? \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n context.globalvars[:internreferences][rd2_r.ast( context )] = arraysubdefs_schema_ind_r.ast( context ) unless rd2_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), arraysubdefs_schema_ind_r.ast( context ) ] )\n r.merge!( hashsub1_r.ast( context ) )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' ws_r '@schema' ws_r schemaname_r ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub1_r:hashsubdefs_ind_r? \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n context.globalvars[:schemata][schemaname_r.ast( context )] = schema_fieldlist_r.ast( context )\n r.merge!( Hash[ keydef_r.ast( context ), arraysubdefs_schema_ind_r.ast( context ) ] )\n r.merge!( hashsub1_r.ast( context ) )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r[keydef_r.ast( context )] unless rd2_r.empty?\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ': ' ws_r rd2_r:refdef_r? ws_r keyvaluedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:internreferences][rd2_r.ast( context )] = keyvaluedefs_ind_r.ast( context ) unless rd2_r.empty?\n r.merge!( keyvaluedefs_ind_r.ast( context ) )\n r.merge!( hashsubdefs_ind_r.ast( context ) )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r refdef_tl:refdef_r? ws_r ':' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = hashsubdefs_ind_r.ast( context )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = r unless refdef_tl.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r refdef_tl:refdef_r? ws_r ':' ws_r '@merge' ws_r refuse_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n r.merge!( refuse_ind_r.ast( context ) )\n r.merge!( hashsubdefs_ind_r.ast( context ) )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = r unless refdef_tl.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' ws_r rd3_r:refdef_r? ws_r valuedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n arraysubdefs_ind_r \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub1_r:hashsubdefs_ind_r? \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:internreferences][rd3_r.ast( context )] = valuedefs_ind_r.ast( context ) unless rd3_r.empty?\n r.merge!( Hash[ keydef_r.ast( context ), begin [].concat( valuedefs_ind_r.ast( context ) ).concat( arraysubdefs_ind_r.ast( context ) ) end ] )\n r.merge!( hashsub1_r.ast( context ) )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r[keydef_r.ast( context )] unless rd2_r.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ',' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n arraysubdefs_ind_r \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub1_r:hashsubdefs_ind_r? \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), arraysubdefs_ind_r.ast( context ) ] )\n r.merge!( hashsub1_r.ast( context ) )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r[keydef_r.ast( context )] unless rd2_r.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? ws_r '@schema' ws_r schemaname_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n hashsub1_r:hashsubdefs_schema_ind_r? \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub2_r:hashsubdefs_ind_r? \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n \n unless context.globalvars[:schemata][schemaname_r.ast( context )]\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname_r\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast( context )}, 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 context.globalvars[:schema] << context.globalvars[:schemata][schemaname_r.ast( context )]\n r.merge!( Hash[ keydef_r.ast( context ), hashsub1_r.ast( context ) ] )\n r.merge!( hashsub2_r.ast( context ) )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r[keydef_r.ast( context )] unless rd2_r.empty?\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? ws_r '@schema' ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n hashsub1_r:hashsubdefs_schema_ind_r? \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub2_r:hashsubdefs_ind_r? \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n r.merge!( Hash[ keydef_r.ast( context ), hashsub1_r.ast( context ) ] )\n r.merge!( hashsub2_r.ast( context ) )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r[keydef_r.ast( context )] unless rd2_r.empty?\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? ws_r '@schema' ws_r schemaname_r ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n hashsub1_r:hashsubdefs_schema_ind_r? \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub2_r:hashsubdefs_ind_r? \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n context.globalvars[:schemata][schemaname_r.ast( context )] = schema_fieldlist_r.ast( context )\n r.merge!( Hash[ keydef_r.ast( context ), hashsub1_r.ast( context ) ] )\n r.merge!( hashsub2_r.ast( context ) )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r[keydef_r.ast( context )] unless rd2_r.empty?\n res = r\n context.globalvars[:schema].pop\n res\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n hashsub1_r:hashsubdefs_ind_r? \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub2_r:hashsubdefs_ind_r? \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), hashsub1_r.ast( context ) ] )\n r.merge!( hashsub2_r.ast( context ) )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r[keydef_r.ast( context )] unless rd2_r.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r keydef_r ws_r rd2_r:refdef_r? ws_r ':' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), hashsubdefs_ind_r.ast( context ) ] )\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r[keydef_r.ast( context )] unless rd2_r.empty?\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r refdef_tl:refdef_r? ws_r ',' ws_r '@schema' ws_r schemaname_r ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n context.globalvars[:schemata][schemaname_r.ast( context )] = schema_fieldlist_r.ast( context )\n r = arraysubdefs_schema_ind_r.ast( context )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = r unless refdef_tl.empty?\n res = r\n context.globalvars[:schema].pop\n [ res ]\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r refdef_tl:refdef_r? ws_r ',' ws_r '@schema' ws_r '(' ws_r schema_fieldlist_r ws_r ')' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:schema] << schema_fieldlist_r.ast( context )\n r = arraysubdefs_schema_ind_r.ast( context )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = r unless refdef_tl.empty?\n res = r\n context.globalvars[:schema].pop\n [ res ]\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r refdef_tl:refdef_r? ws_r ',' ws_r '@schema' ws_r schemaname_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_schema_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n \n unless context.globalvars[:schemata][schemaname_r.ast( context )]\n s = \"GDS: undefined schema specifier: \"\n nt = schemaname_r\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast( context )}, 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 context.globalvars[:schema] << context.globalvars[:schemata][schemaname_r.ast( context )]\n r = arraysubdefs_schema_ind_r.ast( context )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = r unless refdef_tl.empty?\n res = r\n context.globalvars[:schema].pop\n [ res ]\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r ':' ws_r rd1_r:refdef_r? ws_r keyvaluedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n hashsubdefs_ind_r \n &{ |s| node_cache[:arraysubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:internreferences][rd1_r.ast( context )] = keyvaluedefs_ind_r.ast( context ) unless rd1_r.empty?\n r = begin [].push( begin [].push( ->(;r){ r={};r.merge!( keyvaluedefs_ind_r.ast( context ) );r.merge!( hashsubdefs_ind_r.ast( context ) ); r }.() ).concat( arraysubdefs_ind_r.ast( context ) ) end ) end\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r ': ' ws_r keydef_r ws_r rd2_r:refdef_r? wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); @indentationLevels << (4+level); end; ok }\n hashsub1_r:hashsubdefs_ind_r? \n &{ |s| node_cache[:hashsubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n hashsub2_r:hashsubdefs_ind_r? \n &{ |s| node_cache[:arraysubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:internreferences][rd2_r.ast( context )] = hashsub1_r.ast( context ) unless rd2_r.empty?\n r = begin [].push( begin [].push( ->(;r){ r={};r.store( keydef_r.ast( context ), hashsub1_r.ast( context ) );r.merge!( hashsub2_r.ast( context ) ); r }.() ).concat( arraysubdefs_ind_r.ast( context ) ) end ) end\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r ',' ws_r ':' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; @indentationLevels << (2+level); end; ok }\n hashsubdefs_ind_r \n &{ |s| node_cache[:arraysubdefs_ind_r].delete( index ); @indentationLevels.pop; true }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = begin [].push( begin [].push( ->(;r){ r={};r.merge!( hashsubdefs_ind_r.ast( context ) ); r }.() ).concat( arraysubdefs_ind_r.ast( context ) ) end ) end\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r rd1_r:refdef_r? ws_r ',' ws_r rd2_r:refdef_r? ws_r valuedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n context.globalvars[:internreferences][rd2_r.ast( context )] = valuedefs_ind_r.ast( context ) unless rd2_r.empty?\n r = []\n r2 = valuedefs_ind_r.ast( context )\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n r2 = arraysubdefs_ind_r.ast( context )\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n context.globalvars[:internreferences][rd1_r.ast( context )] = r unless rd1_r.empty?\n [\n r\n ]\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r refdef_tl:refdef_r? ws_r ',' wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n arraysubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n r = arraysubdefs_ind_r.ast( context )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = r unless refdef_tl.empty?\n [\n r\n ]\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r '@insert' ws_r refuse_ind_r \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl_r+\n {\n def ast( context )\n r = refuse_ind_r.ast( context )\n r\n end\n }\n /\n indentation_r bc_0_l:(bc_0_r*) ws_r refdef_tl:refdef_r? ws_r valuedefs_ind_r \n &{ |s| level = s[0].text_value.length; (@indentationLevels.last + 2 == level) }\n wscommnl_r+\n {\n def ast( context )\n r = valuedefs_ind_r.ast( context )\n context.globalvars[:internreferences][refdef_tl.ast( context )] = r unless refdef_tl.empty?\n r\n end\n }\n end\n\n rule arraysubdefs_schema_ind_r\n ( \n &{ |s| save = index; i = _nt_indentation_r; level = i.text_value.length; index = save; ok = (level == (2 + @indentationLevels.last)); ok }\n arraysubdef_schema_ind_r '' \n )*\n {\n def ast( context )\n r = []\n elements.each do |e|\n e1 = e.arraysubdef_schema_ind_r.ast( context )\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_r\n indentation_r rd1_r:refdef_r? ws_r ': ' ws_r rd2_r:refdef_r? ws_r schemavaluedefs_ind_r wscommnl_r+ \n &{ |s| level = s[0].text_value.length; ok = (@indentationLevels.last + 2 == level); if(ok); @indentationLevels << level; end; ok }\n hashsubdefs_ind_r \n &{ |s| @indentationLevels.pop; true }\n wscommnl_r*\n {\n def ast( context )\n \n if schemavaluedefs_ind_r.ast( context ).length > context.globalvars[:schema].last.length\n s = \"GDS: too many values for schema definition: \"\n nt = schemavaluedefs_ind_r\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_r.ast( context ).each_with_index.map do |e,i|\n (e.is_a?(Hash) && e[:valuedirective]==:@na) ? ({}) : (Hash[ context.globalvars[:schema].last[i], e ])\n end.inject({}){ |res,e| res.merge!(e) }\n context.globalvars[:internreferences][rd1_r.ast( context )] = result unless rd1_r.empty?\n context.globalvars[:internreferences][rd2_r.ast( context )] = r1 unless rd2_r.empty?\n result.merge!( r1 ).merge!( hashsubdefs_ind_r.ast( context ) )\n \n end\n }\n /\n arraysubdef_ind_r ''\n {\n def ast( context )\n arraysubdef_ind_r.ast( context )\n end\n }\n end\n\n rule schemavaluedefs_ind_r\n schemavaluedef_ind_r ws_r '|' ws_r schemavaluedefs_ind_r \n {\n def ast( context )\n r = []\n r << schemavaluedef_ind_r.ast( context )\n r2 = schemavaluedefs_ind_r.ast( context )\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n r\n end\n }\n /\n schemavaluedef_ind_r '' \n {\n def ast( context )\n r = []\n r << schemavaluedef_ind_r.ast( context )\n r\n end\n }\n end\n\n rule schemavaluedef_ind_r\n value_directive_ind_r ''\n {\n def ast( context )\n value_directive_ind_r.ast( context )\n end\n }\n /\n valuedef_ind_r ''\n {\n def ast( context )\n valuedef_ind_r.ast( context )\n end\n }\n end\n\n rule refdef_r\n '&' identifier_r \n {\n def ast( context )\n r = identifier_r.ast( context )\n r\n end\n }\n end\n\n rule keyvaluedefs_ind_r\n keyvaluedef_ind_r ws_r '|' ws_r keyvaluedefs_ind_r \n {\n def ast( context )\n r = {}\n r.merge!( keyvaluedef_ind_r.ast( context ) )\n r.merge!( keyvaluedefs_ind_r.ast( context ) )\n r\n end\n }\n /\n keyvaluedef_ind_r ''\n {\n def ast( context )\n keyvaluedef_ind_r.ast( context )\n end\n }\n end\n\n rule keyvaluedef_ind_r\n keydef_r wsc_l:(wsc_r+) valuedef_ind_r \n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), valuedef_ind_r.ast( context ) ] )\n r\n end\n }\n end\n\n rule valuedef_ind_r\n variable_val_ind_r ''\n {\n def ast( context )\n variable_val_ind_r.ast( context )\n end\n }\n /\n refuse_ind_r ''\n {\n def ast( context )\n refuse_ind_r.ast( context )\n end\n }\n /\n valuedef_gen_ind_r ''\n {\n def ast( context )\n valuedef_gen_ind_r.ast( context )\n end\n }\n /\n special_value_ind_r ''\n {\n def ast( context )\n special_value_ind_r.ast( context )\n end\n }\n /\n string_no_leading_space_r ''\n {\n def ast( context )\n string_no_leading_space_r.ast( context )\n end\n }\n end\n\n rule keyvaluedef_r\n keydef_r ':' wscommnl2_r valuedef_r \n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), valuedef_r.ast( context ) ] )\n r\n end\n }\n /\n wscommnl2_r ':' keydef_r wscommnl2_r '=>' wscommnl2_r valuedef_r \n {\n def ast( context )\n r = {}\n r.merge!( Hash[ keydef_r.ast( context ), valuedef_r.ast( context ) ] )\n r\n end\n }\n end\n\n rule valuedefs_ind_r\n valuedef_ind_r ws_r '|' ws_r valuedefs_ind_r \n {\n def ast( context )\n r = []\n r << valuedef_ind_r.ast( context )\n r2 = valuedefs_ind_r.ast( context )\n if r2.is_a?(Array); r.concat( r2 ); else r << r2; end\n r\n end\n }\n /\n valuedef_ind_r '' \n {\n def ast( context )\n r = []\n r << valuedef_ind_r.ast( context )\n r\n end\n }\n end\n\n rule valuedef_r\n variable_val_r ''\n {\n def ast( context )\n variable_val_r.ast( context )\n end\n }\n /\n valuedef_gen_r ''\n {\n def ast( context )\n valuedef_gen_r.ast( context )\n end\n }\n /\n special_value_r ''\n {\n def ast( context )\n special_value_r.ast( context )\n end\n }\n end\n\n rule valuedef_gen_r\n number_float_r ''\n {\n def ast( context )\n number_float_r.ast( context )\n end\n }\n /\n number_int_r ''\n {\n def ast( context )\n number_int_r.ast( context )\n end\n }\n /\n rubysymbol_r ''\n {\n def ast( context )\n rubysymbol_r.ast( context )\n end\n }\n /\n string_with_quotes_r ''\n {\n def ast( context )\n string_with_quotes_r.ast( context )\n end\n }\n end\n\n rule valuedef_gen_ind_r\n ruby_eval_r ''\n {\n def ast( context )\n ruby_eval_r.ast( context )\n end\n }\n /\n number_float_r ''\n {\n def ast( context )\n number_float_r.ast( context )\n end\n }\n /\n number_int_r ''\n {\n def ast( context )\n number_int_r.ast( context )\n end\n }\n /\n rubysymbol_ind_r ''\n {\n def ast( context )\n rubysymbol_ind_r.ast( context )\n end\n }\n /\n string_with_quotes_r ''\n {\n def ast( context )\n string_with_quotes_r.ast( context )\n end\n }\n end\n\n rule special_value_r\n 'nil' \n {\n def ast( context )\n nil\n end\n }\n /\n 'true' \n {\n def ast( context )\n true\n end\n }\n /\n 'false' \n {\n def ast( context )\n false\n end\n }\n end\n\n rule special_value_ind_r\n '!nil' \n {\n def ast( context )\n nil\n end\n }\n /\n '@nil' \n {\n def ast( context )\n nil\n end\n }\n /\n '!true' \n {\n def ast( context )\n true\n end\n }\n /\n '@true' \n {\n def ast( context )\n true\n end\n }\n /\n '!false' \n {\n def ast( context )\n false\n end\n }\n /\n '@false' \n {\n def ast( context )\n false\n end\n }\n end\n\n rule value_directive_ind_r\n '@na' \n {\n def ast( context )\n r = {}\n r.merge!( Hash[ :valuedirective, :@na ] )\n r\n end\n }\n end\n\n rule string_with_quotes_r\n string_with_doublequotes_r ''\n {\n def ast( context )\n string_with_doublequotes_r.ast( context )\n end\n }\n /\n string_with_singlequotes_r ''\n {\n def ast( context )\n string_with_singlequotes_r.ast( context )\n end\n }\n end\n\n rule string_with_doublequotes_r\n '\"' string_double_q_r '\"'\n {\n def ast( context )\n string_double_q_r.ast( context )\n end\n }\n end\n\n rule string_double_q_r\n ('\\\\\\\\' / '\\\"' / !'\"' .)* \n {\n def ast( context )\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 context.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 context.globalvars[:gdsglobvars][key].to_s }.gsub(/\\\\\\$/, \"$\" )\n \n end\n }\n end\n\n rule string_with_singlequotes_r\n '\\'' string_single_q_r '\\''\n {\n def ast( context )\n string_single_q_r.ast( context )\n end\n }\n end\n\n rule string_single_q_r\n ('\\\\\\\\' / '\\\\\\'' / !'\\'' .)* \n {\n def ast( context )\n r = text_value\n r.gsub(/(\\\\\\\\)|(\\\\n)|(\\\\')/, '\\\\\\\\'=>'\\\\', \"\\\\n\"=>\"\\n\", \"\\\\'\"=>\"'\")\n end\n }\n end\n\n rule string_no_leading_space_r\n (&\"$(\" / ( !\"$\" !';' !'!' !'@' !'&' !'*' !' ' !':' !',' !\"|\" !'#' !'/*')) (!\"\\n\" !\"|\" !'#' !'/*' .)+ \n {\n def ast( context )\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 context.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 context.globalvars[:gdsglobvars][key].to_s }.gsub(/\\\\\\$/, \"$\" )\n \n end\n }\n end\n\n rule keydef_r\n string_with_quotes_r '' \n {\n def ast( context )\n string_with_quotes_r.ast( context ).to_sym \n end\n }\n /\n identifier_r ''\n {\n def ast( context )\n identifier_r.ast( context )\n end\n }\n end\n\n rule variable_val_r\n wscommnl2_r '$' varname_r \n {\n def ast( context )\n \n unless context.globalvars[:gdsglobvars].key?(varname_r.ast( context ))\n s = \"GDS: undefined variable: \"\n nt = varname_r\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast( context )}, 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 context.globalvars[:gdsglobvars][varname_r.ast( context )]\n \n end\n }\n end\n\n rule variable_val_ind_r\n '$' varname_r \n {\n def ast( context )\n \n unless context.globalvars[:gdsglobvars].key?(varname_r.ast( context ))\n s = \"GDS: undefined variable: \"\n nt = varname_r\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast( context )}, 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 context.globalvars[:gdsglobvars][varname_r.ast( context )]\n \n end\n }\n end\n\n rule refuse_ind_r\n '*' identifier_r \n {\n def ast( context )\n \n unless context.globalvars[:internreferences][identifier_r.ast( context )]\n s = \"GDS: undefined reference: \"\n nt = identifier_r\n lines = nt.input[0..nt.interval.begin].lines\n lineOfFailure = lines.size\n columnOfFailure = lines.last.size\n s += \"\#{nt.ast( context )}, 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 context.globalvars[:internreferences][identifier_r.ast( context )]\n \n end\n }\n end\n\n rule number_int_r\n octal_int_r ''\n {\n def ast( context )\n octal_int_r.ast( context )\n end\n }\n /\n binary_int_r ''\n {\n def ast( context )\n binary_int_r.ast( context )\n end\n }\n /\n hexa_int_r ''\n {\n def ast( context )\n hexa_int_r.ast( context )\n end\n }\n /\n decimal_int_r ''\n {\n def ast( context )\n decimal_int_r.ast( context )\n end\n }\n end\n\n rule octal_int_r\n ('-'/'+')? ( '0o' / '0' ) [0-7] ( [0-7] / '_' [0-7] )* \n {\n def ast( context )\n r = text_value\n r.to_i(8)\n end\n }\n end\n\n rule binary_int_r\n ('-'/'+')? '0b' [01] ( [01] / '_' [01] )* \n {\n def ast( context )\n r = text_value\n r.to_i(2)\n end\n }\n end\n\n rule hexa_int_r\n ('-'/'+')? '0x' [0-9a-fA-F] ( [0-9a-fA-F] / '_' [0-9a-fA-F] )* \n {\n def ast( context )\n r = text_value\n r.to_i(16)\n end\n }\n end\n\n rule decimal_int_r\n ('-'/'+')? ('0d')? [1-9] ( [0-9] / '_' [0-9] )* \n {\n def ast( context )\n text_value.to_i\n end\n }\n /\n ('0d')? [0] \n {\n def ast( context )\n text_value.to_i\n end\n }\n end\n\n rule number_float_r\n [+-]? ( [0-9] / '_' [0-9] )* [.] [0-9] ( [0-9] / '_' [0-9] )* (('e'/'E') [+-]? [0-9] ( [0-9] / '_' [0-9] )* )? \n {\n def ast( context )\n text_value.to_f\n end\n }\n end\n\n rule rubysymbol_r\n wscommnl2_r ':' rubysymbolcontent_r \n {\n def ast( context )\n r = rubysymbolcontent_r.ast( context )\n r\n end\n }\n end\n\n rule rubysymbolcontent_r\n wscommnl2_r '\"' rubysymbol_in_double_quotes_r '\"' \n {\n def ast( context )\n r = rubysymbol_in_double_quotes_r.ast( context )\n r\n end\n }\n /\n wscommnl2_r '\\'' rubysymbol_in_single_quotes_r '\\'' \n {\n def ast( context )\n r = rubysymbol_in_single_quotes_r.ast( context )\n r\n end\n }\n /\n ( !\"'\" !'\"' !'}' !' ' !',' !']' !'#' !'/*' !'*/' !\"\\n\" .)+\n {\n def ast( context )\n text_value.to_sym\n end\n }\n end\n\n rule rubysymbol_ind_r\n ':' rubysymbolcontent_ind_r \n {\n def ast( context )\n r = rubysymbolcontent_ind_r.ast( context )\n r\n end\n }\n end\n\n rule rubysymbolcontent_ind_r\n '\"' rubysymbol_in_double_quotes_r '\"' \n {\n def ast( context )\n r = rubysymbol_in_double_quotes_r.ast( context )\n r\n end\n }\n /\n '\\'' rubysymbol_in_single_quotes_r '\\'' \n {\n def ast( context )\n r = rubysymbol_in_single_quotes_r.ast( context )\n r\n end\n }\n /\n (!\"'\" !'\"' !' ' !'|' !'#' !'/*' !'*/' !\"\\n\" .)+\n {\n def ast( context )\n text_value.to_sym\n end\n }\n end\n\n rule rubysymbol_in_double_quotes_r\n ('\\\\\\\\' / '\\\\\"' / !'\"' !\"\\n\" .)* \n {\n def ast( context )\n r = text_value\n r.gsub(/(\\\\\\\\)|(\\\\\")/, '\\\\\\\\'=>'\\\\', '\\\\\"'=>'\"').to_sym\n end\n }\n end\n\n rule rubysymbol_in_single_quotes_r\n ('\\\\\\\\' / '\\\\\\'' / !'\\'' !\"\\n\" .)* \n {\n def ast( context )\n r = text_value\n r.gsub(/(\\\\\\\\)|(\\\\')/, '\\\\\\\\'=>'\\\\', \"\\\\'\"=>\"'\").to_sym\n end\n }\n end\n\n rule ruby_eval_r\n '@r' ws_r evalexpr_r \n {\n def ast( context )\n context.config[:context] ? (eval(evalexpr_r.ast( context ), context.config[:context])) : nil \n end\n }\n /\n '@env' ws_r '(' ws_r envvar_r ws_r ',' ws_r string_with_quotes_r ws_r ')' \n {\n def ast( context )\n context.config[:allow_env] ? ( (res=eval(\"ENV['\#{envvar_r.ast( context ).strip}']\")) ? res : string_with_quotes_r.ast( context ) ) : string_with_quotes_r.ast( context ) \n end\n }\n /\n '@env' ws_r evalexpr_r \n {\n def ast( context )\n context.config[:allow_env] ? (eval(\"ENV['\#{evalexpr_r.ast( context ).strip}']\")) : nil \n end\n }\n end\n\n rule envvar_r\n identifier_r '' \n {\n def ast( context )\n text_value\n end\n }\n end\n\n rule evalexpr_r\n evalexpr_0_with_nesting_r ''\n {\n def ast( context )\n evalexpr_0_with_nesting_r.ast( context )\n end\n }\n end\n\n rule evalexpr_0_with_nesting_r\n &{ |s| @evalexpr_0_with_nestingLevel = 0; true }\n '(' evalexpr_0_with_nesting_sub_r ')'\n {\n def ast( context )\n evalexpr_0_with_nesting_sub_r.ast( context )\n end\n }\n end\n\n rule evalexpr_0_with_nesting_sub_r\n '(' \n &{ |s| @evalexpr_0_with_nestingLevel += 1; true }\n evalexpr_0_with_nesting_sub_r\n {\n def ast( context )\n '(' + evalexpr_0_with_nesting_sub_r.ast( context )\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_r\n {\n def ast( context )\n ')' + evalexpr_0_with_nesting_sub_r.ast( context )\n end\n }\n /\n ( !\"(\" !\")\" . )+ evalexpr_0_with_nesting_sub_r\n {\n def ast( context )\n text_value\n end\n }\n /\n ''\n {\n def ast( context )\n ''\n end\n }\n end\n\n rule evalexpr_0_with_nesting_onechar_r\n ( !\")\" . )\n {\n def ast( context )\n text_value\n end\n }\n end\n\n rule bc_0_r\n &{ |s| @bc_0Level = 0; true }\n '/*' bc_0_sub_r '*/'\n {\n def ast( context )\n \"/*\" + bc_0_sub_r.ast( context ) + \"*/\"\n end\n }\n end\n\n rule bc_0_sub_r\n '/*' \n &{ |s| @bc_0Level += 1; true }\n bc_0_sub_r\n {\n def ast( context )\n '/*' + bc_0_sub_r.ast( context )\n end\n }\n /\n '*/' \n &{ |s| ok = (@bc_0Level > 0); ok } \n &{ |s| @bc_0Level -= 1; true }\n bc_0_sub_r\n {\n def ast( context )\n '*/' + bc_0_sub_r.ast( context )\n end\n }\n /\n ( !\"/*\" !\"*/\" . )+ bc_0_sub_r\n {\n def ast( context )\n text_value\n end\n }\n /\n ''\n {\n def ast( context )\n ''\n end\n }\n end\n\n rule bc_0_onechar_r\n ( !\"*/\" . )\n {\n def ast( context )\n text_value\n end\n }\n end\n\n rule wsc_r\n [ \\t] \n {\n }\n /\n bc_0_r '' \n {\n }\n end\n\n rule identifier_r\n ([a-zA-Z_] [a-zA-Z0-9_]*)\n {\n def ast( context )\n text_value.to_sym\n end\n }\n end\n\n rule identifierstr_r\n ([a-zA-Z_] [a-zA-Z0-9_]*)\n {\n def ast( context )\n text_value\n end\n }\n end\n\n rule string_no_space_r\n [a-zA-Z0-9_/.:]+\n {\n def ast( context )\n text_value\n end\n }\n end\n\n rule indentation_r\n ' '*\n end\n\n rule ws_r\n wsc_r*\n end\n\n rule icomm_r\n '#' \n end\n\n rule wscommnl_r\n ws_r ( icomm_r ( !\"\\n\" . )* )? \"\\n\"\n end\n\n rule wscommnl2_r\n ( icomm_r ( !\"\\n\" . )* \"\\n\" / \"\\n\" / wsc_r )*\n end\n\nend\n"
41
41
 
42
42
  end
43
43
  end
@@ -1,4 +1,4 @@
1
1
 
2
2
  class GDstruct
3
- VERSION = '0.9.3'.freeze
3
+ VERSION = '0.9.4'.freeze
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gdstruct
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 0.9.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Uli Ramminger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-04-30 00:00:00.000000000 Z
11
+ date: 2025-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: treetop
@@ -36,28 +36,28 @@ dependencies:
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '12'
39
+ version: '13'
40
40
  type: :development
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: '12'
46
+ version: '13'
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: minitest
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '5.1'
53
+ version: '5'
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '5.1'
60
+ version: '5'
61
61
  description: "gdstruct - GDS (General Data Structure), a universal, composable data
62
62
  structure, used to store any kind of data. \nTypical usage is the definition of
63
63
  configurations, specifications and data sets. \nThe GDS language is a special DSL
@@ -95,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  requirements: []
98
- rubygems_version: 3.1.6
98
+ rubygems_version: 3.5.16
99
99
  signing_key:
100
100
  specification_version: 4
101
101
  summary: gdstruct - GDS (General Data Structure), a universal, composable data structure,