Skip to content

Commit 2ecf6cb

Browse files
committed
Use BailErrorStrategy for lexing/parsing
- Default strategy was to attempt error recovery, which could lead to unexpected behaviour - Now fails compilation when encountering lexing/parsing errors - Allow empty hex literals (0x) - Update grammar page in docs
1 parent b821182 commit 2ecf6cb

File tree

6 files changed

+118
-120
lines changed

6 files changed

+118
-120
lines changed

packages/cashc/src/cashc-cli.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,5 @@ function ensure(condition: boolean, msg: string, code?: number): void {
111111

112112
function abort(msg: string, code: number = 1): void {
113113
console.error(msg);
114-
console.error();
115-
program.outputHelp();
116114
process.exit(code);
117115
}

packages/cashc/src/grammar/CashScript.g4

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,16 +87,14 @@ expression
8787
| functionCall # FunctionCallExpression
8888
| 'new' Identifier expressionList #Instantiation
8989
| expression '[' index=NumberLiteral ']' # TupleIndexOp
90-
// | left=expression op=('++' | '--')
91-
// | op=('!' | '~' | '+' | '-' | '++' | '--') right=expression
9290
| expression op=('.reverse()' | '.length') # UnaryOp
9391
| op=('!' | '-') expression # UnaryOp
94-
// | expression '**' expression --- No power
95-
// | expression ('*' | '/' | '%') expression --- OP_MUL is still disabled
92+
// | expression '**' expression --- OP_POW does not exist in BCH Script
93+
// | expression ('*' | '/' | '%') expression --- OP_MUL is disabled in BCH Script
9694
| left=expression op='.split' '(' right=expression ')' # BinaryOp
9795
| left=expression op=('/' | '%') right=expression # BinaryOp
9896
| left=expression op=('+' | '-') right=expression # BinaryOp
99-
// | expression ('>>' | '<<') expression --- OP_LSHIFT & RSHIFT are disabled
97+
// | expression ('>>' | '<<') expression --- OP_LSHIFT & RSHIFT are disabled in BCH Script
10098
| left=expression op=('<' | '<=' | '>' | '>=') right=expression # BinaryOp
10199
| left=expression op=('==' | '!=') right=expression # BinaryOp
102100
| left=expression op='&' right=expression # BinaryOp
@@ -122,7 +120,6 @@ numberLiteral
122120
;
123121

124122
typeName
125-
// : 'int' | 'bool' | 'string' | 'address' | 'pubkey' | 'sig' | Bytes
126123
: 'int' | 'bool' | 'string' | 'pubkey' | 'sig' | 'datasig' | Bytes
127124
;
128125

@@ -157,7 +154,7 @@ StringLiteral
157154
;
158155

159156
HexLiteral
160-
: '0' [xX] [0-9A-Fa-f]+
157+
: '0' [xX] [0-9A-Fa-f]*
161158
;
162159

163160
TxVar

packages/cashc/src/grammar/CashScriptLexer.interp

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

packages/cashc/src/grammar/CashScriptLexer.ts

Lines changed: 92 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ export class CashScriptLexer extends Lexer {
146146

147147
private static readonly _serializedATNSegments: number = 2;
148148
private static readonly _serializedATNSegment0: string =
149-
"\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02;\u0270\b\x01" +
149+
"\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02;\u0271\b\x01" +
150150
"\x04\x02\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06" +
151151
"\x04\x07\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r" +
152152
"\t\r\x04\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t" +
@@ -184,21 +184,21 @@ export class CashScriptLexer extends Lexer {
184184
"1\x031\x031\x031\x051\u0193\n1\x032\x032\x072\u0197\n2\f2\x0E2\u019A\v" +
185185
"2\x033\x033\x033\x033\x073\u01A0\n3\f3\x0E3\u01A3\v3\x033\x033\x033\x03" +
186186
"3\x033\x073\u01AA\n3\f3\x0E3\u01AD\v3\x033\x053\u01B0\n3\x034\x034\x03" +
187-
"4\x064\u01B5\n4\r4\x0E4\u01B6\x035\x035\x035\x035\x035\x035\x035\x035" +
188-
"\x035\x035\x035\x035\x035\x055\u01C6\n5\x036\x036\x036\x036\x036\x036" +
189-
"\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x03" +
187+
"4\x074\u01B5\n4\f4\x0E4\u01B8\v4\x035\x035\x035\x035\x035\x035\x035\x03" +
188+
"5\x035\x035\x035\x035\x035\x055\u01C7\n5\x036\x036\x036\x036\x036\x03" +
190189
"6\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x03" +
191190
"6\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x03" +
192191
"6\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x03" +
193192
"6\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x03" +
194193
"6\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x03" +
195194
"6\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x03" +
196195
"6\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x03" +
197-
"6\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x056\u0248\n6\x03" +
198-
"7\x037\x077\u024C\n7\f7\x0E7\u024F\v7\x038\x068\u0252\n8\r8\x0E8\u0253" +
199-
"\x038\x038\x039\x039\x039\x039\x079\u025C\n9\f9\x0E9\u025F\v9\x039\x03" +
200-
"9\x039\x039\x039\x03:\x03:\x03:\x03:\x07:\u026A\n:\f:\x0E:\u026D\v:\x03" +
201-
":\x03:\x05\u01A1\u01AB\u025D\x02\x02;\x03\x02\x03\x05\x02\x04\x07\x02" +
196+
"6\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x03" +
197+
"6\x036\x036\x036\x036\x036\x036\x036\x036\x036\x036\x056\u0249\n6\x03" +
198+
"7\x037\x077\u024D\n7\f7\x0E7\u0250\v7\x038\x068\u0253\n8\r8\x0E8\u0254" +
199+
"\x038\x038\x039\x039\x039\x039\x079\u025D\n9\f9\x0E9\u0260\v9\x039\x03" +
200+
"9\x039\x039\x039\x03:\x03:\x03:\x03:\x07:\u026B\n:\f:\x0E:\u026E\v:\x03" +
201+
":\x03:\x05\u01A1\u01AB\u025E\x02\x02;\x03\x02\x03\x05\x02\x04\x07\x02" +
202202
"\x05\t\x02\x06\v\x02\x07\r\x02\b\x0F\x02\t\x11\x02\n\x13\x02\v\x15\x02" +
203203
"\f\x17\x02\r\x19\x02\x0E\x1B\x02\x0F\x1D\x02\x10\x1F\x02\x11!\x02\x12" +
204204
"#\x02\x13%\x02\x14\'\x02\x15)\x02\x16+\x02\x17-\x02\x18/\x02\x191\x02" +
@@ -208,7 +208,7 @@ export class CashScriptLexer extends Lexer {
208208
":s\x02;\x03\x02\x0E\x03\x022;\x03\x02//\x04\x02GGgg\x03\x023;\x05\x02" +
209209
"\f\f\x0F\x0F$$\x05\x02\f\f\x0F\x0F))\x04\x02ZZzz\x05\x022;CHch\x04\x02" +
210210
"C\\c|\x06\x022;C\\aac|\x05\x02\v\f\x0E\x0F\"\"\x04\x02\f\f\x0F\x0F\x02" +
211-
"\u0297\x02\x03\x03\x02\x02\x02\x02\x05\x03\x02\x02\x02\x02\x07\x03\x02" +
211+
"\u0298\x02\x03\x03\x02\x02\x02\x02\x05\x03\x02\x02\x02\x02\x07\x03\x02" +
212212
"\x02\x02\x02\t\x03\x02\x02\x02\x02\v\x03\x02\x02\x02\x02\r\x03\x02\x02" +
213213
"\x02\x02\x0F\x03\x02\x02\x02\x02\x11\x03\x02\x02\x02\x02\x13\x03\x02\x02" +
214214
"\x02\x02\x15\x03\x02\x02\x02\x02\x17\x03\x02\x02\x02\x02\x19\x03\x02\x02" +
@@ -241,9 +241,9 @@ export class CashScriptLexer extends Lexer {
241241
"\x02\x02\x02U\u0118\x03\x02\x02\x02W\u011C\x03\x02\x02\x02Y\u0125\x03" +
242242
"\x02\x02\x02[\u013E\x03\x02\x02\x02]\u0179\x03\x02\x02\x02_\u017C\x03" +
243243
"\x02\x02\x02a\u018B\x03\x02\x02\x02c\u0194\x03\x02\x02\x02e\u01AF\x03" +
244-
"\x02\x02\x02g\u01B1\x03\x02\x02\x02i\u01C5\x03\x02\x02\x02k\u0247\x03" +
245-
"\x02\x02\x02m\u0249\x03\x02\x02\x02o\u0251\x03\x02\x02\x02q\u0257\x03" +
246-
"\x02\x02\x02s\u0265\x03\x02\x02\x02uv\x07r\x02\x02vw\x07t\x02\x02wx\x07" +
244+
"\x02\x02\x02g\u01B1\x03\x02\x02\x02i\u01C6\x03\x02\x02\x02k\u0248\x03" +
245+
"\x02\x02\x02m\u024A\x03\x02\x02\x02o\u0252\x03\x02\x02\x02q\u0258\x03" +
246+
"\x02\x02\x02s\u0266\x03\x02\x02\x02uv\x07r\x02\x02vw\x07t\x02\x02wx\x07" +
247247
"c\x02\x02xy\x07i\x02\x02yz\x07o\x02\x02z{\x07c\x02\x02{\x04\x03\x02\x02" +
248248
"\x02|}\x07=\x02\x02}\x06\x03\x02\x02\x02~\x7F\x07e\x02\x02\x7F\x80\x07" +
249249
"c\x02\x02\x80\x81\x07u\x02\x02\x81\x82\x07j\x02\x02\x82\x83\x07u\x02\x02" +
@@ -358,86 +358,86 @@ export class CashScriptLexer extends Lexer {
358358
"\u01AC\x03\x02\x02\x02\u01AB\u01A9\x03\x02\x02\x02\u01AC\u01AE\x03\x02" +
359359
"\x02\x02\u01AD\u01AB\x03\x02\x02\x02\u01AE\u01B0\x07)\x02\x02\u01AF\u019B" +
360360
"\x03\x02\x02\x02\u01AF\u01A5\x03\x02\x02\x02\u01B0f\x03\x02\x02\x02\u01B1" +
361-
"\u01B2\x072\x02\x02\u01B2\u01B4\t\b\x02\x02\u01B3\u01B5\t\t\x02\x02\u01B4" +
362-
"\u01B3\x03\x02\x02\x02\u01B5\u01B6\x03\x02\x02\x02\u01B6\u01B4\x03\x02" +
363-
"\x02\x02\u01B6\u01B7\x03\x02\x02\x02\u01B7h\x03\x02\x02\x02\u01B8\u01B9" +
364-
"\x07v\x02\x02\u01B9\u01BA\x07z\x02\x02\u01BA\u01BB\x070\x02\x02\u01BB" +
365-
"\u01BC\x07c\x02\x02\u01BC\u01BD\x07i\x02\x02\u01BD\u01C6\x07g\x02\x02" +
366-
"\u01BE\u01BF\x07v\x02\x02\u01BF\u01C0\x07z\x02\x02\u01C0\u01C1\x070\x02" +
367-
"\x02\u01C1\u01C2\x07v\x02\x02\u01C2\u01C3\x07k\x02\x02\u01C3\u01C4\x07" +
368-
"o\x02\x02\u01C4\u01C6\x07g\x02\x02\u01C5\u01B8\x03\x02\x02\x02\u01C5\u01BE" +
369-
"\x03\x02\x02\x02\u01C6j\x03\x02\x02\x02\u01C7\u01C8\x07v\x02\x02\u01C8" +
370-
"\u01C9\x07z\x02\x02\u01C9\u01CA\x070\x02\x02\u01CA\u01CB\x07x\x02\x02" +
371-
"\u01CB\u01CC\x07g\x02\x02\u01CC\u01CD\x07t\x02\x02\u01CD\u01CE\x07u\x02" +
372-
"\x02\u01CE\u01CF\x07k\x02\x02\u01CF\u01D0\x07q\x02\x02\u01D0\u0248\x07" +
373-
"p\x02\x02\u01D1\u01D2\x07v\x02\x02\u01D2\u01D3\x07z\x02\x02\u01D3\u01D4" +
374-
"\x070\x02\x02\u01D4\u01D5\x07j\x02\x02\u01D5\u01D6\x07c\x02\x02\u01D6" +
375-
"\u01D7\x07u\x02\x02\u01D7\u01D8\x07j\x02\x02\u01D8\u01D9\x07R\x02\x02" +
376-
"\u01D9\u01DA\x07t\x02\x02\u01DA\u01DB\x07g\x02\x02\u01DB\u01DC\x07x\x02" +
377-
"\x02\u01DC\u01DD\x07q\x02\x02\u01DD\u01DE\x07w\x02\x02\u01DE\u01DF\x07" +
378-
"v\x02\x02\u01DF\u0248\x07u\x02\x02\u01E0\u01E1\x07v\x02\x02\u01E1\u01E2" +
379-
"\x07z\x02\x02\u01E2\u01E3\x070\x02\x02\u01E3\u01E4\x07j\x02\x02\u01E4" +
380-
"\u01E5\x07c\x02\x02\u01E5\u01E6\x07u\x02\x02\u01E6\u01E7\x07j\x02\x02" +
381-
"\u01E7\u01E8\x07U\x02\x02\u01E8\u01E9\x07g\x02\x02\u01E9\u01EA\x07s\x02" +
382-
"\x02\u01EA\u01EB\x07w\x02\x02\u01EB\u01EC\x07g\x02\x02\u01EC\u01ED\x07" +
383-
"p\x02\x02\u01ED\u01EE\x07e\x02\x02\u01EE\u0248\x07g\x02\x02\u01EF\u01F0" +
384-
"\x07v\x02\x02\u01F0\u01F1\x07z\x02\x02\u01F1\u01F2\x070\x02\x02\u01F2" +
385-
"\u01F3\x07q\x02\x02\u01F3\u01F4\x07w\x02\x02\u01F4\u01F5\x07v\x02\x02" +
386-
"\u01F5\u01F6\x07r\x02\x02\u01F6\u01F7\x07q\x02\x02\u01F7\u01F8\x07k\x02" +
387-
"\x02\u01F8\u01F9\x07p\x02\x02\u01F9\u0248\x07v\x02\x02\u01FA\u01FB\x07" +
388-
"v\x02\x02\u01FB\u01FC\x07z\x02\x02\u01FC\u01FD\x070\x02\x02\u01FD\u01FE" +
389-
"\x07d\x02\x02\u01FE\u01FF\x07{\x02\x02\u01FF\u0200\x07v\x02\x02\u0200" +
390-
"\u0201\x07g\x02\x02\u0201\u0202\x07e\x02\x02\u0202\u0203\x07q\x02\x02" +
391-
"\u0203\u0204\x07f\x02\x02\u0204\u0248\x07g\x02\x02\u0205\u0206\x07v\x02" +
392-
"\x02\u0206\u0207\x07z\x02\x02\u0207\u0208\x070\x02\x02\u0208\u0209\x07" +
393-
"x\x02\x02\u0209\u020A\x07c\x02\x02\u020A\u020B\x07n\x02\x02\u020B\u020C" +
394-
"\x07w\x02\x02\u020C\u0248\x07g\x02\x02\u020D\u020E\x07v\x02\x02\u020E" +
395-
"\u020F\x07z\x02\x02\u020F\u0210\x070\x02\x02\u0210\u0211\x07u\x02\x02" +
396-
"\u0211\u0212\x07g\x02\x02\u0212\u0213\x07s\x02\x02\u0213\u0214\x07w\x02" +
397-
"\x02\u0214\u0215\x07g\x02\x02\u0215\u0216\x07p\x02\x02\u0216\u0217\x07" +
398-
"e\x02\x02\u0217\u0248\x07g\x02\x02\u0218\u0219\x07v\x02\x02\u0219\u021A" +
399-
"\x07z\x02\x02\u021A\u021B\x070\x02\x02\u021B\u021C\x07j\x02\x02\u021C" +
400-
"\u021D\x07c\x02\x02\u021D\u021E\x07u\x02\x02\u021E\u021F\x07j\x02\x02" +
401-
"\u021F\u0220\x07Q\x02\x02\u0220\u0221\x07w\x02\x02\u0221\u0222\x07v\x02" +
402-
"\x02\u0222\u0223\x07r\x02\x02\u0223\u0224\x07w\x02\x02\u0224\u0225\x07" +
403-
"v\x02\x02\u0225\u0248\x07u\x02\x02\u0226\u0227\x07v\x02\x02\u0227\u0228" +
404-
"\x07z\x02";
361+
"\u01B2\x072\x02\x02\u01B2\u01B6\t\b\x02\x02\u01B3\u01B5\t\t\x02\x02\u01B4" +
362+
"\u01B3\x03\x02\x02\x02\u01B5\u01B8\x03\x02\x02\x02\u01B6\u01B4\x03\x02" +
363+
"\x02\x02\u01B6\u01B7\x03\x02\x02\x02\u01B7h\x03\x02\x02\x02\u01B8\u01B6" +
364+
"\x03\x02\x02\x02\u01B9\u01BA\x07v\x02\x02\u01BA\u01BB\x07z\x02\x02\u01BB" +
365+
"\u01BC\x070\x02\x02\u01BC\u01BD\x07c\x02\x02\u01BD\u01BE\x07i\x02\x02" +
366+
"\u01BE\u01C7\x07g\x02\x02\u01BF\u01C0\x07v\x02\x02\u01C0\u01C1\x07z\x02" +
367+
"\x02\u01C1\u01C2\x070\x02\x02\u01C2\u01C3\x07v\x02\x02\u01C3\u01C4\x07" +
368+
"k\x02\x02\u01C4\u01C5\x07o\x02\x02\u01C5\u01C7\x07g\x02\x02\u01C6\u01B9" +
369+
"\x03\x02\x02\x02\u01C6\u01BF\x03\x02\x02\x02\u01C7j\x03\x02\x02\x02\u01C8" +
370+
"\u01C9\x07v\x02\x02\u01C9\u01CA\x07z\x02\x02\u01CA\u01CB\x070\x02\x02" +
371+
"\u01CB\u01CC\x07x\x02\x02\u01CC\u01CD\x07g\x02\x02\u01CD\u01CE\x07t\x02" +
372+
"\x02\u01CE\u01CF\x07u\x02\x02\u01CF\u01D0\x07k\x02\x02\u01D0\u01D1\x07" +
373+
"q\x02\x02\u01D1\u0249\x07p\x02\x02\u01D2\u01D3\x07v\x02\x02\u01D3\u01D4" +
374+
"\x07z\x02\x02\u01D4\u01D5\x070\x02\x02\u01D5\u01D6\x07j\x02\x02\u01D6" +
375+
"\u01D7\x07c\x02\x02\u01D7\u01D8\x07u\x02\x02\u01D8\u01D9\x07j\x02\x02" +
376+
"\u01D9\u01DA\x07R\x02\x02\u01DA\u01DB\x07t\x02\x02\u01DB\u01DC\x07g\x02" +
377+
"\x02\u01DC\u01DD\x07x\x02\x02\u01DD\u01DE\x07q\x02\x02\u01DE\u01DF\x07" +
378+
"w\x02\x02\u01DF\u01E0\x07v\x02\x02\u01E0\u0249\x07u\x02\x02\u01E1\u01E2" +
379+
"\x07v\x02\x02\u01E2\u01E3\x07z\x02\x02\u01E3\u01E4\x070\x02\x02\u01E4" +
380+
"\u01E5\x07j\x02\x02\u01E5\u01E6\x07c\x02\x02\u01E6\u01E7\x07u\x02\x02" +
381+
"\u01E7\u01E8\x07j\x02\x02\u01E8\u01E9\x07U\x02\x02\u01E9\u01EA\x07g\x02" +
382+
"\x02\u01EA\u01EB\x07s\x02\x02\u01EB\u01EC\x07w\x02\x02\u01EC\u01ED\x07" +
383+
"g\x02\x02\u01ED\u01EE\x07p\x02\x02\u01EE\u01EF\x07e\x02\x02\u01EF\u0249" +
384+
"\x07g\x02\x02\u01F0\u01F1\x07v\x02\x02\u01F1\u01F2\x07z\x02\x02\u01F2" +
385+
"\u01F3\x070\x02\x02\u01F3\u01F4\x07q\x02\x02\u01F4\u01F5\x07w\x02\x02" +
386+
"\u01F5\u01F6\x07v\x02\x02\u01F6\u01F7\x07r\x02\x02\u01F7\u01F8\x07q\x02" +
387+
"\x02\u01F8\u01F9\x07k\x02\x02\u01F9\u01FA\x07p\x02\x02\u01FA\u0249\x07" +
388+
"v\x02\x02\u01FB\u01FC\x07v\x02\x02\u01FC\u01FD\x07z\x02\x02\u01FD\u01FE" +
389+
"\x070\x02\x02\u01FE\u01FF\x07d\x02\x02\u01FF\u0200\x07{\x02\x02\u0200" +
390+
"\u0201\x07v\x02\x02\u0201\u0202\x07g\x02\x02\u0202\u0203\x07e\x02\x02" +
391+
"\u0203\u0204\x07q\x02\x02\u0204\u0205\x07f\x02\x02\u0205\u0249\x07g\x02" +
392+
"\x02\u0206\u0207\x07v\x02\x02\u0207\u0208\x07z\x02\x02\u0208\u0209\x07" +
393+
"0\x02\x02\u0209\u020A\x07x\x02\x02\u020A\u020B\x07c\x02\x02\u020B\u020C" +
394+
"\x07n\x02\x02\u020C\u020D\x07w\x02\x02\u020D\u0249\x07g\x02\x02\u020E" +
395+
"\u020F\x07v\x02\x02\u020F\u0210\x07z\x02\x02\u0210\u0211\x070\x02\x02" +
396+
"\u0211\u0212\x07u\x02\x02\u0212\u0213\x07g\x02\x02\u0213\u0214\x07s\x02" +
397+
"\x02\u0214\u0215\x07w\x02\x02\u0215\u0216\x07g\x02\x02\u0216\u0217\x07" +
398+
"p\x02\x02\u0217\u0218\x07e\x02\x02\u0218\u0249\x07g\x02\x02\u0219\u021A" +
399+
"\x07v\x02\x02\u021A\u021B\x07z\x02\x02\u021B\u021C\x070\x02\x02\u021C" +
400+
"\u021D\x07j\x02\x02\u021D\u021E\x07c\x02\x02\u021E\u021F\x07u\x02\x02" +
401+
"\u021F\u0220\x07j\x02\x02\u0220\u0221\x07Q\x02\x02\u0221\u0222\x07w\x02" +
402+
"\x02\u0222\u0223\x07v\x02\x02\u0223\u0224\x07r\x02\x02\u0224\u0225\x07" +
403+
"w\x02\x02\u0225\u0226\x07v\x02\x02\u0226\u0249\x07u\x02\x02\u0227\u0228" +
404+
"\x07";
405405
private static readonly _serializedATNSegment1: string =
406-
"\x02\u0228\u0229\x070\x02\x02\u0229\u022A\x07n\x02\x02\u022A\u022B\x07" +
407-
"q\x02\x02\u022B\u022C\x07e\x02\x02\u022C\u022D\x07m\x02\x02\u022D\u022E" +
408-
"\x07v\x02\x02\u022E\u022F\x07k\x02\x02\u022F\u0230\x07o\x02\x02\u0230" +
409-
"\u0248\x07g\x02\x02\u0231\u0232\x07v\x02\x02\u0232\u0233\x07z\x02\x02" +
410-
"\u0233\u0234\x070\x02\x02\u0234\u0235\x07j\x02\x02\u0235\u0236\x07c\x02" +
411-
"\x02\u0236\u0237\x07u\x02\x02\u0237\u0238\x07j\x02\x02\u0238\u0239\x07" +
412-
"v\x02\x02\u0239\u023A\x07{\x02\x02\u023A\u023B\x07r\x02\x02\u023B\u0248" +
413-
"\x07g\x02\x02\u023C\u023D\x07v\x02\x02\u023D\u023E\x07z\x02\x02\u023E" +
414-
"\u023F\x070\x02\x02\u023F\u0240\x07r\x02\x02\u0240\u0241\x07t\x02\x02" +
415-
"\u0241\u0242\x07g\x02\x02\u0242\u0243\x07k\x02\x02\u0243\u0244\x07o\x02" +
416-
"\x02\u0244\u0245\x07c\x02\x02\u0245\u0246\x07i\x02\x02\u0246\u0248\x07" +
417-
"g\x02\x02\u0247\u01C7\x03\x02\x02\x02\u0247\u01D1\x03\x02\x02\x02\u0247" +
418-
"\u01E0\x03\x02\x02\x02\u0247\u01EF\x03\x02\x02\x02\u0247\u01FA\x03\x02" +
419-
"\x02\x02\u0247\u0205\x03\x02\x02\x02\u0247\u020D\x03\x02\x02\x02\u0247" +
420-
"\u0218\x03\x02\x02\x02\u0247\u0226\x03\x02\x02\x02\u0247\u0231\x03\x02" +
421-
"\x02\x02\u0247\u023C\x03\x02\x02\x02\u0248l\x03\x02\x02\x02\u0249\u024D" +
422-
"\t\n\x02\x02\u024A\u024C\t\v\x02\x02\u024B\u024A\x03\x02\x02\x02\u024C" +
423-
"\u024F\x03\x02\x02\x02\u024D\u024B\x03\x02\x02\x02\u024D\u024E\x03\x02" +
424-
"\x02\x02\u024En\x03\x02\x02\x02\u024F\u024D\x03\x02\x02\x02\u0250\u0252" +
425-
"\t\f\x02\x02\u0251\u0250\x03\x02\x02\x02\u0252\u0253\x03\x02\x02\x02\u0253" +
426-
"\u0251\x03\x02\x02\x02\u0253\u0254\x03\x02\x02\x02\u0254\u0255\x03\x02" +
427-
"\x02\x02\u0255\u0256\b8\x02\x02\u0256p\x03\x02\x02\x02\u0257\u0258\x07" +
428-
"1\x02\x02\u0258\u0259\x07,\x02\x02\u0259\u025D\x03\x02\x02\x02\u025A\u025C" +
429-
"\v\x02\x02\x02\u025B\u025A\x03\x02\x02\x02\u025C\u025F\x03\x02\x02\x02" +
430-
"\u025D\u025E\x03\x02\x02\x02\u025D\u025B\x03\x02\x02\x02\u025E\u0260\x03" +
431-
"\x02\x02\x02\u025F\u025D\x03\x02\x02\x02\u0260\u0261\x07,\x02\x02\u0261" +
432-
"\u0262\x071\x02\x02\u0262\u0263\x03\x02\x02\x02\u0263\u0264\b9\x03\x02" +
433-
"\u0264r\x03\x02\x02\x02\u0265\u0266\x071\x02\x02\u0266\u0267\x071\x02" +
434-
"\x02\u0267\u026B\x03\x02\x02\x02\u0268\u026A\n\r\x02\x02\u0269\u0268\x03" +
435-
"\x02\x02\x02\u026A\u026D\x03\x02\x02\x02\u026B\u0269\x03\x02\x02\x02\u026B" +
436-
"\u026C\x03\x02\x02\x02\u026C\u026E\x03\x02\x02\x02\u026D\u026B\x03\x02" +
437-
"\x02\x02\u026E\u026F\b:\x03\x02\u026Ft\x03\x02\x02\x02\x1A\x02\u0127\u012D" +
438-
"\u0133\u013E\u0179\u017C\u0181\u0187\u0189\u0192\u0198\u019F\u01A1\u01A9" +
439-
"\u01AB\u01AF\u01B6\u01C5\u0247\u024D\u0253\u025D\u026B\x04\b\x02\x02\x02" +
440-
"\x03\x02";
406+
"v\x02\x02\u0228\u0229\x07z\x02\x02\u0229\u022A\x070\x02\x02\u022A\u022B" +
407+
"\x07n\x02\x02\u022B\u022C\x07q\x02\x02\u022C\u022D\x07e\x02\x02\u022D" +
408+
"\u022E\x07m\x02\x02\u022E\u022F\x07v\x02\x02\u022F\u0230\x07k\x02\x02" +
409+
"\u0230\u0231\x07o\x02\x02\u0231\u0249\x07g\x02\x02\u0232\u0233\x07v\x02" +
410+
"\x02\u0233\u0234\x07z\x02\x02\u0234\u0235\x070\x02\x02\u0235\u0236\x07" +
411+
"j\x02\x02\u0236\u0237\x07c\x02\x02\u0237\u0238\x07u\x02\x02\u0238\u0239" +
412+
"\x07j\x02\x02\u0239\u023A\x07v\x02\x02\u023A\u023B\x07{\x02\x02\u023B" +
413+
"\u023C\x07r\x02\x02\u023C\u0249\x07g\x02\x02\u023D\u023E\x07v\x02\x02" +
414+
"\u023E\u023F\x07z\x02\x02\u023F\u0240\x070\x02\x02\u0240\u0241\x07r\x02" +
415+
"\x02\u0241\u0242\x07t\x02\x02\u0242\u0243\x07g\x02\x02\u0243\u0244\x07" +
416+
"k\x02\x02\u0244\u0245\x07o\x02\x02\u0245\u0246\x07c\x02\x02\u0246\u0247" +
417+
"\x07i\x02\x02\u0247\u0249\x07g\x02\x02\u0248\u01C8\x03\x02\x02\x02\u0248" +
418+
"\u01D2\x03\x02\x02\x02\u0248\u01E1\x03\x02\x02\x02\u0248\u01F0\x03\x02" +
419+
"\x02\x02\u0248\u01FB\x03\x02\x02\x02\u0248\u0206\x03\x02\x02\x02\u0248" +
420+
"\u020E\x03\x02\x02\x02\u0248\u0219\x03\x02\x02\x02\u0248\u0227\x03\x02" +
421+
"\x02\x02\u0248\u0232\x03\x02\x02\x02\u0248\u023D\x03\x02\x02\x02\u0249" +
422+
"l\x03\x02\x02\x02\u024A\u024E\t\n\x02\x02\u024B\u024D\t\v\x02\x02\u024C" +
423+
"\u024B\x03\x02\x02\x02\u024D\u0250\x03\x02\x02\x02\u024E\u024C\x03\x02" +
424+
"\x02\x02\u024E\u024F\x03\x02\x02\x02\u024Fn\x03\x02\x02\x02\u0250\u024E" +
425+
"\x03\x02\x02\x02\u0251\u0253\t\f\x02\x02\u0252\u0251\x03\x02\x02\x02\u0253" +
426+
"\u0254\x03\x02\x02\x02\u0254\u0252\x03\x02\x02\x02\u0254\u0255\x03\x02" +
427+
"\x02\x02\u0255\u0256\x03\x02\x02\x02\u0256\u0257\b8\x02\x02\u0257p\x03" +
428+
"\x02\x02\x02\u0258\u0259\x071\x02\x02\u0259\u025A\x07,\x02\x02\u025A\u025E" +
429+
"\x03\x02\x02\x02\u025B\u025D\v\x02\x02\x02\u025C\u025B\x03\x02\x02\x02" +
430+
"\u025D\u0260\x03\x02\x02\x02\u025E\u025F\x03\x02\x02\x02\u025E\u025C\x03" +
431+
"\x02\x02\x02\u025F\u0261\x03\x02\x02\x02\u0260\u025E\x03\x02\x02\x02\u0261" +
432+
"\u0262\x07,\x02\x02\u0262\u0263\x071\x02\x02\u0263\u0264\x03\x02\x02\x02" +
433+
"\u0264\u0265\b9\x03\x02\u0265r\x03\x02\x02\x02\u0266\u0267\x071\x02\x02" +
434+
"\u0267\u0268\x071\x02\x02\u0268\u026C\x03\x02\x02\x02\u0269\u026B\n\r" +
435+
"\x02\x02\u026A\u0269\x03\x02\x02\x02\u026B\u026E\x03\x02\x02\x02\u026C" +
436+
"\u026A\x03\x02\x02\x02\u026C\u026D\x03\x02\x02\x02\u026D\u026F\x03\x02" +
437+
"\x02\x02\u026E\u026C\x03\x02\x02\x02\u026F\u0270\b:\x03\x02\u0270t\x03" +
438+
"\x02\x02\x02\x1A\x02\u0127\u012D\u0133\u013E\u0179\u017C\u0181\u0187\u0189" +
439+
"\u0192\u0198\u019F\u01A1\u01A9\u01AB\u01AF\u01B6\u01C6\u0248\u024E\u0254" +
440+
"\u025E\u026C\x04\b\x02\x02\x02\x03\x02";
441441
public static readonly _serializedATN: string = Utils.join(
442442
[
443443
CashScriptLexer._serializedATNSegment0,

packages/cashc/src/util.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
utf8ToBin,
1212
binToUtf8,
1313
} from '@bitauth/libauth';
14-
import { ANTLRInputStream, CommonTokenStream } from 'antlr4ts';
14+
import { ANTLRInputStream, BailErrorStrategy, CommonTokenStream } from 'antlr4ts';
1515
import fs from 'fs';
1616
import { Ast } from './ast/AST';
1717
import { CashScriptLexer } from './grammar/CashScriptLexer';
@@ -175,13 +175,18 @@ export type CashCompiler = typeof CashCompiler;
175175

176176
export function parseCode(code: string): Ast {
177177
// Lexing
178-
const inputStream: ANTLRInputStream = new ANTLRInputStream(code);
179-
const lexer: CashScriptLexer = new CashScriptLexer(inputStream);
180-
const tokenStream: CommonTokenStream = new CommonTokenStream(lexer);
178+
const inputStream = new ANTLRInputStream(code);
179+
const lexer = new CashScriptLexer(inputStream);
180+
const tokenStream = new CommonTokenStream(lexer);
181+
182+
// Parsing using a strict bail-on-error strategy without any error recovery
183+
const parser = new CashScriptParser(tokenStream);
184+
parser.errorHandler = new BailErrorStrategy();
185+
const parseTree = parser.sourceFile();
186+
187+
// AST building
188+
const ast = new AstBuilder(parseTree).build() as Ast;
181189

182-
// Parsing + AST building
183-
const parser: CashScriptParser = new CashScriptParser(tokenStream);
184-
const ast: Ast = new AstBuilder(parser.sourceFile()).build() as Ast;
185190
return ast;
186191
}
187192

0 commit comments

Comments
 (0)