@sap/cds-compiler 6.7.3 → 6.9.0
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/CHANGELOG.md +70 -0
- package/README.md +4 -0
- package/bin/cdsc.js +5 -5
- package/bin/cdshi.js +1 -0
- package/bin/cdsse.js +1 -1
- package/lib/api/main.js +17 -9
- package/lib/api/options.js +5 -2
- package/lib/api/validate.js +1 -1
- package/lib/base/builtins.js +13 -9
- package/lib/{model → base}/csnRefs.js +8 -10
- package/lib/base/error.js +2 -0
- package/lib/base/message-registry.js +68 -4
- package/lib/base/messages.js +4 -2
- package/lib/{optionProcessor.js → base/optionProcessor.js} +5 -3
- package/lib/base/{model.js → specialOptions.js} +16 -39
- package/lib/checks/arrayOfs.js +1 -1
- package/lib/checks/elements.js +1 -1
- package/lib/checks/enricher.js +2 -2
- package/lib/checks/featureFlags.js +54 -24
- package/lib/checks/foreignKeys.js +1 -1
- package/lib/checks/invalidTarget.js +1 -1
- package/lib/checks/managedInType.js +1 -1
- package/lib/checks/onConditions.js +1 -1
- package/lib/checks/queryNoDbArtifacts.js +1 -1
- package/lib/checks/validator.js +10 -14
- package/lib/compiler/assert-consistency.js +11 -9
- package/lib/compiler/base.js +5 -1
- package/lib/compiler/builtins.js +1 -1
- package/lib/compiler/checks.js +3 -3
- package/lib/compiler/define.js +6 -3
- package/lib/{base → compiler}/dictionaries.js +4 -3
- package/lib/compiler/extend.js +121 -21
- package/lib/compiler/generate.js +2 -2
- package/lib/compiler/index.js +11 -3
- package/lib/compiler/kick-start.js +1 -1
- package/lib/compiler/lsp-api.js +3 -3
- package/lib/compiler/populate.js +6 -7
- package/lib/compiler/resolve.js +53 -36
- package/lib/compiler/shared.js +68 -18
- package/lib/compiler/tweak-assocs.js +2 -2
- package/lib/compiler/utils.js +28 -27
- package/lib/compiler/xpr-rewrite.js +3 -3
- package/lib/edm/EdmPrimitiveTypeDefinitions.js +4 -1
- package/lib/edm/annotations/edmJson.js +2 -4
- package/lib/edm/annotations/genericTranslation.js +51 -7
- package/lib/edm/csn2edm.js +3 -2
- package/lib/edm/edmAnnoPreprocessor.js +1 -1
- package/lib/edm/edmInboundChecks.js +2 -1
- package/lib/edm/edmPreprocessor.js +3 -3
- package/lib/edm/edmUtils.js +2 -2
- package/lib/gen/BaseParser.js +59 -108
- package/lib/gen/CdlGrammar.checksum +1 -1
- package/lib/gen/CdlParser.js +2052 -1965
- package/lib/gen/Dictionary.json +67 -7
- package/lib/json/from-csn.js +14 -14
- package/lib/json/to-csn.js +77 -38
- package/lib/main.js +3 -3
- package/lib/model/csnUtils.js +2 -2
- package/lib/modelCompare/compare.js +1 -1
- package/lib/modelCompare/utils/filter.js +1 -0
- package/lib/parsers/AstBuildingParser.js +83 -33
- package/lib/parsers/index.js +1 -1
- package/lib/render/manageConstraints.js +1 -1
- package/lib/render/toCdl.js +49 -30
- package/lib/render/toHdbcds.js +2 -2
- package/lib/render/toSql.js +16 -7
- package/lib/render/utils/common.js +11 -3
- package/lib/render/utils/sql.js +14 -5
- package/lib/render/utils/standardDatabaseFunctions.js +108 -99
- package/lib/sql-identifier.js +9 -1
- package/lib/{model → tool-lib}/enrichCsn.js +3 -2
- package/lib/{model → tool-lib}/revealInternalProperties.js +2 -1
- package/lib/transform/addTenantFields.js +1 -1
- package/lib/transform/db/applyTransformations.js +1 -1
- package/lib/transform/db/assertUnique.js +1 -1
- package/lib/transform/db/assocsToQueries/transformExists.js +1 -1
- package/lib/transform/db/backlinks.js +2 -2
- package/lib/transform/db/expansion.js +2 -2
- package/lib/transform/db/flattening.js +3 -4
- package/lib/transform/db/killAnnotations.js +1 -0
- package/lib/transform/db/processSqlServices.js +2 -1
- package/lib/transform/db/rewriteCalculatedElements.js +2 -2
- package/lib/transform/db/temporal.js +30 -5
- package/lib/transform/db/views.js +16 -20
- package/lib/transform/draft/db.js +1 -2
- package/lib/transform/effective/associations.js +1 -1
- package/lib/transform/effective/flattening.js +6 -5
- package/lib/transform/effective/main.js +24 -4
- package/lib/transform/effective/types.js +1 -1
- package/lib/transform/{odata/fioriTreeViews.js → fioriTreeViews.js} +48 -25
- package/lib/transform/forOdata.js +25 -7
- package/lib/transform/forRelationalDB.js +48 -12
- package/lib/transform/localized.js +2 -2
- package/lib/transform/odata/createForeignKeys.js +1 -1
- package/lib/transform/odata/flattening.js +2 -2
- package/lib/transform/odata/toFinalBaseType.js +3 -2
- package/lib/transform/odata/typesExposure.js +3 -2
- package/lib/transform/transformUtils.js +2 -2
- package/lib/transform/translateAssocsToJoins.js +2 -1
- package/lib/transform/tupleExpansion.js +44 -4
- package/lib/transform/universalCsn/universalCsnEnricher.js +7 -3
- package/lib/transform/universalCsn/utils.js +1 -1
- package/lib/{base → utils}/lazyload.js +9 -0
- package/lib/{base → utils}/node-helpers.js +2 -0
- package/lib/utils/objectUtils.js +29 -6
- package/lib/{base → utils}/optionProcessorHelper.js +16 -6
- package/package.json +3 -40
- /package/lib/{model → base}/cloneCsn.js +0 -0
- /package/lib/{model/api.js → base/model-api.js} +0 -0
- /package/lib/{api → base}/trace.js +0 -0
- /package/lib/{model → base}/xprAsTree.js +0 -0
- /package/lib/{inspect → tool-lib}/index.js +0 -0
- /package/lib/{inspect → tool-lib}/inspectModelStatistics.js +0 -0
- /package/lib/{inspect → tool-lib}/inspectPropagation.js +0 -0
- /package/lib/{inspect → tool-lib}/inspectUtils.js +0 -0
- /package/lib/{base → utils}/shuffle.js +0 -0
package/lib/gen/BaseParser.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//Base class for generated parser, for redepage v0.
|
|
1
|
+
// Base class for generated parser, for redepage v0.4.0
|
|
2
2
|
|
|
3
3
|
'use strict';
|
|
4
4
|
|
|
@@ -24,7 +24,6 @@ recoverTokenIdx = -1;
|
|
|
24
24
|
reuseErrorTokenIdx = null;
|
|
25
25
|
fixKeywordTokenIdx = -1;
|
|
26
26
|
conditionStackLength = -1;
|
|
27
|
-
nextTokenAsId = false;
|
|
28
27
|
|
|
29
28
|
s = null;
|
|
30
29
|
errorState = null;
|
|
@@ -32,7 +31,7 @@ stack = [];
|
|
|
32
31
|
dynamic_ = {};
|
|
33
32
|
prec_ = null;
|
|
34
33
|
$hasErrors = null;
|
|
35
|
-
|
|
34
|
+
hardGuards = {};
|
|
36
35
|
_trace = [];
|
|
37
36
|
|
|
38
37
|
constructor( lexer, keywords, table ) {
|
|
@@ -103,22 +102,30 @@ return this.tokens[this.stack[this.stack.length - 1].tokenIdx];
|
|
|
103
102
|
|
|
104
103
|
|
|
105
104
|
|
|
106
|
-
|
|
105
|
+
lt() {
|
|
107
106
|
return this.la().type;
|
|
108
107
|
}
|
|
109
108
|
|
|
110
109
|
|
|
111
110
|
lk() {
|
|
112
111
|
const la = this.la();
|
|
113
|
-
if (!this.nextTokenAsId)
|
|
114
112
|
return la.keyword || la.type;
|
|
113
|
+
}
|
|
115
114
|
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
l() {
|
|
116
|
+
let cmd = this.table[this.s];
|
|
117
|
+
let { keyword, type } = this.la();
|
|
118
|
+
const kb = keyword && cmd[keyword];
|
|
119
|
+
if (Array.isArray( kb ) &&
|
|
120
|
+
(!kb[2] || this.fixKeywordTokenIdx === this.tokenIdx || this._predictKeyword( kb[2] )))
|
|
121
|
+
return (kb[3] && this._rejectCond( kb[3], kb[4] )) ? '' : keyword;
|
|
122
|
+
const tb = cmd[type];
|
|
123
|
+
return (!tb || tb[3] && this._rejectCond( tb[3], tb[4] )) ? '' : type;
|
|
118
124
|
}
|
|
119
125
|
|
|
120
126
|
e() {
|
|
121
127
|
const la = this.la();
|
|
128
|
+
this.s = null;
|
|
122
129
|
|
|
123
130
|
if (this.errorTokenIdx === this.tokenIdx &&
|
|
124
131
|
(this.reuseErrorTokenIdx == null && this.reuseErrorTokenIdx < this.tokenIdx))
|
|
@@ -140,21 +147,11 @@ return false;
|
|
|
140
147
|
}
|
|
141
148
|
|
|
142
149
|
|
|
143
|
-
ei() {
|
|
144
|
-
if (!this.la().keyword)
|
|
145
|
-
return this.e();
|
|
146
|
-
this.nextTokenAsId = true;
|
|
147
|
-
return false;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
|
|
151
150
|
|
|
152
151
|
|
|
153
152
|
gr( follow ) {
|
|
154
|
-
if (this.
|
|
155
|
-
|
|
156
|
-
return this.e();
|
|
157
|
-
this.s = 0;
|
|
153
|
+
if (!this.g( 0 ))
|
|
154
|
+
return false;
|
|
158
155
|
|
|
159
156
|
|
|
160
157
|
const { type, keyword } = this.tokens[this.tokenIdx];
|
|
@@ -172,35 +169,11 @@ return (match ?? true) || this.e();
|
|
|
172
169
|
}
|
|
173
170
|
|
|
174
171
|
|
|
175
|
-
g( state
|
|
176
|
-
if (!(state == null ? this.e() : state || this.gr( follow )))
|
|
177
|
-
return false;
|
|
172
|
+
g( state ) {
|
|
178
173
|
this.s = state;
|
|
179
|
-
return
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
giA( state, follow ) {
|
|
184
|
-
if (!this.tokens[this.tokenIdx].keyword)
|
|
185
|
-
return this.g( state, follow );
|
|
186
|
-
this.nextTokenAsId = true;
|
|
187
|
-
return false;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
gi( state, follow ) {
|
|
192
|
-
const lk = this.tokens[this.tokenIdx].keyword;
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
if (!lk || this.keywords[lk])
|
|
196
|
-
return this.g( state, follow );
|
|
197
|
-
this.nextTokenAsId = true;
|
|
198
|
-
return false;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
gP( state, follow ) {
|
|
203
|
-
return this.lP( follow ) && this.g( state );
|
|
174
|
+
return (state || this.stack[this.stack.length - 1].tokenIdx < this.tokenIdx)
|
|
175
|
+
? true
|
|
176
|
+
: this.e();
|
|
204
177
|
}
|
|
205
178
|
|
|
206
179
|
|
|
@@ -219,9 +192,9 @@ return (this.tokens[this.tokenIdx].type === 'Id')
|
|
|
219
192
|
}
|
|
220
193
|
|
|
221
194
|
|
|
222
|
-
|
|
195
|
+
my( state, ident = true ) {
|
|
223
196
|
return (this.tokens[this.tokenIdx].type === 'Id')
|
|
224
|
-
? this.
|
|
197
|
+
? this.cy( state, ident )
|
|
225
198
|
: this.e();
|
|
226
199
|
}
|
|
227
200
|
|
|
@@ -247,7 +220,7 @@ return this.e();
|
|
|
247
220
|
const la = this.tokens[this.tokenIdx];
|
|
248
221
|
|
|
249
222
|
|
|
250
|
-
if (this.keywords[la.keyword]) {
|
|
223
|
+
if (this.keywords[la.keyword] && this.errorTokenIdx !== this.tokenIdx) {
|
|
251
224
|
|
|
252
225
|
if (this._runTransparently( () => {
|
|
253
226
|
++this.tokenIdx;
|
|
@@ -264,7 +237,7 @@ return this.c( state, ident )
|
|
|
264
237
|
}
|
|
265
238
|
|
|
266
239
|
|
|
267
|
-
|
|
240
|
+
cy( state, ident = 'ident' ) {
|
|
268
241
|
return this.c( state, ident )
|
|
269
242
|
}
|
|
270
243
|
|
|
@@ -274,12 +247,7 @@ return this.c( state, 'keyword' )
|
|
|
274
247
|
}
|
|
275
248
|
|
|
276
249
|
|
|
277
|
-
|
|
278
|
-
return this.lP( first2 ) && this.ck( state );
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
ckA( state ) {
|
|
250
|
+
cx( state ) {
|
|
283
251
|
|
|
284
252
|
return this.c( state, (this.l() === 'Id' ? 'keyword' : 'token') );
|
|
285
253
|
}
|
|
@@ -295,15 +263,11 @@ reuseToken_() {
|
|
|
295
263
|
|
|
296
264
|
|
|
297
265
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
gc( state, cond, arg ) {
|
|
266
|
+
_rejectCond( cond, arg ) {
|
|
303
267
|
if (this.conditionTokenIdx === this.tokenIdx &&
|
|
304
268
|
this.conditionStackLength == null &&
|
|
305
269
|
!this[cond].afterError)
|
|
306
|
-
return
|
|
270
|
+
return false
|
|
307
271
|
|
|
308
272
|
|
|
309
273
|
|
|
@@ -314,7 +278,8 @@ const fail = this[cond]( arg, true );
|
|
|
314
278
|
|
|
315
279
|
|
|
316
280
|
|
|
317
|
-
if (fail)
|
|
281
|
+
if (!fail)
|
|
282
|
+
return false;
|
|
318
283
|
|
|
319
284
|
|
|
320
285
|
|
|
@@ -326,17 +291,13 @@ const { keyword } = this.la();
|
|
|
326
291
|
if (keyword && this.table[this.s][keyword])
|
|
327
292
|
this.fixKeywordTokenIdx = this.tokenIdx;
|
|
328
293
|
this.conditionTokenIdx = this.tokenIdx;
|
|
294
|
+
|
|
329
295
|
this.conditionStackLength = this.stack.length;
|
|
330
296
|
this.conditionName = cond;
|
|
331
297
|
|
|
332
298
|
|
|
333
299
|
this.conditionFailure = fail;
|
|
334
|
-
|
|
335
|
-
return !fail || this.g( state ) && false;
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
ec( cond, arg ) {
|
|
339
|
-
return this.gc( null, cond, arg );
|
|
300
|
+
return true;
|
|
340
301
|
}
|
|
341
302
|
|
|
342
303
|
|
|
@@ -370,18 +331,7 @@ throw Error( `this.s === ${ this.s }; illegally set by action, or runtime/genera
|
|
|
370
331
|
this.dynamic_ = Object.getPrototypeOf( this.dynamic_ );
|
|
371
332
|
const caller = this.stack.pop();
|
|
372
333
|
const immediately = this.tokenIdx === caller.tokenIdx && this.tokenIdx >= this.errorTokenIdx;
|
|
373
|
-
if (this.constructor.tracingParser) {
|
|
374
|
-
const post = this.s == null &&
|
|
375
|
-
(immediately
|
|
376
|
-
? ' immediately'
|
|
377
|
-
: caller.followState == null
|
|
378
|
-
? ' unsuccessfully'
|
|
379
|
-
: ' prematurely');
|
|
380
|
-
const text = immediately ? '⚠ exit rule' : '⏎ exit rule';
|
|
381
|
-
this.s = caller.followState;
|
|
382
|
-
|
|
383
334
|
|
|
384
|
-
}
|
|
385
335
|
this.prec_ = caller.prec;
|
|
386
336
|
this.s = caller.followState;
|
|
387
337
|
if (immediately)
|
|
@@ -393,13 +343,10 @@ return true;
|
|
|
393
343
|
}
|
|
394
344
|
|
|
395
345
|
|
|
346
|
+
_predictKeyword( first2 ) {
|
|
396
347
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
lP( first2 ) {
|
|
400
|
-
|
|
401
|
-
const { keyword: lk1 } = this.tokens[this.tokenIdx];
|
|
402
|
-
if (!lk1 || this.keywords[lk1] !== 0 || this.fixKeywordTokenIdx === this.tokenIdx)
|
|
348
|
+
const { keyword: lk1 } = this.la();
|
|
349
|
+
if (this.keywords[lk1] !== 0)
|
|
403
350
|
return true;
|
|
404
351
|
|
|
405
352
|
|
|
@@ -415,10 +362,7 @@ if (this._walkPred( this.table[this.s][lk1], lk1, lt2, lk2 ))
|
|
|
415
362
|
return true;
|
|
416
363
|
|
|
417
364
|
const choice = this.table[this.s];
|
|
418
|
-
|
|
419
|
-
return true;
|
|
420
|
-
this.nextTokenAsId = true;
|
|
421
|
-
return false;
|
|
365
|
+
return !this._walkPred( choice.Id || choice[''], null, lt2, lk2 );
|
|
422
366
|
}
|
|
423
367
|
|
|
424
368
|
_walkPred( cmd, lk1, lt2, lk2 ) {
|
|
@@ -494,9 +438,9 @@ cmd = !(c && this._rejectCondition( c, mode, lean )) && c || cmd[''];
|
|
|
494
438
|
const state = this.s;
|
|
495
439
|
this.s = cmd[1];
|
|
496
440
|
switch (cmd[0]) {
|
|
497
|
-
case 'c': case 'ck': case '
|
|
441
|
+
case 'c': case 'ck': case 'cx':
|
|
498
442
|
return true;
|
|
499
|
-
case '
|
|
443
|
+
case 'cy':
|
|
500
444
|
return mode !== 'F';
|
|
501
445
|
|
|
502
446
|
|
|
@@ -505,6 +449,8 @@ case 'ci':
|
|
|
505
449
|
if (!keyword ||
|
|
506
450
|
!this.keywords[keyword] && this.fixKeywordTokenIdx !== this.tokenIdx)
|
|
507
451
|
return mode !== 'F';
|
|
452
|
+
|
|
453
|
+
|
|
508
454
|
cmd = this.table[state][''];
|
|
509
455
|
this.s = cmd[1];
|
|
510
456
|
break;
|
|
@@ -514,7 +460,7 @@ case 'mi':
|
|
|
514
460
|
return type === 'Id' && mode !== 'F' &&
|
|
515
461
|
(!keyword ||
|
|
516
462
|
!this.keywords[keyword] && this.fixKeywordTokenIdx !== this.tokenIdx);
|
|
517
|
-
case '
|
|
463
|
+
case 'my':
|
|
518
464
|
return type === 'Id' && mode !== 'F';
|
|
519
465
|
case 'mk':
|
|
520
466
|
return keyword === cmd[2];
|
|
@@ -564,7 +510,7 @@ return (hasMatchedToken ?? this.tokenIdx > this.stack.at( -1 ).tokenIdx)
|
|
|
564
510
|
|
|
565
511
|
_rejectCondition( cmd, mode, lean ) {
|
|
566
512
|
const cond = cmd[3];
|
|
567
|
-
if (!cond || lean && !this.
|
|
513
|
+
if (!cond || lean && !this.hardGuards[cond])
|
|
568
514
|
return false;
|
|
569
515
|
if (!this.constructor.tracingParser)
|
|
570
516
|
return !!this[cond]( cmd[4], mode );
|
|
@@ -591,9 +537,6 @@ this.s = this.stack[depth].followState;
|
|
|
591
537
|
|
|
592
538
|
match = this._pred_next( type, keyword, mode );
|
|
593
539
|
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
540
|
}
|
|
598
541
|
this.dynamic_ = dynamic_;
|
|
599
542
|
this.s = savedState;
|
|
@@ -671,12 +614,16 @@ cmd ??= this.table[this.s];
|
|
|
671
614
|
if (!Array.isArray( cmd )) {
|
|
672
615
|
const lookahead = cmd[' lookahead'];
|
|
673
616
|
const dict = cmd;
|
|
617
|
+
cmd = dict[''];
|
|
674
618
|
for (const prop in dict) {
|
|
675
619
|
if (prop && Object.hasOwn( dict, prop ) && prop !== 'Id' &&
|
|
676
|
-
!Object.hasOwn( expecting, prop ) && prop.charAt(0) !== ' ')
|
|
620
|
+
!Object.hasOwn( expecting, prop ) && prop.charAt(0) !== ' ') {
|
|
621
|
+
|
|
622
|
+
const ad = dict[prop];
|
|
623
|
+
if (ad[1] !== cmd[1] || ad[0] !== 'g')
|
|
677
624
|
this.addTokenToSet_( expecting, prop, val, collectKeywordsAndIdOnly, lookahead );
|
|
678
625
|
}
|
|
679
|
-
|
|
626
|
+
}
|
|
680
627
|
if (dict.Id) {
|
|
681
628
|
|
|
682
629
|
if (cmd[0] === 'e') {
|
|
@@ -695,13 +642,13 @@ switch (cmd[0]) {
|
|
|
695
642
|
case 'm': case 'mk':
|
|
696
643
|
this.addTokenToSet_( expecting, cmd[2], val, collectKeywordsAndIdOnly );
|
|
697
644
|
break loop;
|
|
698
|
-
case 'ci': case '
|
|
645
|
+
case 'ci': case 'cy': case 'mi': case 'my':
|
|
699
646
|
this.addTokenToSet_( expecting, 'Id', val, false );
|
|
700
647
|
|
|
701
648
|
|
|
702
649
|
|
|
703
650
|
break loop;
|
|
704
|
-
case 'g': case '
|
|
651
|
+
case 'g': case 'e':
|
|
705
652
|
break;
|
|
706
653
|
default:
|
|
707
654
|
if (typeof cmd[0] !== 'number')
|
|
@@ -925,17 +872,21 @@ return table;
|
|
|
925
872
|
for (const line of table) {
|
|
926
873
|
if (typeof line !== 'object' || Array.isArray( line ))
|
|
927
874
|
continue;
|
|
928
|
-
const
|
|
929
|
-
|
|
930
|
-
const alt = line[prop];
|
|
931
|
-
if (!Array.isArray( alt ) && prop.charAt(0) !== ' ')
|
|
932
|
-
line[prop] = (typeof alt === 'string') ? line[alt] : (cache[alt] ??= [ 'g', alt ]);
|
|
933
|
-
}
|
|
875
|
+
for (const prop of Object.keys( line ))
|
|
876
|
+
compileTableItem( line, prop );
|
|
934
877
|
if (!line[''])
|
|
935
878
|
line[''] = [ 'e' ];
|
|
936
879
|
}
|
|
937
880
|
table.$compiled = true;
|
|
938
881
|
return table;
|
|
939
882
|
}
|
|
883
|
+
function compileTableItem( line, prop ) {
|
|
884
|
+
const alt = line[prop];
|
|
885
|
+
if (typeof alt === 'number')
|
|
886
|
+
return line[prop] = [ 'g', alt ];
|
|
887
|
+
else if (typeof alt === 'string' && prop.charAt(0) !== ' ')
|
|
888
|
+
return line[prop] = compileTableItem( line, alt );
|
|
889
|
+
return alt;
|
|
890
|
+
}
|
|
940
891
|
BaseParser.prototype.isNoKeywordInRuleFollow.afterError = true;
|
|
941
892
|
module.exports = BaseParser;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
43e8ba55fd2a4f645dcbc0928d83528b
|