occam-grammars 1.3.3 → 1.3.7
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.
- package/example.js +2 -2
- package/lib/furtle/bnf.js +2 -2
- package/package.json +1 -1
- package/src/furtle/bnf.js +18 -16
package/lib/furtle/bnf.js
CHANGED
|
@@ -8,7 +8,7 @@ Object.defineProperty(exports, "default", {
|
|
|
8
8
|
return _default;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
-
var bnf = 'document ::= ( instruction | error )+ ;\n\n\n\ninstruction ::= functionDeclaration\n \n | variablesDeclaration\n \n | variableAssignment \n \n | objectAssignment \n \n | arrayAssignment\n \n | conditionalBlock\n\n | forEachLoop \n \n ;\n\n\n\nfunctionDeclaration ::= [type] function ;\n\nvariablesDeclaration ::= [type]
|
|
11
|
+
var bnf = 'document ::= ( instruction | error )+ ;\n\n\n\ninstruction ::= functionDeclaration\n \n | variablesDeclaration\n \n | variableAssignment \n \n | objectAssignment \n \n | arrayAssignment\n \n | conditionalBlock\n\n | forEachLoop \n \n ;\n\n\n\nfunctionDeclaration ::= [type] function ;\n\nvariablesDeclaration ::= [type] variable assignment? ( "," variable assignment? )* ";" ;\n\nvariableAssignment ::= variable assignment ";" ;\n\nobjectAssignment ::= "{" \n\n [type]? variable ( "," [type]? variable )* \n \n "}" "=" variable ";" ;\n\narrayAssignment ::= "[" \n\n ( \n\n ( "_" ( "," "_" )* ( "," [type]? variable )+ ) \n \n | \n \n ( [type]? variable ( "," [type]? variable )* ) \n \n ) \n \n "]" "=" variable ";" ;\n\nconditionalBlock ::= "If" "(" condition ")" block ( "Else" block )? ; \n\nforEachLoop ::= "ForEach"<NO_WHITESPACE>"(" variable "," anonymousFunction ")" ";" ;\n\n\n \nassignment ::= "=" ( functionCall | nodesQuery | nodeQuery | value ) ;\n \n \n \nblock ::= "{" ( variablesDeclaration |\n\n variableAssignment | \n \n objectAssignment | \n \n arrayAssignment |\n \n conditionalBlock |\n\n forEachLoop )* "}" ;\n\n\n\n\nfunctionCall ::= [name]<NO_WHITESPACE>"(" ( value ( "," value )* )? ")" ;\n\nfunction ::= [name]<NO_WHITESPACE>"(" ( argument ( "," argument )* )? ")" body ;\n\nanonymousFunction ::= "(" ( argument ( "," argument )* )? ")" body ;\n\n\n\nnodesQuery ::= "nodesQuery"<NO_WHITESPACE>"(" variable "," expression ")" ;\n\nnodeQuery ::= "nodeQuery"<NO_WHITESPACE>"(" variable "," expression ")" ;\n\n\n\n\ncondition ::= "(" condition ")" \n\n | condition ( "||" | "&&" ) condition \n\n | value ( ( "!=" | "==" ) value )? \n \n ;\n\n\n\nbody ::= "{" ( variablesDeclaration | \n \n variableAssignment | \n \n objectAssignment | \n \n arrayAssignment |\n \n conditionalBlock |\n\n forEachLoop )* return? "}" ;\n \n \n\nreturn ::= "Return" value ";" ; \n\n\n\nvalue ::= variable | [number] | [primitive] | [string-literal] ;\n\n\n\nargument ::= [type] variable ;\n\n\n\nvariable ::= [name] ;\n\n\n\nexpression ::= path spread? subExpression? ;\n\npath ::= "/" infiniteDescent? selectors ;\n\nsubExpression ::= path spread? subExpression?;\n\ninfiniteDescent ::= "/" ;\n\nselectors ::= selector ( "|" selector )* ;\n\nspread ::= unique\n\n | "[" \n \n ( \n \n ( startIndex "..." endIndex ) \n \n | \n \n ( startIndex "..." ) \n \n | \n \n ( "..." endIndex )\n \n | \n \n index \n \n ) \n \n "]" ;\n\nselector ::= ruleName | tokenType ;\n \nruleName ::= [name] | "*" ;\n \ntokenType ::= "@"<NO_WHITESPACE>( [name] | "*" ) ;\n \nstartIndex ::= [number] ;\n \nendIndex ::= [number] ;\n \nindex ::= [number] ;\n \nunique ::= "!" ;\n \n\n\nerror. ::= . ;';
|
|
12
12
|
var _default = bnf;
|
|
13
13
|
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9mdXJ0bGUvYm5mLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5jb25zdCBibmYgPSBgZG9jdW1lbnQgICAgICAgICAgICAgIDo6PSAgKCBpbnN0cnVjdGlvbiB8IGVycm9yICkrIDtcblxuXG5cbmluc3RydWN0aW9uICAgICAgICAgICA6Oj0gIGZ1bmN0aW9uRGVjbGFyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfCAgdmFyaWFibGVzRGVjbGFyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfCAgdmFyaWFibGVBc3NpZ25tZW50IFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB8ICBvYmplY3RBc3NpZ25tZW50IFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB8ICBhcnJheUFzc2lnbm1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfCAgY29uZGl0aW9uYWxCbG9ja1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB8ICBmb3JFYWNoTG9vcCBcbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA7XG5cblxuXG5mdW5jdGlvbkRlY2xhcmF0aW9uICAgOjo9ICBbdHlwZV0gZnVuY3Rpb24gO1xuXG52YXJpYWJsZXNEZWNsYXJhdGlvbiAgOjo9ICBbdHlwZV0gdmFyaWFibGUgYXNzaWdubWVudD8gKCBcIixcIiB2YXJpYWJsZSBhc3NpZ25tZW50PyApKiBcIjtcIiA7XG5cbnZhcmlhYmxlQXNzaWdubWVudCAgICA6Oj0gIHZhcmlhYmxlIGFzc2lnbm1lbnQgXCI7XCIgO1xuXG5vYmplY3RBc3NpZ25tZW50ICAgICAgOjo9ICBcIntcIiBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPyB2YXJpYWJsZSAoIFwiLFwiIFt0eXBlXT8gdmFyaWFibGUgKSogXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwifVwiIFwiPVwiIHZhcmlhYmxlIFwiO1wiIDtcblxuYXJyYXlBc3NpZ25tZW50ICAgICAgIDo6PSAgXCJbXCIgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICggXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBcIl9cIiAoIFwiLFwiIFwiX1wiICkqICggXCIsXCIgW3R5cGVdPyB2YXJpYWJsZSApKyApIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBbdHlwZV0/IHZhcmlhYmxlICggXCIsXCIgW3R5cGVdPyB2YXJpYWJsZSApKiApIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJdXCIgXCI9XCIgdmFyaWFibGUgXCI7XCIgO1xuXG5jb25kaXRpb25hbEJsb2NrICAgICAgOjo9ICBcIklmXCIgXCIoXCIgY29uZGl0aW9uIFwiKVwiIGJsb2NrICggXCJFbHNlXCIgYmxvY2sgKT8gOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbmZvckVhY2hMb29wICAgICAgICAgICA6Oj0gIFwiRm9yRWFjaFwiPE5PX1dISVRFU1BBQ0U+XCIoXCIgdmFyaWFibGUgXCIsXCIgYW5vbnltb3VzRnVuY3Rpb24gXCIpXCIgXCI7XCIgO1xuXG5cbiAgICAgICAgICAgICBcbmFzc2lnbm1lbnQgICAgICAgICAgICA6Oj0gIFwiPVwiICggZnVuY3Rpb25DYWxsIHwgbm9kZXNRdWVyeSB8IG5vZGVRdWVyeSB8IHZhbHVlICkgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuYmxvY2sgICAgICAgICAgICAgICAgIDo6PSAgXCJ7XCIgKCB2YXJpYWJsZXNEZWNsYXJhdGlvbiB8XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlQXNzaWdubWVudCB8IFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RBc3NpZ25tZW50IHwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5QXNzaWdubWVudCB8XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsQmxvY2sgfFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JFYWNoTG9vcCApKiBcIn1cIiA7XG5cblxuXG5cbmZ1bmN0aW9uQ2FsbCAgICAgICAgICA6Oj0gIFtuYW1lXTxOT19XSElURVNQQUNFPlwiKFwiICggdmFsdWUgKCBcIixcIiB2YWx1ZSApKiApPyBcIilcIiA7XG5cbmZ1bmN0aW9uICAgICAgICAgICAgICA6Oj0gIFtuYW1lXTxOT19XSElURVNQQUNFPlwiKFwiICggYXJndW1lbnQgKCBcIixcIiBhcmd1bWVudCApKiApPyBcIilcIiBib2R5IDtcblxuYW5vbnltb3VzRnVuY3Rpb24gICAgIDo6PSAgXCIoXCIgKCBhcmd1bWVudCAoIFwiLFwiIGFyZ3VtZW50ICkqICk/IFwiKVwiIGJvZHkgO1xuXG5cblxubm9kZXNRdWVyeSAgICAgICAgICAgIDo6PSAgXCJub2Rlc1F1ZXJ5XCI8Tk9fV0hJVEVTUEFDRT5cIihcIiB2YXJpYWJsZSBcIixcIiBleHByZXNzaW9uIFwiKVwiIDtcblxubm9kZVF1ZXJ5ICAgICAgICAgICAgIDo6PSAgXCJub2RlUXVlcnlcIjxOT19XSElURVNQQUNFPlwiKFwiIHZhcmlhYmxlIFwiLFwiIGV4cHJlc3Npb24gXCIpXCIgO1xuXG5cblxuXG5jb25kaXRpb24gICAgICAgICAgICAgOjo9ICBcIihcIiBjb25kaXRpb24gXCIpXCIgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHwgIGNvbmRpdGlvbiAoIFwifHxcIiB8IFwiJiZcIiApIGNvbmRpdGlvbiBcblxuICAgICAgICAgICAgICAgICAgICAgICAgfCAgdmFsdWUgKCAoIFwiIT1cIiB8IFwiPT1cIiApIHZhbHVlICk/IFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA7XG5cblxuXG5ib2R5ICAgICAgICAgICAgICAgICAgOjo9ICBcIntcIiAoIHZhcmlhYmxlc0RlY2xhcmF0aW9uIHwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlQXNzaWdubWVudCB8IFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RBc3NpZ25tZW50IHwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5QXNzaWdubWVudCB8XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsQmxvY2sgfFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JFYWNoTG9vcCApKiByZXR1cm4/IFwifVwiIDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbnJldHVybiAgICAgICAgICAgICAgICA6Oj0gIFwiUmV0dXJuXCIgdmFsdWUgXCI7XCIgOyBcblxuXG5cbnZhbHVlICAgICAgICAgICAgICAgICA6Oj0gIHZhcmlhYmxlIHwgW251bWJlcl0gfCBbcHJpbWl0aXZlXSB8IFtzdHJpbmctbGl0ZXJhbF0gO1xuXG5cblxuYXJndW1lbnQgICAgICAgICAgICAgIDo6PSAgW3R5cGVdIHZhcmlhYmxlIDtcblxuXG5cbnZhcmlhYmxlICAgICAgICAgICAgICA6Oj0gIFtuYW1lXSA7XG5cblxuXG5leHByZXNzaW9uICAgICAgICAgICAgOjo9ICBwYXRoIHNwcmVhZD8gc3ViRXhwcmVzc2lvbj8gO1xuXG5wYXRoICAgICAgICAgICAgICAgICAgOjo9ICBcIi9cIiBpbmZpbml0ZURlc2NlbnQ/IHNlbGVjdG9ycyA7XG5cbnN1YkV4cHJlc3Npb24gICAgICAgICA6Oj0gIHBhdGggc3ByZWFkPyBzdWJFeHByZXNzaW9uPztcblxuaW5maW5pdGVEZXNjZW50ICAgICAgIDo6PSAgXCIvXCIgO1xuXG5zZWxlY3RvcnMgICAgICAgICAgICAgOjo9ICBzZWxlY3RvciAoIFwifFwiIHNlbGVjdG9yICkqIDtcblxuc3ByZWFkICAgICAgICAgICAgICAgIDo6PSAgdW5pcXVlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHwgIFwiW1wiIFxuICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAoIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICggc3RhcnRJbmRleCBcIi4uLlwiIGVuZEluZGV4ICkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHN0YXJ0SW5kZXggXCIuLi5cIiApIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBcIi4uLlwiIGVuZEluZGV4IClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcIl1cIiA7XG5cbnNlbGVjdG9yICAgICAgICAgICAgICA6Oj0gIHJ1bGVOYW1lIHwgdG9rZW5UeXBlIDtcbiAgICAgICAgICAgICAgICAgICBcbnJ1bGVOYW1lICAgICAgICAgICAgICA6Oj0gIFtuYW1lXSB8IFwiKlwiIDtcbiAgICAgICAgICAgICAgICAgICBcbnRva2VuVHlwZSAgICAgICAgICAgICA6Oj0gIFwiQFwiPE5PX1dISVRFU1BBQ0U+KCBbbmFtZV0gfCBcIipcIiApIDtcbiAgICAgICAgICAgICAgICAgICBcbnN0YXJ0SW5kZXggICAgICAgICAgICA6Oj0gIFtudW1iZXJdIDtcbiAgICAgICAgICAgICAgICAgICBcbmVuZEluZGV4ICAgICAgICAgICAgICA6Oj0gIFtudW1iZXJdIDtcbiAgICAgICAgICAgICAgICAgICBcbmluZGV4ICAgICAgICAgICAgICAgICA6Oj0gIFtudW1iZXJdIDtcbiAgICAgICAgICAgICAgICAgICBcbnVuaXF1ZSAgICAgICAgICAgICAgICA6Oj0gIFwiIVwiIDtcbiAgICAgICAgICAgICAgICAgICBcblxuXG5lcnJvci4gICAgICAgICAgICAgICAgOjo9ICAuIDtgO1xuXG5leHBvcnQgZGVmYXVsdCBibmY7XG4iXSwibmFtZXMiOlsiYm5mIl0sIm1hcHBpbmdzIjoiQUFBQTs7OzsrQkFzTEE7OztlQUFBOzs7QUFwTEEsSUFBTUEsTUFBTztJQW9MYixXQUFlQSJ9
|
package/package.json
CHANGED
package/src/furtle/bnf.js
CHANGED
|
@@ -24,37 +24,37 @@ instruction ::= functionDeclaration
|
|
|
24
24
|
|
|
25
25
|
functionDeclaration ::= [type] function ;
|
|
26
26
|
|
|
27
|
-
variablesDeclaration ::= [type]
|
|
27
|
+
variablesDeclaration ::= [type] variable assignment? ( "," variable assignment? )* ";" ;
|
|
28
28
|
|
|
29
|
-
variableAssignment ::=
|
|
29
|
+
variableAssignment ::= variable assignment ";" ;
|
|
30
30
|
|
|
31
31
|
objectAssignment ::= "{"
|
|
32
32
|
|
|
33
|
-
[type]?
|
|
33
|
+
[type]? variable ( "," [type]? variable )*
|
|
34
34
|
|
|
35
|
-
"}" "="
|
|
35
|
+
"}" "=" variable ";" ;
|
|
36
36
|
|
|
37
37
|
arrayAssignment ::= "["
|
|
38
38
|
|
|
39
39
|
(
|
|
40
40
|
|
|
41
|
-
( "_" ( "," "_" )* ( "," [type]?
|
|
41
|
+
( "_" ( "," "_" )* ( "," [type]? variable )+ )
|
|
42
42
|
|
|
43
43
|
|
|
|
44
44
|
|
|
45
|
-
( [type]?
|
|
45
|
+
( [type]? variable ( "," [type]? variable )* )
|
|
46
46
|
|
|
47
47
|
)
|
|
48
48
|
|
|
49
|
-
"]" "="
|
|
49
|
+
"]" "=" variable ";" ;
|
|
50
50
|
|
|
51
51
|
conditionalBlock ::= "If" "(" condition ")" block ( "Else" block )? ;
|
|
52
52
|
|
|
53
|
-
forEachLoop ::= "ForEach"<NO_WHITESPACE>"("
|
|
53
|
+
forEachLoop ::= "ForEach"<NO_WHITESPACE>"(" variable "," anonymousFunction ")" ";" ;
|
|
54
54
|
|
|
55
55
|
|
|
56
56
|
|
|
57
|
-
assignment ::= "=" ( functionCall |
|
|
57
|
+
assignment ::= "=" ( functionCall | nodesQuery | nodeQuery | value ) ;
|
|
58
58
|
|
|
59
59
|
|
|
60
60
|
|
|
@@ -73,7 +73,7 @@ block ::= "{" ( variablesDeclaration |
|
|
|
73
73
|
|
|
74
74
|
|
|
75
75
|
|
|
76
|
-
functionCall ::= [name]<NO_WHITESPACE>"(" (
|
|
76
|
+
functionCall ::= [name]<NO_WHITESPACE>"(" ( value ( "," value )* )? ")" ;
|
|
77
77
|
|
|
78
78
|
function ::= [name]<NO_WHITESPACE>"(" ( argument ( "," argument )* )? ")" body ;
|
|
79
79
|
|
|
@@ -81,11 +81,9 @@ anonymousFunction ::= "(" ( argument ( "," argument )* )? ")" body ;
|
|
|
81
81
|
|
|
82
82
|
|
|
83
83
|
|
|
84
|
-
|
|
84
|
+
nodesQuery ::= "nodesQuery"<NO_WHITESPACE>"(" variable "," expression ")" ;
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
nodeQuery ::= "nodeQuery"<NO_WHITESPACE>"(" [name] "," expression ")" ;
|
|
86
|
+
nodeQuery ::= "nodeQuery"<NO_WHITESPACE>"(" variable "," expression ")" ;
|
|
89
87
|
|
|
90
88
|
|
|
91
89
|
|
|
@@ -118,11 +116,15 @@ return ::= "Return" value ";" ;
|
|
|
118
116
|
|
|
119
117
|
|
|
120
118
|
|
|
121
|
-
value ::=
|
|
119
|
+
value ::= variable | [number] | [primitive] | [string-literal] ;
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
argument ::= [type] variable ;
|
|
122
124
|
|
|
123
125
|
|
|
124
126
|
|
|
125
|
-
|
|
127
|
+
variable ::= [name] ;
|
|
126
128
|
|
|
127
129
|
|
|
128
130
|
|