From 472f059af7cf0f308bbe92a10649e72123ed0aa8 Mon Sep 17 00:00:00 2001 From: tangttangtang <206374282@qq.com> Date: Mon, 23 Mar 2026 19:07:11 +0800 Subject: [PATCH] =?UTF-8?q?SysY.g4=E6=96=87=E4=BB=B6=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=EF=BC=88=E5=8F=98=E9=87=8F=E5=91=BD=E5=90=8D=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=EF=BC=8C=E6=B3=A8=E9=87=8A=E6=94=B9=E4=B8=BA=E4=B8=AD=E6=96=87?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/antlr4/.antlr/SysYLexer.java | 16 +- src/antlr4/.antlr/SysYParser.java | 874 +++++++++++++++--------------- src/antlr4/SysY.g4 | 97 ++-- 3 files changed, 518 insertions(+), 469 deletions(-) diff --git a/src/antlr4/.antlr/SysYLexer.java b/src/antlr4/.antlr/SysYLexer.java index 804dcc1..0771c1d 100644 --- a/src/antlr4/.antlr/SysYLexer.java +++ b/src/antlr4/.antlr/SysYLexer.java @@ -19,8 +19,8 @@ public class SysYLexer extends Lexer { CONST=1, INT=2, FLOAT=3, VOID=4, IF=5, ELSE=6, WHILE=7, BREAK=8, CONTINUE=9, RETURN=10, ADD=11, SUB=12, MUL=13, DIV=14, MOD=15, ASSIGN=16, EQ=17, NE=18, LT=19, LE=20, GT=21, GE=22, NOT=23, AND=24, OR=25, LPAREN=26, RPAREN=27, - LBRACK=28, RBRACK=29, LBRACE=30, RBRACE=31, COMMA=32, SEMI=33, IDENT=34, - ILITERAL=35, FLITERAL=36, WS=37, LINE_COMMENT=38, BLOCK_COMMENT=39; + LBRACK=28, RBRACK=29, LBRACE=30, RBRACE=31, COMMA=32, SEMI=33, Ident=34, + IntConst=35, FloatConst=36, WS=37, LINE_COMMENT=38, BLOCK_COMMENT=39; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; @@ -34,10 +34,10 @@ public class SysYLexer extends Lexer { "CONST", "INT", "FLOAT", "VOID", "IF", "ELSE", "WHILE", "BREAK", "CONTINUE", "RETURN", "ADD", "SUB", "MUL", "DIV", "MOD", "ASSIGN", "EQ", "NE", "LT", "LE", "GT", "GE", "NOT", "AND", "OR", "LPAREN", "RPAREN", "LBRACK", "RBRACK", - "LBRACE", "RBRACE", "COMMA", "SEMI", "IDENT", "DIGIT", "NON_ZERO_DIGIT", - "OCT_DIGIT", "HEX_DIGIT", "DEC_INTEGER", "OCT_INTEGER", "HEX_INTEGER", - "DEC_FRACTION", "DEC_EXPONENT", "DEC_FLOAT", "HEX_FRACTION", "BIN_EXPONENT", - "HEX_FLOAT", "ILITERAL", "FLITERAL", "WS", "LINE_COMMENT", "BLOCK_COMMENT" + "LBRACE", "RBRACE", "COMMA", "SEMI", "Ident", "Digit", "NonzeroDigit", + "OctDigit", "HexDigit", "DecInteger", "OctInteger", "HexInteger", "DecFraction", + "DecExponent", "DecFloat", "HexFraction", "BinExponent", "HexFloat", + "IntConst", "FloatConst", "WS", "LINE_COMMENT", "BLOCK_COMMENT" }; } public static final String[] ruleNames = makeRuleNames(); @@ -56,8 +56,8 @@ public class SysYLexer extends Lexer { null, "CONST", "INT", "FLOAT", "VOID", "IF", "ELSE", "WHILE", "BREAK", "CONTINUE", "RETURN", "ADD", "SUB", "MUL", "DIV", "MOD", "ASSIGN", "EQ", "NE", "LT", "LE", "GT", "GE", "NOT", "AND", "OR", "LPAREN", "RPAREN", - "LBRACK", "RBRACK", "LBRACE", "RBRACE", "COMMA", "SEMI", "IDENT", "ILITERAL", - "FLITERAL", "WS", "LINE_COMMENT", "BLOCK_COMMENT" + "LBRACK", "RBRACK", "LBRACE", "RBRACE", "COMMA", "SEMI", "Ident", "IntConst", + "FloatConst", "WS", "LINE_COMMENT", "BLOCK_COMMENT" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); diff --git a/src/antlr4/.antlr/SysYParser.java b/src/antlr4/.antlr/SysYParser.java index 3072637..3a9d450 100644 --- a/src/antlr4/.antlr/SysYParser.java +++ b/src/antlr4/.antlr/SysYParser.java @@ -19,8 +19,8 @@ public class SysYParser extends Parser { CONST=1, INT=2, FLOAT=3, VOID=4, IF=5, ELSE=6, WHILE=7, BREAK=8, CONTINUE=9, RETURN=10, ADD=11, SUB=12, MUL=13, DIV=14, MOD=15, ASSIGN=16, EQ=17, NE=18, LT=19, LE=20, GT=21, GE=22, NOT=23, AND=24, OR=25, LPAREN=26, RPAREN=27, - LBRACK=28, RBRACK=29, LBRACE=30, RBRACE=31, COMMA=32, SEMI=33, IDENT=34, - ILITERAL=35, FLITERAL=36, WS=37, LINE_COMMENT=38, BLOCK_COMMENT=39; + LBRACK=28, RBRACK=29, LBRACE=30, RBRACE=31, COMMA=32, SEMI=33, Ident=34, + IntConst=35, FloatConst=36, WS=37, LINE_COMMENT=38, BLOCK_COMMENT=39; public static final int RULE_compUnit = 0, RULE_decl = 1, RULE_constDecl = 2, RULE_bType = 3, RULE_constDef = 4, RULE_constInitVal = 5, RULE_varDecl = 6, RULE_varDef = 7, @@ -55,8 +55,8 @@ public class SysYParser extends Parser { null, "CONST", "INT", "FLOAT", "VOID", "IF", "ELSE", "WHILE", "BREAK", "CONTINUE", "RETURN", "ADD", "SUB", "MUL", "DIV", "MOD", "ASSIGN", "EQ", "NE", "LT", "LE", "GT", "GE", "NOT", "AND", "OR", "LPAREN", "RPAREN", - "LBRACK", "RBRACK", "LBRACE", "RBRACE", "COMMA", "SEMI", "IDENT", "ILITERAL", - "FLITERAL", "WS", "LINE_COMMENT", "BLOCK_COMMENT" + "LBRACK", "RBRACK", "LBRACE", "RBRACE", "COMMA", "SEMI", "Ident", "IntConst", + "FloatConst", "WS", "LINE_COMMENT", "BLOCK_COMMENT" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -339,7 +339,7 @@ public class SysYParser extends Parser { @SuppressWarnings("CheckReturnValue") public static class ConstDefContext extends ParserRuleContext { - public TerminalNode IDENT() { return getToken(SysYParser.IDENT, 0); } + public TerminalNode Ident() { return getToken(SysYParser.Ident, 0); } public TerminalNode ASSIGN() { return getToken(SysYParser.ASSIGN, 0); } public ConstInitValContext constInitVal() { return getRuleContext(ConstInitValContext.class,0); @@ -372,7 +372,7 @@ public class SysYParser extends Parser { enterOuterAlt(_localctx, 1); { setState(88); - match(IDENT); + match(Ident); setState(95); _errHandler.sync(this); _la = _input.LA(1); @@ -443,9 +443,9 @@ public class SysYParser extends Parser { case SUB: case NOT: case LPAREN: - case IDENT: - case ILITERAL: - case FLITERAL: + case Ident: + case IntConst: + case FloatConst: enterOuterAlt(_localctx, 1); { setState(101); @@ -568,7 +568,7 @@ public class SysYParser extends Parser { @SuppressWarnings("CheckReturnValue") public static class VarDefContext extends ParserRuleContext { - public TerminalNode IDENT() { return getToken(SysYParser.IDENT, 0); } + public TerminalNode Ident() { return getToken(SysYParser.Ident, 0); } public List LBRACK() { return getTokens(SysYParser.LBRACK); } public TerminalNode LBRACK(int i) { return getToken(SysYParser.LBRACK, i); @@ -598,40 +598,63 @@ public class SysYParser extends Parser { enterRule(_localctx, 14, RULE_varDef); int _la; try { - enterOuterAlt(_localctx, 1); - { - setState(127); - match(IDENT); - setState(134); + setState(149); _errHandler.sync(this); - _la = _input.LA(1); - while (_la==LBRACK) { - { + switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); { - setState(128); - match(LBRACK); - setState(129); - constExp(); - setState(130); - match(RBRACK); - } - } - setState(136); + setState(127); + match(Ident); + setState(134); _errHandler.sync(this); _la = _input.LA(1); - } - setState(139); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==ASSIGN) { + while (_la==LBRACK) { + { + { + setState(128); + match(LBRACK); + setState(129); + constExp(); + setState(130); + match(RBRACK); + } + } + setState(136); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + break; + case 2: + enterOuterAlt(_localctx, 2); { setState(137); + match(Ident); + setState(144); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==LBRACK) { + { + { + setState(138); + match(LBRACK); + setState(139); + constExp(); + setState(140); + match(RBRACK); + } + } + setState(146); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(147); match(ASSIGN); - setState(138); + setState(148); initVal(); } - } - + break; } } catch (RecognitionException re) { @@ -673,54 +696,54 @@ public class SysYParser extends Parser { enterRule(_localctx, 16, RULE_initVal); int _la; try { - setState(154); + setState(164); _errHandler.sync(this); switch (_input.LA(1)) { case ADD: case SUB: case NOT: case LPAREN: - case IDENT: - case ILITERAL: - case FLITERAL: + case Ident: + case IntConst: + case FloatConst: enterOuterAlt(_localctx, 1); { - setState(141); + setState(151); exp(); } break; case LBRACE: enterOuterAlt(_localctx, 2); { - setState(142); + setState(152); match(LBRACE); - setState(151); + setState(161); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 121408329728L) != 0)) { { - setState(143); + setState(153); initVal(); - setState(148); + setState(158); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(144); + setState(154); match(COMMA); - setState(145); + setState(155); initVal(); } } - setState(150); + setState(160); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(153); + setState(163); match(RBRACE); } break; @@ -744,7 +767,7 @@ public class SysYParser extends Parser { public FuncTypeContext funcType() { return getRuleContext(FuncTypeContext.class,0); } - public TerminalNode IDENT() { return getToken(SysYParser.IDENT, 0); } + public TerminalNode Ident() { return getToken(SysYParser.Ident, 0); } public TerminalNode LPAREN() { return getToken(SysYParser.LPAREN, 0); } public TerminalNode RPAREN() { return getToken(SysYParser.RPAREN, 0); } public BlockContext block() { @@ -766,25 +789,25 @@ public class SysYParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(156); + setState(166); funcType(); - setState(157); - match(IDENT); - setState(158); + setState(167); + match(Ident); + setState(168); match(LPAREN); - setState(160); + setState(170); _errHandler.sync(this); _la = _input.LA(1); if (_la==INT || _la==FLOAT) { { - setState(159); + setState(169); funcFParams(); } } - setState(162); + setState(172); match(RPAREN); - setState(163); + setState(173); block(); } } @@ -817,7 +840,7 @@ public class SysYParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(165); + setState(175); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 28L) != 0)) ) { _errHandler.recoverInline(this); @@ -865,21 +888,21 @@ public class SysYParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(167); + setState(177); funcFParam(); - setState(172); + setState(182); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(168); + setState(178); match(COMMA); - setState(169); + setState(179); funcFParam(); } } - setState(174); + setState(184); _errHandler.sync(this); _la = _input.LA(1); } @@ -901,7 +924,7 @@ public class SysYParser extends Parser { public BTypeContext bType() { return getRuleContext(BTypeContext.class,0); } - public TerminalNode IDENT() { return getToken(SysYParser.IDENT, 0); } + public TerminalNode Ident() { return getToken(SysYParser.Ident, 0); } public List LBRACK() { return getTokens(SysYParser.LBRACK); } public TerminalNode LBRACK(int i) { return getToken(SysYParser.LBRACK, i); @@ -927,44 +950,44 @@ public class SysYParser extends Parser { enterRule(_localctx, 24, RULE_funcFParam); int _la; try { - setState(191); + setState(201); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(175); + setState(185); bType(); - setState(176); - match(IDENT); + setState(186); + match(Ident); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(178); + setState(188); bType(); - setState(179); - match(IDENT); - setState(180); + setState(189); + match(Ident); + setState(190); match(LBRACK); - setState(181); + setState(191); match(RBRACK); - setState(188); + setState(198); _errHandler.sync(this); _la = _input.LA(1); while (_la==LBRACK) { { { - setState(182); + setState(192); match(LBRACK); - setState(183); + setState(193); exp(); - setState(184); + setState(194); match(RBRACK); } } - setState(190); + setState(200); _errHandler.sync(this); _la = _input.LA(1); } @@ -1006,23 +1029,23 @@ public class SysYParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(193); + setState(203); match(LBRACE); - setState(197); + setState(207); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & 129998266286L) != 0)) { { { - setState(194); + setState(204); blockItem(); } } - setState(199); + setState(209); _errHandler.sync(this); _la = _input.LA(1); } - setState(200); + setState(210); match(RBRACE); } } @@ -1055,7 +1078,7 @@ public class SysYParser extends Parser { BlockItemContext _localctx = new BlockItemContext(_ctx, getState()); enterRule(_localctx, 28, RULE_blockItem); try { - setState(204); + setState(214); _errHandler.sync(this); switch (_input.LA(1)) { case CONST: @@ -1063,7 +1086,7 @@ public class SysYParser extends Parser { case FLOAT: enterOuterAlt(_localctx, 1); { - setState(202); + setState(212); decl(); } break; @@ -1078,12 +1101,12 @@ public class SysYParser extends Parser { case LPAREN: case LBRACE: case SEMI: - case IDENT: - case ILITERAL: - case FLITERAL: + case Ident: + case IntConst: + case FloatConst: enterOuterAlt(_localctx, 2); { - setState(203); + setState(213); stmt(); } break; @@ -1198,20 +1221,20 @@ public class SysYParser extends Parser { enterRule(_localctx, 30, RULE_stmt); int _la; try { - setState(240); + setState(250); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { case 1: _localctx = new AssignStmtContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(206); + setState(216); lVal(); - setState(207); + setState(217); match(ASSIGN); - setState(208); + setState(218); exp(); - setState(209); + setState(219); match(SEMI); } break; @@ -1219,17 +1242,17 @@ public class SysYParser extends Parser { _localctx = new ExpStmtContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(212); + setState(222); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 120334587904L) != 0)) { { - setState(211); + setState(221); exp(); } } - setState(214); + setState(224); match(SEMI); } break; @@ -1237,7 +1260,7 @@ public class SysYParser extends Parser { _localctx = new BlockStmtContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(215); + setState(225); block(); } break; @@ -1245,24 +1268,24 @@ public class SysYParser extends Parser { _localctx = new IfStmtContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(216); + setState(226); match(IF); - setState(217); + setState(227); match(LPAREN); - setState(218); + setState(228); cond(); - setState(219); + setState(229); match(RPAREN); - setState(220); + setState(230); stmt(); - setState(223); + setState(233); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { case 1: { - setState(221); + setState(231); match(ELSE); - setState(222); + setState(232); stmt(); } break; @@ -1273,15 +1296,15 @@ public class SysYParser extends Parser { _localctx = new WhileStmtContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(225); + setState(235); match(WHILE); - setState(226); + setState(236); match(LPAREN); - setState(227); + setState(237); cond(); - setState(228); + setState(238); match(RPAREN); - setState(229); + setState(239); stmt(); } break; @@ -1289,9 +1312,9 @@ public class SysYParser extends Parser { _localctx = new BreakStmtContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(231); + setState(241); match(BREAK); - setState(232); + setState(242); match(SEMI); } break; @@ -1299,9 +1322,9 @@ public class SysYParser extends Parser { _localctx = new ContinueStmtContext(_localctx); enterOuterAlt(_localctx, 7); { - setState(233); + setState(243); match(CONTINUE); - setState(234); + setState(244); match(SEMI); } break; @@ -1309,19 +1332,19 @@ public class SysYParser extends Parser { _localctx = new ReturnStmtContext(_localctx); enterOuterAlt(_localctx, 8); { - setState(235); + setState(245); match(RETURN); - setState(237); + setState(247); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 120334587904L) != 0)) { { - setState(236); + setState(246); exp(); } } - setState(239); + setState(249); match(SEMI); } break; @@ -1355,7 +1378,7 @@ public class SysYParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(242); + setState(252); addExp(0); } } @@ -1387,7 +1410,7 @@ public class SysYParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(244); + setState(254); lOrExp(0); } } @@ -1404,7 +1427,7 @@ public class SysYParser extends Parser { @SuppressWarnings("CheckReturnValue") public static class LValContext extends ParserRuleContext { - public TerminalNode IDENT() { return getToken(SysYParser.IDENT, 0); } + public TerminalNode Ident() { return getToken(SysYParser.Ident, 0); } public List LBRACK() { return getTokens(SysYParser.LBRACK); } public TerminalNode LBRACK(int i) { return getToken(SysYParser.LBRACK, i); @@ -1432,27 +1455,27 @@ public class SysYParser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(246); - match(IDENT); - setState(253); + setState(256); + match(Ident); + setState(263); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,24,_ctx); + _alt = getInterpreter().adaptivePredict(_input,25,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(247); + setState(257); match(LBRACK); - setState(248); + setState(258); exp(); - setState(249); + setState(259); match(RBRACK); } } } - setState(255); + setState(265); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,24,_ctx); + _alt = getInterpreter().adaptivePredict(_input,25,_ctx); } } } @@ -1490,32 +1513,32 @@ public class SysYParser extends Parser { PrimaryExpContext _localctx = new PrimaryExpContext(_ctx, getState()); enterRule(_localctx, 38, RULE_primaryExp); try { - setState(262); + setState(272); _errHandler.sync(this); switch (_input.LA(1)) { case LPAREN: enterOuterAlt(_localctx, 1); { - setState(256); + setState(266); match(LPAREN); - setState(257); + setState(267); exp(); - setState(258); + setState(268); match(RPAREN); } break; - case IDENT: + case Ident: enterOuterAlt(_localctx, 2); { - setState(260); + setState(270); lVal(); } break; - case ILITERAL: - case FLITERAL: + case IntConst: + case FloatConst: enterOuterAlt(_localctx, 3); { - setState(261); + setState(271); number(); } break; @@ -1536,8 +1559,8 @@ public class SysYParser extends Parser { @SuppressWarnings("CheckReturnValue") public static class NumberContext extends ParserRuleContext { - public TerminalNode ILITERAL() { return getToken(SysYParser.ILITERAL, 0); } - public TerminalNode FLITERAL() { return getToken(SysYParser.FLITERAL, 0); } + public TerminalNode IntConst() { return getToken(SysYParser.IntConst, 0); } + public TerminalNode FloatConst() { return getToken(SysYParser.FloatConst, 0); } public NumberContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -1551,9 +1574,9 @@ public class SysYParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(264); + setState(274); _la = _input.LA(1); - if ( !(_la==ILITERAL || _la==FLITERAL) ) { + if ( !(_la==IntConst || _la==FloatConst) ) { _errHandler.recoverInline(this); } else { @@ -1598,7 +1621,7 @@ public class SysYParser extends Parser { } @SuppressWarnings("CheckReturnValue") public static class CallUnaryExpContext extends UnaryExpContext { - public TerminalNode IDENT() { return getToken(SysYParser.IDENT, 0); } + public TerminalNode Ident() { return getToken(SysYParser.Ident, 0); } public TerminalNode LPAREN() { return getToken(SysYParser.LPAREN, 0); } public TerminalNode RPAREN() { return getToken(SysYParser.RPAREN, 0); } public FuncRParamsContext funcRParams() { @@ -1619,14 +1642,14 @@ public class SysYParser extends Parser { enterRule(_localctx, 42, RULE_unaryExp); int _la; try { - setState(276); + setState(286); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) { case 1: _localctx = new PrimaryUnaryExpContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(266); + setState(276); primaryExp(); } break; @@ -1634,21 +1657,21 @@ public class SysYParser extends Parser { _localctx = new CallUnaryExpContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(267); - match(IDENT); - setState(268); + setState(277); + match(Ident); + setState(278); match(LPAREN); - setState(270); + setState(280); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 120334587904L) != 0)) { { - setState(269); + setState(279); funcRParams(); } } - setState(272); + setState(282); match(RPAREN); } break; @@ -1656,9 +1679,9 @@ public class SysYParser extends Parser { _localctx = new OpUnaryExpContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(273); + setState(283); unaryOp(); - setState(274); + setState(284); unaryExp(); } break; @@ -1693,7 +1716,7 @@ public class SysYParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(278); + setState(288); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 8394752L) != 0)) ) { _errHandler.recoverInline(this); @@ -1741,21 +1764,21 @@ public class SysYParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(280); + setState(290); exp(); - setState(285); + setState(295); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(281); + setState(291); match(COMMA); - setState(282); + setState(292); exp(); } } - setState(287); + setState(297); _errHandler.sync(this); _la = _input.LA(1); } @@ -1827,13 +1850,13 @@ public class SysYParser extends Parser { _ctx = _localctx; _prevctx = _localctx; - setState(289); + setState(299); unaryExp(); } _ctx.stop = _input.LT(-1); - setState(296); + setState(306); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,29,_ctx); + _alt = getInterpreter().adaptivePredict(_input,30,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); @@ -1842,9 +1865,9 @@ public class SysYParser extends Parser { { _localctx = new BinaryMulExpContext(new MulExpContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_mulExp); - setState(291); + setState(301); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(292); + setState(302); ((BinaryMulExpContext)_localctx).op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 57344L) != 0)) ) { @@ -1855,14 +1878,14 @@ public class SysYParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(293); + setState(303); unaryExp(); } } } - setState(298); + setState(308); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,29,_ctx); + _alt = getInterpreter().adaptivePredict(_input,30,_ctx); } } } @@ -1931,13 +1954,13 @@ public class SysYParser extends Parser { _ctx = _localctx; _prevctx = _localctx; - setState(300); + setState(310); mulExp(0); } _ctx.stop = _input.LT(-1); - setState(307); + setState(317); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,30,_ctx); + _alt = getInterpreter().adaptivePredict(_input,31,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); @@ -1946,9 +1969,9 @@ public class SysYParser extends Parser { { _localctx = new BinaryAddExpContext(new AddExpContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_addExp); - setState(302); + setState(312); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(303); + setState(313); ((BinaryAddExpContext)_localctx).op = _input.LT(1); _la = _input.LA(1); if ( !(_la==ADD || _la==SUB) ) { @@ -1959,14 +1982,14 @@ public class SysYParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(304); + setState(314); mulExp(0); } } } - setState(309); + setState(319); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,30,_ctx); + _alt = getInterpreter().adaptivePredict(_input,31,_ctx); } } } @@ -2037,13 +2060,13 @@ public class SysYParser extends Parser { _ctx = _localctx; _prevctx = _localctx; - setState(311); + setState(321); addExp(0); } _ctx.stop = _input.LT(-1); - setState(318); + setState(328); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,31,_ctx); + _alt = getInterpreter().adaptivePredict(_input,32,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); @@ -2052,9 +2075,9 @@ public class SysYParser extends Parser { { _localctx = new BinaryRelExpContext(new RelExpContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_relExp); - setState(313); + setState(323); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(314); + setState(324); ((BinaryRelExpContext)_localctx).op = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 7864320L) != 0)) ) { @@ -2065,14 +2088,14 @@ public class SysYParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(315); + setState(325); addExp(0); } } } - setState(320); + setState(330); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,31,_ctx); + _alt = getInterpreter().adaptivePredict(_input,32,_ctx); } } } @@ -2141,13 +2164,13 @@ public class SysYParser extends Parser { _ctx = _localctx; _prevctx = _localctx; - setState(322); + setState(332); relExp(0); } _ctx.stop = _input.LT(-1); - setState(329); + setState(339); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,32,_ctx); + _alt = getInterpreter().adaptivePredict(_input,33,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); @@ -2156,9 +2179,9 @@ public class SysYParser extends Parser { { _localctx = new BinaryEqExpContext(new EqExpContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_eqExp); - setState(324); + setState(334); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(325); + setState(335); ((BinaryEqExpContext)_localctx).op = _input.LT(1); _la = _input.LA(1); if ( !(_la==EQ || _la==NE) ) { @@ -2169,14 +2192,14 @@ public class SysYParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(326); + setState(336); relExp(0); } } } - setState(331); + setState(341); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,32,_ctx); + _alt = getInterpreter().adaptivePredict(_input,33,_ctx); } } } @@ -2242,13 +2265,13 @@ public class SysYParser extends Parser { _ctx = _localctx; _prevctx = _localctx; - setState(333); + setState(343); eqExp(0); } _ctx.stop = _input.LT(-1); - setState(340); + setState(350); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,33,_ctx); + _alt = getInterpreter().adaptivePredict(_input,34,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); @@ -2257,18 +2280,18 @@ public class SysYParser extends Parser { { _localctx = new BinaryLAndExpContext(new LAndExpContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_lAndExp); - setState(335); + setState(345); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(336); + setState(346); match(AND); - setState(337); + setState(347); eqExp(0); } } } - setState(342); + setState(352); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,33,_ctx); + _alt = getInterpreter().adaptivePredict(_input,34,_ctx); } } } @@ -2334,13 +2357,13 @@ public class SysYParser extends Parser { _ctx = _localctx; _prevctx = _localctx; - setState(344); + setState(354); lAndExp(0); } _ctx.stop = _input.LT(-1); - setState(351); + setState(361); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,34,_ctx); + _alt = getInterpreter().adaptivePredict(_input,35,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); @@ -2349,18 +2372,18 @@ public class SysYParser extends Parser { { _localctx = new BinaryLOrExpContext(new LOrExpContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_lOrExp); - setState(346); + setState(356); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(347); + setState(357); match(OR); - setState(348); + setState(358); lAndExp(0); } } } - setState(353); + setState(363); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,34,_ctx); + _alt = getInterpreter().adaptivePredict(_input,35,_ctx); } } } @@ -2392,7 +2415,7 @@ public class SysYParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(354); + setState(364); addExp(0); } } @@ -2468,7 +2491,7 @@ public class SysYParser extends Parser { } public static final String _serializedATN = - "\u0004\u0001\'\u0165\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0004\u0001\'\u016f\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ @@ -2489,213 +2512,220 @@ public class SysYParser extends Parser { "\u0003\u0005s\b\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+ "\u0005\u0006y\b\u0006\n\u0006\f\u0006|\t\u0006\u0001\u0006\u0001\u0006"+ "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0005\u0007"+ - "\u0085\b\u0007\n\u0007\f\u0007\u0088\t\u0007\u0001\u0007\u0001\u0007\u0003"+ - "\u0007\u008c\b\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0005\b\u0093"+ - "\b\b\n\b\f\b\u0096\t\b\u0003\b\u0098\b\b\u0001\b\u0003\b\u009b\b\b\u0001"+ - "\t\u0001\t\u0001\t\u0001\t\u0003\t\u00a1\b\t\u0001\t\u0001\t\u0001\t\u0001"+ - "\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0005\u000b\u00ab\b\u000b"+ - "\n\u000b\f\u000b\u00ae\t\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f"+ - "\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0005\f\u00bb\b\f\n\f"+ - "\f\f\u00be\t\f\u0003\f\u00c0\b\f\u0001\r\u0001\r\u0005\r\u00c4\b\r\n\r"+ - "\f\r\u00c7\t\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0003\u000e\u00cd"+ - "\b\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ - "\u000f\u0003\u000f\u00d5\b\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ - "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0003"+ - "\u000f\u00e0\b\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ - "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ - "\u000f\u0001\u000f\u0003\u000f\u00ee\b\u000f\u0001\u000f\u0003\u000f\u00f1"+ - "\b\u000f\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0012\u0001"+ - "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0005\u0012\u00fc\b\u0012\n"+ - "\u0012\f\u0012\u00ff\t\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ - "\u0013\u0001\u0013\u0001\u0013\u0003\u0013\u0107\b\u0013\u0001\u0014\u0001"+ - "\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0003\u0015\u010f"+ - "\b\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0003\u0015\u0115"+ - "\b\u0015\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0005"+ - "\u0017\u011c\b\u0017\n\u0017\f\u0017\u011f\t\u0017\u0001\u0018\u0001\u0018"+ - "\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u0127\b\u0018"+ - "\n\u0018\f\u0018\u012a\t\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ - "\u0019\u0001\u0019\u0001\u0019\u0005\u0019\u0132\b\u0019\n\u0019\f\u0019"+ - "\u0135\t\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a"+ - "\u0001\u001a\u0005\u001a\u013d\b\u001a\n\u001a\f\u001a\u0140\t\u001a\u0001"+ - "\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0005"+ - "\u001b\u0148\b\u001b\n\u001b\f\u001b\u014b\t\u001b\u0001\u001c\u0001\u001c"+ - "\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0005\u001c\u0153\b\u001c"+ - "\n\u001c\f\u001c\u0156\t\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001"+ - "\u001d\u0001\u001d\u0001\u001d\u0005\u001d\u015e\b\u001d\n\u001d\f\u001d"+ - "\u0161\t\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0000\u000602468:\u001f"+ - "\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a"+ - "\u001c\u001e \"$&(*,.02468:<\u0000\b\u0001\u0000\u0002\u0003\u0001\u0000"+ - "\u0002\u0004\u0001\u0000#$\u0002\u0000\u000b\f\u0017\u0017\u0001\u0000"+ - "\r\u000f\u0001\u0000\u000b\f\u0001\u0000\u0013\u0016\u0001\u0000\u0011"+ - "\u0012\u0170\u0000@\u0001\u0000\u0000\u0000\u0002H\u0001\u0000\u0000\u0000"+ - "\u0004J\u0001\u0000\u0000\u0000\u0006V\u0001\u0000\u0000\u0000\bX\u0001"+ - "\u0000\u0000\u0000\nr\u0001\u0000\u0000\u0000\ft\u0001\u0000\u0000\u0000"+ - "\u000e\u007f\u0001\u0000\u0000\u0000\u0010\u009a\u0001\u0000\u0000\u0000"+ - "\u0012\u009c\u0001\u0000\u0000\u0000\u0014\u00a5\u0001\u0000\u0000\u0000"+ - "\u0016\u00a7\u0001\u0000\u0000\u0000\u0018\u00bf\u0001\u0000\u0000\u0000"+ - "\u001a\u00c1\u0001\u0000\u0000\u0000\u001c\u00cc\u0001\u0000\u0000\u0000"+ - "\u001e\u00f0\u0001\u0000\u0000\u0000 \u00f2\u0001\u0000\u0000\u0000\""+ - "\u00f4\u0001\u0000\u0000\u0000$\u00f6\u0001\u0000\u0000\u0000&\u0106\u0001"+ - "\u0000\u0000\u0000(\u0108\u0001\u0000\u0000\u0000*\u0114\u0001\u0000\u0000"+ - "\u0000,\u0116\u0001\u0000\u0000\u0000.\u0118\u0001\u0000\u0000\u00000"+ - "\u0120\u0001\u0000\u0000\u00002\u012b\u0001\u0000\u0000\u00004\u0136\u0001"+ - "\u0000\u0000\u00006\u0141\u0001\u0000\u0000\u00008\u014c\u0001\u0000\u0000"+ - "\u0000:\u0157\u0001\u0000\u0000\u0000<\u0162\u0001\u0000\u0000\u0000>"+ - "A\u0003\u0002\u0001\u0000?A\u0003\u0012\t\u0000@>\u0001\u0000\u0000\u0000"+ - "@?\u0001\u0000\u0000\u0000AB\u0001\u0000\u0000\u0000B@\u0001\u0000\u0000"+ - "\u0000BC\u0001\u0000\u0000\u0000CD\u0001\u0000\u0000\u0000DE\u0005\u0000"+ - "\u0000\u0001E\u0001\u0001\u0000\u0000\u0000FI\u0003\u0004\u0002\u0000"+ - "GI\u0003\f\u0006\u0000HF\u0001\u0000\u0000\u0000HG\u0001\u0000\u0000\u0000"+ - "I\u0003\u0001\u0000\u0000\u0000JK\u0005\u0001\u0000\u0000KL\u0003\u0006"+ - "\u0003\u0000LQ\u0003\b\u0004\u0000MN\u0005 \u0000\u0000NP\u0003\b\u0004"+ - "\u0000OM\u0001\u0000\u0000\u0000PS\u0001\u0000\u0000\u0000QO\u0001\u0000"+ - "\u0000\u0000QR\u0001\u0000\u0000\u0000RT\u0001\u0000\u0000\u0000SQ\u0001"+ - "\u0000\u0000\u0000TU\u0005!\u0000\u0000U\u0005\u0001\u0000\u0000\u0000"+ - "VW\u0007\u0000\u0000\u0000W\u0007\u0001\u0000\u0000\u0000X_\u0005\"\u0000"+ - "\u0000YZ\u0005\u001c\u0000\u0000Z[\u0003<\u001e\u0000[\\\u0005\u001d\u0000"+ - "\u0000\\^\u0001\u0000\u0000\u0000]Y\u0001\u0000\u0000\u0000^a\u0001\u0000"+ - "\u0000\u0000_]\u0001\u0000\u0000\u0000_`\u0001\u0000\u0000\u0000`b\u0001"+ - "\u0000\u0000\u0000a_\u0001\u0000\u0000\u0000bc\u0005\u0010\u0000\u0000"+ - "cd\u0003\n\u0005\u0000d\t\u0001\u0000\u0000\u0000es\u0003<\u001e\u0000"+ - "fo\u0005\u001e\u0000\u0000gl\u0003\n\u0005\u0000hi\u0005 \u0000\u0000"+ - "ik\u0003\n\u0005\u0000jh\u0001\u0000\u0000\u0000kn\u0001\u0000\u0000\u0000"+ - "lj\u0001\u0000\u0000\u0000lm\u0001\u0000\u0000\u0000mp\u0001\u0000\u0000"+ - "\u0000nl\u0001\u0000\u0000\u0000og\u0001\u0000\u0000\u0000op\u0001\u0000"+ - "\u0000\u0000pq\u0001\u0000\u0000\u0000qs\u0005\u001f\u0000\u0000re\u0001"+ - "\u0000\u0000\u0000rf\u0001\u0000\u0000\u0000s\u000b\u0001\u0000\u0000"+ - "\u0000tu\u0003\u0006\u0003\u0000uz\u0003\u000e\u0007\u0000vw\u0005 \u0000"+ - "\u0000wy\u0003\u000e\u0007\u0000xv\u0001\u0000\u0000\u0000y|\u0001\u0000"+ - "\u0000\u0000zx\u0001\u0000\u0000\u0000z{\u0001\u0000\u0000\u0000{}\u0001"+ - "\u0000\u0000\u0000|z\u0001\u0000\u0000\u0000}~\u0005!\u0000\u0000~\r\u0001"+ - "\u0000\u0000\u0000\u007f\u0086\u0005\"\u0000\u0000\u0080\u0081\u0005\u001c"+ - "\u0000\u0000\u0081\u0082\u0003<\u001e\u0000\u0082\u0083\u0005\u001d\u0000"+ - "\u0000\u0083\u0085\u0001\u0000\u0000\u0000\u0084\u0080\u0001\u0000\u0000"+ - "\u0000\u0085\u0088\u0001\u0000\u0000\u0000\u0086\u0084\u0001\u0000\u0000"+ - "\u0000\u0086\u0087\u0001\u0000\u0000\u0000\u0087\u008b\u0001\u0000\u0000"+ - "\u0000\u0088\u0086\u0001\u0000\u0000\u0000\u0089\u008a\u0005\u0010\u0000"+ - "\u0000\u008a\u008c\u0003\u0010\b\u0000\u008b\u0089\u0001\u0000\u0000\u0000"+ - "\u008b\u008c\u0001\u0000\u0000\u0000\u008c\u000f\u0001\u0000\u0000\u0000"+ - "\u008d\u009b\u0003 \u0010\u0000\u008e\u0097\u0005\u001e\u0000\u0000\u008f"+ - "\u0094\u0003\u0010\b\u0000\u0090\u0091\u0005 \u0000\u0000\u0091\u0093"+ - "\u0003\u0010\b\u0000\u0092\u0090\u0001\u0000\u0000\u0000\u0093\u0096\u0001"+ - "\u0000\u0000\u0000\u0094\u0092\u0001\u0000\u0000\u0000\u0094\u0095\u0001"+ - "\u0000\u0000\u0000\u0095\u0098\u0001\u0000\u0000\u0000\u0096\u0094\u0001"+ - "\u0000\u0000\u0000\u0097\u008f\u0001\u0000\u0000\u0000\u0097\u0098\u0001"+ - "\u0000\u0000\u0000\u0098\u0099\u0001\u0000\u0000\u0000\u0099\u009b\u0005"+ - "\u001f\u0000\u0000\u009a\u008d\u0001\u0000\u0000\u0000\u009a\u008e\u0001"+ - "\u0000\u0000\u0000\u009b\u0011\u0001\u0000\u0000\u0000\u009c\u009d\u0003"+ - "\u0014\n\u0000\u009d\u009e\u0005\"\u0000\u0000\u009e\u00a0\u0005\u001a"+ - "\u0000\u0000\u009f\u00a1\u0003\u0016\u000b\u0000\u00a0\u009f\u0001\u0000"+ - "\u0000\u0000\u00a0\u00a1\u0001\u0000\u0000\u0000\u00a1\u00a2\u0001\u0000"+ - "\u0000\u0000\u00a2\u00a3\u0005\u001b\u0000\u0000\u00a3\u00a4\u0003\u001a"+ - "\r\u0000\u00a4\u0013\u0001\u0000\u0000\u0000\u00a5\u00a6\u0007\u0001\u0000"+ - "\u0000\u00a6\u0015\u0001\u0000\u0000\u0000\u00a7\u00ac\u0003\u0018\f\u0000"+ - "\u00a8\u00a9\u0005 \u0000\u0000\u00a9\u00ab\u0003\u0018\f\u0000\u00aa"+ - "\u00a8\u0001\u0000\u0000\u0000\u00ab\u00ae\u0001\u0000\u0000\u0000\u00ac"+ - "\u00aa\u0001\u0000\u0000\u0000\u00ac\u00ad\u0001\u0000\u0000\u0000\u00ad"+ - "\u0017\u0001\u0000\u0000\u0000\u00ae\u00ac\u0001\u0000\u0000\u0000\u00af"+ - "\u00b0\u0003\u0006\u0003\u0000\u00b0\u00b1\u0005\"\u0000\u0000\u00b1\u00c0"+ - "\u0001\u0000\u0000\u0000\u00b2\u00b3\u0003\u0006\u0003\u0000\u00b3\u00b4"+ - "\u0005\"\u0000\u0000\u00b4\u00b5\u0005\u001c\u0000\u0000\u00b5\u00bc\u0005"+ - "\u001d\u0000\u0000\u00b6\u00b7\u0005\u001c\u0000\u0000\u00b7\u00b8\u0003"+ - " \u0010\u0000\u00b8\u00b9\u0005\u001d\u0000\u0000\u00b9\u00bb\u0001\u0000"+ - "\u0000\u0000\u00ba\u00b6\u0001\u0000\u0000\u0000\u00bb\u00be\u0001\u0000"+ - "\u0000\u0000\u00bc\u00ba\u0001\u0000\u0000\u0000\u00bc\u00bd\u0001\u0000"+ - "\u0000\u0000\u00bd\u00c0\u0001\u0000\u0000\u0000\u00be\u00bc\u0001\u0000"+ - "\u0000\u0000\u00bf\u00af\u0001\u0000\u0000\u0000\u00bf\u00b2\u0001\u0000"+ - "\u0000\u0000\u00c0\u0019\u0001\u0000\u0000\u0000\u00c1\u00c5\u0005\u001e"+ - "\u0000\u0000\u00c2\u00c4\u0003\u001c\u000e\u0000\u00c3\u00c2\u0001\u0000"+ - "\u0000\u0000\u00c4\u00c7\u0001\u0000\u0000\u0000\u00c5\u00c3\u0001\u0000"+ - "\u0000\u0000\u00c5\u00c6\u0001\u0000\u0000\u0000\u00c6\u00c8\u0001\u0000"+ - "\u0000\u0000\u00c7\u00c5\u0001\u0000\u0000\u0000\u00c8\u00c9\u0005\u001f"+ - "\u0000\u0000\u00c9\u001b\u0001\u0000\u0000\u0000\u00ca\u00cd\u0003\u0002"+ - "\u0001\u0000\u00cb\u00cd\u0003\u001e\u000f\u0000\u00cc\u00ca\u0001\u0000"+ - "\u0000\u0000\u00cc\u00cb\u0001\u0000\u0000\u0000\u00cd\u001d\u0001\u0000"+ - "\u0000\u0000\u00ce\u00cf\u0003$\u0012\u0000\u00cf\u00d0\u0005\u0010\u0000"+ - "\u0000\u00d0\u00d1\u0003 \u0010\u0000\u00d1\u00d2\u0005!\u0000\u0000\u00d2"+ - "\u00f1\u0001\u0000\u0000\u0000\u00d3\u00d5\u0003 \u0010\u0000\u00d4\u00d3"+ - "\u0001\u0000\u0000\u0000\u00d4\u00d5\u0001\u0000\u0000\u0000\u00d5\u00d6"+ - "\u0001\u0000\u0000\u0000\u00d6\u00f1\u0005!\u0000\u0000\u00d7\u00f1\u0003"+ - "\u001a\r\u0000\u00d8\u00d9\u0005\u0005\u0000\u0000\u00d9\u00da\u0005\u001a"+ - "\u0000\u0000\u00da\u00db\u0003\"\u0011\u0000\u00db\u00dc\u0005\u001b\u0000"+ - "\u0000\u00dc\u00df\u0003\u001e\u000f\u0000\u00dd\u00de\u0005\u0006\u0000"+ - "\u0000\u00de\u00e0\u0003\u001e\u000f\u0000\u00df\u00dd\u0001\u0000\u0000"+ - "\u0000\u00df\u00e0\u0001\u0000\u0000\u0000\u00e0\u00f1\u0001\u0000\u0000"+ - "\u0000\u00e1\u00e2\u0005\u0007\u0000\u0000\u00e2\u00e3\u0005\u001a\u0000"+ - "\u0000\u00e3\u00e4\u0003\"\u0011\u0000\u00e4\u00e5\u0005\u001b\u0000\u0000"+ - "\u00e5\u00e6\u0003\u001e\u000f\u0000\u00e6\u00f1\u0001\u0000\u0000\u0000"+ - "\u00e7\u00e8\u0005\b\u0000\u0000\u00e8\u00f1\u0005!\u0000\u0000\u00e9"+ - "\u00ea\u0005\t\u0000\u0000\u00ea\u00f1\u0005!\u0000\u0000\u00eb\u00ed"+ - "\u0005\n\u0000\u0000\u00ec\u00ee\u0003 \u0010\u0000\u00ed\u00ec\u0001"+ - "\u0000\u0000\u0000\u00ed\u00ee\u0001\u0000\u0000\u0000\u00ee\u00ef\u0001"+ - "\u0000\u0000\u0000\u00ef\u00f1\u0005!\u0000\u0000\u00f0\u00ce\u0001\u0000"+ - "\u0000\u0000\u00f0\u00d4\u0001\u0000\u0000\u0000\u00f0\u00d7\u0001\u0000"+ - "\u0000\u0000\u00f0\u00d8\u0001\u0000\u0000\u0000\u00f0\u00e1\u0001\u0000"+ - "\u0000\u0000\u00f0\u00e7\u0001\u0000\u0000\u0000\u00f0\u00e9\u0001\u0000"+ - "\u0000\u0000\u00f0\u00eb\u0001\u0000\u0000\u0000\u00f1\u001f\u0001\u0000"+ - "\u0000\u0000\u00f2\u00f3\u00032\u0019\u0000\u00f3!\u0001\u0000\u0000\u0000"+ - "\u00f4\u00f5\u0003:\u001d\u0000\u00f5#\u0001\u0000\u0000\u0000\u00f6\u00fd"+ - "\u0005\"\u0000\u0000\u00f7\u00f8\u0005\u001c\u0000\u0000\u00f8\u00f9\u0003"+ - " \u0010\u0000\u00f9\u00fa\u0005\u001d\u0000\u0000\u00fa\u00fc\u0001\u0000"+ - "\u0000\u0000\u00fb\u00f7\u0001\u0000\u0000\u0000\u00fc\u00ff\u0001\u0000"+ - "\u0000\u0000\u00fd\u00fb\u0001\u0000\u0000\u0000\u00fd\u00fe\u0001\u0000"+ - "\u0000\u0000\u00fe%\u0001\u0000\u0000\u0000\u00ff\u00fd\u0001\u0000\u0000"+ - "\u0000\u0100\u0101\u0005\u001a\u0000\u0000\u0101\u0102\u0003 \u0010\u0000"+ - "\u0102\u0103\u0005\u001b\u0000\u0000\u0103\u0107\u0001\u0000\u0000\u0000"+ - "\u0104\u0107\u0003$\u0012\u0000\u0105\u0107\u0003(\u0014\u0000\u0106\u0100"+ - "\u0001\u0000\u0000\u0000\u0106\u0104\u0001\u0000\u0000\u0000\u0106\u0105"+ - "\u0001\u0000\u0000\u0000\u0107\'\u0001\u0000\u0000\u0000\u0108\u0109\u0007"+ - "\u0002\u0000\u0000\u0109)\u0001\u0000\u0000\u0000\u010a\u0115\u0003&\u0013"+ - "\u0000\u010b\u010c\u0005\"\u0000\u0000\u010c\u010e\u0005\u001a\u0000\u0000"+ - "\u010d\u010f\u0003.\u0017\u0000\u010e\u010d\u0001\u0000\u0000\u0000\u010e"+ - "\u010f\u0001\u0000\u0000\u0000\u010f\u0110\u0001\u0000\u0000\u0000\u0110"+ - "\u0115\u0005\u001b\u0000\u0000\u0111\u0112\u0003,\u0016\u0000\u0112\u0113"+ - "\u0003*\u0015\u0000\u0113\u0115\u0001\u0000\u0000\u0000\u0114\u010a\u0001"+ - "\u0000\u0000\u0000\u0114\u010b\u0001\u0000\u0000\u0000\u0114\u0111\u0001"+ - "\u0000\u0000\u0000\u0115+\u0001\u0000\u0000\u0000\u0116\u0117\u0007\u0003"+ - "\u0000\u0000\u0117-\u0001\u0000\u0000\u0000\u0118\u011d\u0003 \u0010\u0000"+ - "\u0119\u011a\u0005 \u0000\u0000\u011a\u011c\u0003 \u0010\u0000\u011b\u0119"+ - "\u0001\u0000\u0000\u0000\u011c\u011f\u0001\u0000\u0000\u0000\u011d\u011b"+ - "\u0001\u0000\u0000\u0000\u011d\u011e\u0001\u0000\u0000\u0000\u011e/\u0001"+ - "\u0000\u0000\u0000\u011f\u011d\u0001\u0000\u0000\u0000\u0120\u0121\u0006"+ - "\u0018\uffff\uffff\u0000\u0121\u0122\u0003*\u0015\u0000\u0122\u0128\u0001"+ - "\u0000\u0000\u0000\u0123\u0124\n\u0001\u0000\u0000\u0124\u0125\u0007\u0004"+ - "\u0000\u0000\u0125\u0127\u0003*\u0015\u0000\u0126\u0123\u0001\u0000\u0000"+ - "\u0000\u0127\u012a\u0001\u0000\u0000\u0000\u0128\u0126\u0001\u0000\u0000"+ - "\u0000\u0128\u0129\u0001\u0000\u0000\u0000\u01291\u0001\u0000\u0000\u0000"+ - "\u012a\u0128\u0001\u0000\u0000\u0000\u012b\u012c\u0006\u0019\uffff\uffff"+ - "\u0000\u012c\u012d\u00030\u0018\u0000\u012d\u0133\u0001\u0000\u0000\u0000"+ - "\u012e\u012f\n\u0001\u0000\u0000\u012f\u0130\u0007\u0005\u0000\u0000\u0130"+ - "\u0132\u00030\u0018\u0000\u0131\u012e\u0001\u0000\u0000\u0000\u0132\u0135"+ - "\u0001\u0000\u0000\u0000\u0133\u0131\u0001\u0000\u0000\u0000\u0133\u0134"+ - "\u0001\u0000\u0000\u0000\u01343\u0001\u0000\u0000\u0000\u0135\u0133\u0001"+ - "\u0000\u0000\u0000\u0136\u0137\u0006\u001a\uffff\uffff\u0000\u0137\u0138"+ - "\u00032\u0019\u0000\u0138\u013e\u0001\u0000\u0000\u0000\u0139\u013a\n"+ - "\u0001\u0000\u0000\u013a\u013b\u0007\u0006\u0000\u0000\u013b\u013d\u0003"+ - "2\u0019\u0000\u013c\u0139\u0001\u0000\u0000\u0000\u013d\u0140\u0001\u0000"+ - "\u0000\u0000\u013e\u013c\u0001\u0000\u0000\u0000\u013e\u013f\u0001\u0000"+ - "\u0000\u0000\u013f5\u0001\u0000\u0000\u0000\u0140\u013e\u0001\u0000\u0000"+ - "\u0000\u0141\u0142\u0006\u001b\uffff\uffff\u0000\u0142\u0143\u00034\u001a"+ - "\u0000\u0143\u0149\u0001\u0000\u0000\u0000\u0144\u0145\n\u0001\u0000\u0000"+ - "\u0145\u0146\u0007\u0007\u0000\u0000\u0146\u0148\u00034\u001a\u0000\u0147"+ - "\u0144\u0001\u0000\u0000\u0000\u0148\u014b\u0001\u0000\u0000\u0000\u0149"+ - "\u0147\u0001\u0000\u0000\u0000\u0149\u014a\u0001\u0000\u0000\u0000\u014a"+ - "7\u0001\u0000\u0000\u0000\u014b\u0149\u0001\u0000\u0000\u0000\u014c\u014d"+ - "\u0006\u001c\uffff\uffff\u0000\u014d\u014e\u00036\u001b\u0000\u014e\u0154"+ - "\u0001\u0000\u0000\u0000\u014f\u0150\n\u0001\u0000\u0000\u0150\u0151\u0005"+ - "\u0018\u0000\u0000\u0151\u0153\u00036\u001b\u0000\u0152\u014f\u0001\u0000"+ - "\u0000\u0000\u0153\u0156\u0001\u0000\u0000\u0000\u0154\u0152\u0001\u0000"+ - "\u0000\u0000\u0154\u0155\u0001\u0000\u0000\u0000\u01559\u0001\u0000\u0000"+ - "\u0000\u0156\u0154\u0001\u0000\u0000\u0000\u0157\u0158\u0006\u001d\uffff"+ - "\uffff\u0000\u0158\u0159\u00038\u001c\u0000\u0159\u015f\u0001\u0000\u0000"+ - "\u0000\u015a\u015b\n\u0001\u0000\u0000\u015b\u015c\u0005\u0019\u0000\u0000"+ - "\u015c\u015e\u00038\u001c\u0000\u015d\u015a\u0001\u0000\u0000\u0000\u015e"+ - "\u0161\u0001\u0000\u0000\u0000\u015f\u015d\u0001\u0000\u0000\u0000\u015f"+ - "\u0160\u0001\u0000\u0000\u0000\u0160;\u0001\u0000\u0000\u0000\u0161\u015f"+ - "\u0001\u0000\u0000\u0000\u0162\u0163\u00032\u0019\u0000\u0163=\u0001\u0000"+ - "\u0000\u0000#@BHQ_lorz\u0086\u008b\u0094\u0097\u009a\u00a0\u00ac\u00bc"+ - "\u00bf\u00c5\u00cc\u00d4\u00df\u00ed\u00f0\u00fd\u0106\u010e\u0114\u011d"+ - "\u0128\u0133\u013e\u0149\u0154\u015f"; + "\u0085\b\u0007\n\u0007\f\u0007\u0088\t\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0005\u0007\u008f\b\u0007\n\u0007\f\u0007"+ + "\u0092\t\u0007\u0001\u0007\u0001\u0007\u0003\u0007\u0096\b\u0007\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0005\b\u009d\b\b\n\b\f\b\u00a0\t\b"+ + "\u0003\b\u00a2\b\b\u0001\b\u0003\b\u00a5\b\b\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0003\t\u00ab\b\t\u0001\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0005\u000b\u00b5\b\u000b\n\u000b\f\u000b\u00b8"+ + "\t\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0001"+ + "\f\u0001\f\u0001\f\u0001\f\u0005\f\u00c5\b\f\n\f\f\f\u00c8\t\f\u0003\f"+ + "\u00ca\b\f\u0001\r\u0001\r\u0005\r\u00ce\b\r\n\r\f\r\u00d1\t\r\u0001\r"+ + "\u0001\r\u0001\u000e\u0001\u000e\u0003\u000e\u00d7\b\u000e\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0003\u000f"+ + "\u00df\b\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u00ea\b\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0003\u000f\u00f8\b\u000f\u0001\u000f\u0003\u000f\u00fb\b\u000f\u0001"+ + "\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0012\u0001\u0012\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0005\u0012\u0106\b\u0012\n\u0012\f\u0012"+ + "\u0109\t\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013"+ + "\u0001\u0013\u0003\u0013\u0111\b\u0013\u0001\u0014\u0001\u0014\u0001\u0015"+ + "\u0001\u0015\u0001\u0015\u0001\u0015\u0003\u0015\u0119\b\u0015\u0001\u0015"+ + "\u0001\u0015\u0001\u0015\u0001\u0015\u0003\u0015\u011f\b\u0015\u0001\u0016"+ + "\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0005\u0017\u0126\b\u0017"+ + "\n\u0017\f\u0017\u0129\t\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0005\u0018\u0131\b\u0018\n\u0018\f\u0018"+ + "\u0134\t\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0001\u0019\u0005\u0019\u013c\b\u0019\n\u0019\f\u0019\u013f\t\u0019\u0001"+ + "\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0005"+ + "\u001a\u0147\b\u001a\n\u001a\f\u001a\u014a\t\u001a\u0001\u001b\u0001\u001b"+ + "\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0005\u001b\u0152\b\u001b"+ + "\n\u001b\f\u001b\u0155\t\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ + "\u001c\u0001\u001c\u0001\u001c\u0005\u001c\u015d\b\u001c\n\u001c\f\u001c"+ + "\u0160\t\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d"+ + "\u0001\u001d\u0005\u001d\u0168\b\u001d\n\u001d\f\u001d\u016b\t\u001d\u0001"+ + "\u001e\u0001\u001e\u0001\u001e\u0000\u000602468:\u001f\u0000\u0002\u0004"+ + "\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \""+ + "$&(*,.02468:<\u0000\b\u0001\u0000\u0002\u0003\u0001\u0000\u0002\u0004"+ + "\u0001\u0000#$\u0002\u0000\u000b\f\u0017\u0017\u0001\u0000\r\u000f\u0001"+ + "\u0000\u000b\f\u0001\u0000\u0013\u0016\u0001\u0000\u0011\u0012\u017b\u0000"+ + "@\u0001\u0000\u0000\u0000\u0002H\u0001\u0000\u0000\u0000\u0004J\u0001"+ + "\u0000\u0000\u0000\u0006V\u0001\u0000\u0000\u0000\bX\u0001\u0000\u0000"+ + "\u0000\nr\u0001\u0000\u0000\u0000\ft\u0001\u0000\u0000\u0000\u000e\u0095"+ + "\u0001\u0000\u0000\u0000\u0010\u00a4\u0001\u0000\u0000\u0000\u0012\u00a6"+ + "\u0001\u0000\u0000\u0000\u0014\u00af\u0001\u0000\u0000\u0000\u0016\u00b1"+ + "\u0001\u0000\u0000\u0000\u0018\u00c9\u0001\u0000\u0000\u0000\u001a\u00cb"+ + "\u0001\u0000\u0000\u0000\u001c\u00d6\u0001\u0000\u0000\u0000\u001e\u00fa"+ + "\u0001\u0000\u0000\u0000 \u00fc\u0001\u0000\u0000\u0000\"\u00fe\u0001"+ + "\u0000\u0000\u0000$\u0100\u0001\u0000\u0000\u0000&\u0110\u0001\u0000\u0000"+ + "\u0000(\u0112\u0001\u0000\u0000\u0000*\u011e\u0001\u0000\u0000\u0000,"+ + "\u0120\u0001\u0000\u0000\u0000.\u0122\u0001\u0000\u0000\u00000\u012a\u0001"+ + "\u0000\u0000\u00002\u0135\u0001\u0000\u0000\u00004\u0140\u0001\u0000\u0000"+ + "\u00006\u014b\u0001\u0000\u0000\u00008\u0156\u0001\u0000\u0000\u0000:"+ + "\u0161\u0001\u0000\u0000\u0000<\u016c\u0001\u0000\u0000\u0000>A\u0003"+ + "\u0002\u0001\u0000?A\u0003\u0012\t\u0000@>\u0001\u0000\u0000\u0000@?\u0001"+ + "\u0000\u0000\u0000AB\u0001\u0000\u0000\u0000B@\u0001\u0000\u0000\u0000"+ + "BC\u0001\u0000\u0000\u0000CD\u0001\u0000\u0000\u0000DE\u0005\u0000\u0000"+ + "\u0001E\u0001\u0001\u0000\u0000\u0000FI\u0003\u0004\u0002\u0000GI\u0003"+ + "\f\u0006\u0000HF\u0001\u0000\u0000\u0000HG\u0001\u0000\u0000\u0000I\u0003"+ + "\u0001\u0000\u0000\u0000JK\u0005\u0001\u0000\u0000KL\u0003\u0006\u0003"+ + "\u0000LQ\u0003\b\u0004\u0000MN\u0005 \u0000\u0000NP\u0003\b\u0004\u0000"+ + "OM\u0001\u0000\u0000\u0000PS\u0001\u0000\u0000\u0000QO\u0001\u0000\u0000"+ + "\u0000QR\u0001\u0000\u0000\u0000RT\u0001\u0000\u0000\u0000SQ\u0001\u0000"+ + "\u0000\u0000TU\u0005!\u0000\u0000U\u0005\u0001\u0000\u0000\u0000VW\u0007"+ + "\u0000\u0000\u0000W\u0007\u0001\u0000\u0000\u0000X_\u0005\"\u0000\u0000"+ + "YZ\u0005\u001c\u0000\u0000Z[\u0003<\u001e\u0000[\\\u0005\u001d\u0000\u0000"+ + "\\^\u0001\u0000\u0000\u0000]Y\u0001\u0000\u0000\u0000^a\u0001\u0000\u0000"+ + "\u0000_]\u0001\u0000\u0000\u0000_`\u0001\u0000\u0000\u0000`b\u0001\u0000"+ + "\u0000\u0000a_\u0001\u0000\u0000\u0000bc\u0005\u0010\u0000\u0000cd\u0003"+ + "\n\u0005\u0000d\t\u0001\u0000\u0000\u0000es\u0003<\u001e\u0000fo\u0005"+ + "\u001e\u0000\u0000gl\u0003\n\u0005\u0000hi\u0005 \u0000\u0000ik\u0003"+ + "\n\u0005\u0000jh\u0001\u0000\u0000\u0000kn\u0001\u0000\u0000\u0000lj\u0001"+ + "\u0000\u0000\u0000lm\u0001\u0000\u0000\u0000mp\u0001\u0000\u0000\u0000"+ + "nl\u0001\u0000\u0000\u0000og\u0001\u0000\u0000\u0000op\u0001\u0000\u0000"+ + "\u0000pq\u0001\u0000\u0000\u0000qs\u0005\u001f\u0000\u0000re\u0001\u0000"+ + "\u0000\u0000rf\u0001\u0000\u0000\u0000s\u000b\u0001\u0000\u0000\u0000"+ + "tu\u0003\u0006\u0003\u0000uz\u0003\u000e\u0007\u0000vw\u0005 \u0000\u0000"+ + "wy\u0003\u000e\u0007\u0000xv\u0001\u0000\u0000\u0000y|\u0001\u0000\u0000"+ + "\u0000zx\u0001\u0000\u0000\u0000z{\u0001\u0000\u0000\u0000{}\u0001\u0000"+ + "\u0000\u0000|z\u0001\u0000\u0000\u0000}~\u0005!\u0000\u0000~\r\u0001\u0000"+ + "\u0000\u0000\u007f\u0086\u0005\"\u0000\u0000\u0080\u0081\u0005\u001c\u0000"+ + "\u0000\u0081\u0082\u0003<\u001e\u0000\u0082\u0083\u0005\u001d\u0000\u0000"+ + "\u0083\u0085\u0001\u0000\u0000\u0000\u0084\u0080\u0001\u0000\u0000\u0000"+ + "\u0085\u0088\u0001\u0000\u0000\u0000\u0086\u0084\u0001\u0000\u0000\u0000"+ + "\u0086\u0087\u0001\u0000\u0000\u0000\u0087\u0096\u0001\u0000\u0000\u0000"+ + "\u0088\u0086\u0001\u0000\u0000\u0000\u0089\u0090\u0005\"\u0000\u0000\u008a"+ + "\u008b\u0005\u001c\u0000\u0000\u008b\u008c\u0003<\u001e\u0000\u008c\u008d"+ + "\u0005\u001d\u0000\u0000\u008d\u008f\u0001\u0000\u0000\u0000\u008e\u008a"+ + "\u0001\u0000\u0000\u0000\u008f\u0092\u0001\u0000\u0000\u0000\u0090\u008e"+ + "\u0001\u0000\u0000\u0000\u0090\u0091\u0001\u0000\u0000\u0000\u0091\u0093"+ + "\u0001\u0000\u0000\u0000\u0092\u0090\u0001\u0000\u0000\u0000\u0093\u0094"+ + "\u0005\u0010\u0000\u0000\u0094\u0096\u0003\u0010\b\u0000\u0095\u007f\u0001"+ + "\u0000\u0000\u0000\u0095\u0089\u0001\u0000\u0000\u0000\u0096\u000f\u0001"+ + "\u0000\u0000\u0000\u0097\u00a5\u0003 \u0010\u0000\u0098\u00a1\u0005\u001e"+ + "\u0000\u0000\u0099\u009e\u0003\u0010\b\u0000\u009a\u009b\u0005 \u0000"+ + "\u0000\u009b\u009d\u0003\u0010\b\u0000\u009c\u009a\u0001\u0000\u0000\u0000"+ + "\u009d\u00a0\u0001\u0000\u0000\u0000\u009e\u009c\u0001\u0000\u0000\u0000"+ + "\u009e\u009f\u0001\u0000\u0000\u0000\u009f\u00a2\u0001\u0000\u0000\u0000"+ + "\u00a0\u009e\u0001\u0000\u0000\u0000\u00a1\u0099\u0001\u0000\u0000\u0000"+ + "\u00a1\u00a2\u0001\u0000\u0000\u0000\u00a2\u00a3\u0001\u0000\u0000\u0000"+ + "\u00a3\u00a5\u0005\u001f\u0000\u0000\u00a4\u0097\u0001\u0000\u0000\u0000"+ + "\u00a4\u0098\u0001\u0000\u0000\u0000\u00a5\u0011\u0001\u0000\u0000\u0000"+ + "\u00a6\u00a7\u0003\u0014\n\u0000\u00a7\u00a8\u0005\"\u0000\u0000\u00a8"+ + "\u00aa\u0005\u001a\u0000\u0000\u00a9\u00ab\u0003\u0016\u000b\u0000\u00aa"+ + "\u00a9\u0001\u0000\u0000\u0000\u00aa\u00ab\u0001\u0000\u0000\u0000\u00ab"+ + "\u00ac\u0001\u0000\u0000\u0000\u00ac\u00ad\u0005\u001b\u0000\u0000\u00ad"+ + "\u00ae\u0003\u001a\r\u0000\u00ae\u0013\u0001\u0000\u0000\u0000\u00af\u00b0"+ + "\u0007\u0001\u0000\u0000\u00b0\u0015\u0001\u0000\u0000\u0000\u00b1\u00b6"+ + "\u0003\u0018\f\u0000\u00b2\u00b3\u0005 \u0000\u0000\u00b3\u00b5\u0003"+ + "\u0018\f\u0000\u00b4\u00b2\u0001\u0000\u0000\u0000\u00b5\u00b8\u0001\u0000"+ + "\u0000\u0000\u00b6\u00b4\u0001\u0000\u0000\u0000\u00b6\u00b7\u0001\u0000"+ + "\u0000\u0000\u00b7\u0017\u0001\u0000\u0000\u0000\u00b8\u00b6\u0001\u0000"+ + "\u0000\u0000\u00b9\u00ba\u0003\u0006\u0003\u0000\u00ba\u00bb\u0005\"\u0000"+ + "\u0000\u00bb\u00ca\u0001\u0000\u0000\u0000\u00bc\u00bd\u0003\u0006\u0003"+ + "\u0000\u00bd\u00be\u0005\"\u0000\u0000\u00be\u00bf\u0005\u001c\u0000\u0000"+ + "\u00bf\u00c6\u0005\u001d\u0000\u0000\u00c0\u00c1\u0005\u001c\u0000\u0000"+ + "\u00c1\u00c2\u0003 \u0010\u0000\u00c2\u00c3\u0005\u001d\u0000\u0000\u00c3"+ + "\u00c5\u0001\u0000\u0000\u0000\u00c4\u00c0\u0001\u0000\u0000\u0000\u00c5"+ + "\u00c8\u0001\u0000\u0000\u0000\u00c6\u00c4\u0001\u0000\u0000\u0000\u00c6"+ + "\u00c7\u0001\u0000\u0000\u0000\u00c7\u00ca\u0001\u0000\u0000\u0000\u00c8"+ + "\u00c6\u0001\u0000\u0000\u0000\u00c9\u00b9\u0001\u0000\u0000\u0000\u00c9"+ + "\u00bc\u0001\u0000\u0000\u0000\u00ca\u0019\u0001\u0000\u0000\u0000\u00cb"+ + "\u00cf\u0005\u001e\u0000\u0000\u00cc\u00ce\u0003\u001c\u000e\u0000\u00cd"+ + "\u00cc\u0001\u0000\u0000\u0000\u00ce\u00d1\u0001\u0000\u0000\u0000\u00cf"+ + "\u00cd\u0001\u0000\u0000\u0000\u00cf\u00d0\u0001\u0000\u0000\u0000\u00d0"+ + "\u00d2\u0001\u0000\u0000\u0000\u00d1\u00cf\u0001\u0000\u0000\u0000\u00d2"+ + "\u00d3\u0005\u001f\u0000\u0000\u00d3\u001b\u0001\u0000\u0000\u0000\u00d4"+ + "\u00d7\u0003\u0002\u0001\u0000\u00d5\u00d7\u0003\u001e\u000f\u0000\u00d6"+ + "\u00d4\u0001\u0000\u0000\u0000\u00d6\u00d5\u0001\u0000\u0000\u0000\u00d7"+ + "\u001d\u0001\u0000\u0000\u0000\u00d8\u00d9\u0003$\u0012\u0000\u00d9\u00da"+ + "\u0005\u0010\u0000\u0000\u00da\u00db\u0003 \u0010\u0000\u00db\u00dc\u0005"+ + "!\u0000\u0000\u00dc\u00fb\u0001\u0000\u0000\u0000\u00dd\u00df\u0003 \u0010"+ + "\u0000\u00de\u00dd\u0001\u0000\u0000\u0000\u00de\u00df\u0001\u0000\u0000"+ + "\u0000\u00df\u00e0\u0001\u0000\u0000\u0000\u00e0\u00fb\u0005!\u0000\u0000"+ + "\u00e1\u00fb\u0003\u001a\r\u0000\u00e2\u00e3\u0005\u0005\u0000\u0000\u00e3"+ + "\u00e4\u0005\u001a\u0000\u0000\u00e4\u00e5\u0003\"\u0011\u0000\u00e5\u00e6"+ + "\u0005\u001b\u0000\u0000\u00e6\u00e9\u0003\u001e\u000f\u0000\u00e7\u00e8"+ + "\u0005\u0006\u0000\u0000\u00e8\u00ea\u0003\u001e\u000f\u0000\u00e9\u00e7"+ + "\u0001\u0000\u0000\u0000\u00e9\u00ea\u0001\u0000\u0000\u0000\u00ea\u00fb"+ + "\u0001\u0000\u0000\u0000\u00eb\u00ec\u0005\u0007\u0000\u0000\u00ec\u00ed"+ + "\u0005\u001a\u0000\u0000\u00ed\u00ee\u0003\"\u0011\u0000\u00ee\u00ef\u0005"+ + "\u001b\u0000\u0000\u00ef\u00f0\u0003\u001e\u000f\u0000\u00f0\u00fb\u0001"+ + "\u0000\u0000\u0000\u00f1\u00f2\u0005\b\u0000\u0000\u00f2\u00fb\u0005!"+ + "\u0000\u0000\u00f3\u00f4\u0005\t\u0000\u0000\u00f4\u00fb\u0005!\u0000"+ + "\u0000\u00f5\u00f7\u0005\n\u0000\u0000\u00f6\u00f8\u0003 \u0010\u0000"+ + "\u00f7\u00f6\u0001\u0000\u0000\u0000\u00f7\u00f8\u0001\u0000\u0000\u0000"+ + "\u00f8\u00f9\u0001\u0000\u0000\u0000\u00f9\u00fb\u0005!\u0000\u0000\u00fa"+ + "\u00d8\u0001\u0000\u0000\u0000\u00fa\u00de\u0001\u0000\u0000\u0000\u00fa"+ + "\u00e1\u0001\u0000\u0000\u0000\u00fa\u00e2\u0001\u0000\u0000\u0000\u00fa"+ + "\u00eb\u0001\u0000\u0000\u0000\u00fa\u00f1\u0001\u0000\u0000\u0000\u00fa"+ + "\u00f3\u0001\u0000\u0000\u0000\u00fa\u00f5\u0001\u0000\u0000\u0000\u00fb"+ + "\u001f\u0001\u0000\u0000\u0000\u00fc\u00fd\u00032\u0019\u0000\u00fd!\u0001"+ + "\u0000\u0000\u0000\u00fe\u00ff\u0003:\u001d\u0000\u00ff#\u0001\u0000\u0000"+ + "\u0000\u0100\u0107\u0005\"\u0000\u0000\u0101\u0102\u0005\u001c\u0000\u0000"+ + "\u0102\u0103\u0003 \u0010\u0000\u0103\u0104\u0005\u001d\u0000\u0000\u0104"+ + "\u0106\u0001\u0000\u0000\u0000\u0105\u0101\u0001\u0000\u0000\u0000\u0106"+ + "\u0109\u0001\u0000\u0000\u0000\u0107\u0105\u0001\u0000\u0000\u0000\u0107"+ + "\u0108\u0001\u0000\u0000\u0000\u0108%\u0001\u0000\u0000\u0000\u0109\u0107"+ + "\u0001\u0000\u0000\u0000\u010a\u010b\u0005\u001a\u0000\u0000\u010b\u010c"+ + "\u0003 \u0010\u0000\u010c\u010d\u0005\u001b\u0000\u0000\u010d\u0111\u0001"+ + "\u0000\u0000\u0000\u010e\u0111\u0003$\u0012\u0000\u010f\u0111\u0003(\u0014"+ + "\u0000\u0110\u010a\u0001\u0000\u0000\u0000\u0110\u010e\u0001\u0000\u0000"+ + "\u0000\u0110\u010f\u0001\u0000\u0000\u0000\u0111\'\u0001\u0000\u0000\u0000"+ + "\u0112\u0113\u0007\u0002\u0000\u0000\u0113)\u0001\u0000\u0000\u0000\u0114"+ + "\u011f\u0003&\u0013\u0000\u0115\u0116\u0005\"\u0000\u0000\u0116\u0118"+ + "\u0005\u001a\u0000\u0000\u0117\u0119\u0003.\u0017\u0000\u0118\u0117\u0001"+ + "\u0000\u0000\u0000\u0118\u0119\u0001\u0000\u0000\u0000\u0119\u011a\u0001"+ + "\u0000\u0000\u0000\u011a\u011f\u0005\u001b\u0000\u0000\u011b\u011c\u0003"+ + ",\u0016\u0000\u011c\u011d\u0003*\u0015\u0000\u011d\u011f\u0001\u0000\u0000"+ + "\u0000\u011e\u0114\u0001\u0000\u0000\u0000\u011e\u0115\u0001\u0000\u0000"+ + "\u0000\u011e\u011b\u0001\u0000\u0000\u0000\u011f+\u0001\u0000\u0000\u0000"+ + "\u0120\u0121\u0007\u0003\u0000\u0000\u0121-\u0001\u0000\u0000\u0000\u0122"+ + "\u0127\u0003 \u0010\u0000\u0123\u0124\u0005 \u0000\u0000\u0124\u0126\u0003"+ + " \u0010\u0000\u0125\u0123\u0001\u0000\u0000\u0000\u0126\u0129\u0001\u0000"+ + "\u0000\u0000\u0127\u0125\u0001\u0000\u0000\u0000\u0127\u0128\u0001\u0000"+ + "\u0000\u0000\u0128/\u0001\u0000\u0000\u0000\u0129\u0127\u0001\u0000\u0000"+ + "\u0000\u012a\u012b\u0006\u0018\uffff\uffff\u0000\u012b\u012c\u0003*\u0015"+ + "\u0000\u012c\u0132\u0001\u0000\u0000\u0000\u012d\u012e\n\u0001\u0000\u0000"+ + "\u012e\u012f\u0007\u0004\u0000\u0000\u012f\u0131\u0003*\u0015\u0000\u0130"+ + "\u012d\u0001\u0000\u0000\u0000\u0131\u0134\u0001\u0000\u0000\u0000\u0132"+ + "\u0130\u0001\u0000\u0000\u0000\u0132\u0133\u0001\u0000\u0000\u0000\u0133"+ + "1\u0001\u0000\u0000\u0000\u0134\u0132\u0001\u0000\u0000\u0000\u0135\u0136"+ + "\u0006\u0019\uffff\uffff\u0000\u0136\u0137\u00030\u0018\u0000\u0137\u013d"+ + "\u0001\u0000\u0000\u0000\u0138\u0139\n\u0001\u0000\u0000\u0139\u013a\u0007"+ + "\u0005\u0000\u0000\u013a\u013c\u00030\u0018\u0000\u013b\u0138\u0001\u0000"+ + "\u0000\u0000\u013c\u013f\u0001\u0000\u0000\u0000\u013d\u013b\u0001\u0000"+ + "\u0000\u0000\u013d\u013e\u0001\u0000\u0000\u0000\u013e3\u0001\u0000\u0000"+ + "\u0000\u013f\u013d\u0001\u0000\u0000\u0000\u0140\u0141\u0006\u001a\uffff"+ + "\uffff\u0000\u0141\u0142\u00032\u0019\u0000\u0142\u0148\u0001\u0000\u0000"+ + "\u0000\u0143\u0144\n\u0001\u0000\u0000\u0144\u0145\u0007\u0006\u0000\u0000"+ + "\u0145\u0147\u00032\u0019\u0000\u0146\u0143\u0001\u0000\u0000\u0000\u0147"+ + "\u014a\u0001\u0000\u0000\u0000\u0148\u0146\u0001\u0000\u0000\u0000\u0148"+ + "\u0149\u0001\u0000\u0000\u0000\u01495\u0001\u0000\u0000\u0000\u014a\u0148"+ + "\u0001\u0000\u0000\u0000\u014b\u014c\u0006\u001b\uffff\uffff\u0000\u014c"+ + "\u014d\u00034\u001a\u0000\u014d\u0153\u0001\u0000\u0000\u0000\u014e\u014f"+ + "\n\u0001\u0000\u0000\u014f\u0150\u0007\u0007\u0000\u0000\u0150\u0152\u0003"+ + "4\u001a\u0000\u0151\u014e\u0001\u0000\u0000\u0000\u0152\u0155\u0001\u0000"+ + "\u0000\u0000\u0153\u0151\u0001\u0000\u0000\u0000\u0153\u0154\u0001\u0000"+ + "\u0000\u0000\u01547\u0001\u0000\u0000\u0000\u0155\u0153\u0001\u0000\u0000"+ + "\u0000\u0156\u0157\u0006\u001c\uffff\uffff\u0000\u0157\u0158\u00036\u001b"+ + "\u0000\u0158\u015e\u0001\u0000\u0000\u0000\u0159\u015a\n\u0001\u0000\u0000"+ + "\u015a\u015b\u0005\u0018\u0000\u0000\u015b\u015d\u00036\u001b\u0000\u015c"+ + "\u0159\u0001\u0000\u0000\u0000\u015d\u0160\u0001\u0000\u0000\u0000\u015e"+ + "\u015c\u0001\u0000\u0000\u0000\u015e\u015f\u0001\u0000\u0000\u0000\u015f"+ + "9\u0001\u0000\u0000\u0000\u0160\u015e\u0001\u0000\u0000\u0000\u0161\u0162"+ + "\u0006\u001d\uffff\uffff\u0000\u0162\u0163\u00038\u001c\u0000\u0163\u0169"+ + "\u0001\u0000\u0000\u0000\u0164\u0165\n\u0001\u0000\u0000\u0165\u0166\u0005"+ + "\u0019\u0000\u0000\u0166\u0168\u00038\u001c\u0000\u0167\u0164\u0001\u0000"+ + "\u0000\u0000\u0168\u016b\u0001\u0000\u0000\u0000\u0169\u0167\u0001\u0000"+ + "\u0000\u0000\u0169\u016a\u0001\u0000\u0000\u0000\u016a;\u0001\u0000\u0000"+ + "\u0000\u016b\u0169\u0001\u0000\u0000\u0000\u016c\u016d\u00032\u0019\u0000"+ + "\u016d=\u0001\u0000\u0000\u0000$@BHQ_lorz\u0086\u0090\u0095\u009e\u00a1"+ + "\u00a4\u00aa\u00b6\u00c6\u00c9\u00cf\u00d6\u00de\u00e9\u00f7\u00fa\u0107"+ + "\u0110\u0118\u011e\u0127\u0132\u013d\u0148\u0153\u015e\u0169"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/antlr4/SysY.g4 b/src/antlr4/SysY.g4 index 8ec5e13..37afd7e 100644 --- a/src/antlr4/SysY.g4 +++ b/src/antlr4/SysY.g4 @@ -1,6 +1,6 @@ grammar SysY; -// ========================= Parser Rules ========================= +// ===================================== 语法规则(Parser Rules) ===================================== compUnit: (decl | funcDef)+ EOF; @@ -10,7 +10,7 @@ constDecl: CONST bType constDef (COMMA constDef)* SEMI; bType: INT | FLOAT; -constDef: IDENT (LBRACK constExp RBRACK)* ASSIGN constInitVal; +constDef: Ident (LBRACK constExp RBRACK)* ASSIGN constInitVal; constInitVal: constExp @@ -18,19 +18,21 @@ constInitVal: varDecl: bType varDef (COMMA varDef)* SEMI; -varDef: IDENT (LBRACK constExp RBRACK)* (ASSIGN initVal)?; +varDef: + Ident (LBRACK constExp RBRACK)* + | Ident (LBRACK constExp RBRACK)* ASSIGN initVal; initVal: exp | LBRACE (initVal (COMMA initVal)*)? RBRACE; -funcDef: funcType IDENT LPAREN funcFParams? RPAREN block; +funcDef: funcType Ident LPAREN funcFParams? RPAREN block; funcType: VOID | INT | FLOAT; funcFParams: funcFParam (COMMA funcFParam)*; funcFParam: - bType IDENT - | bType IDENT LBRACK RBRACK (LBRACK exp RBRACK)*; + bType Ident + | bType Ident LBRACK RBRACK (LBRACK exp RBRACK)*; block: LBRACE blockItem* RBRACE; @@ -50,15 +52,15 @@ exp: addExp; cond: lOrExp; -lVal: IDENT (LBRACK exp RBRACK)*; +lVal: Ident (LBRACK exp RBRACK)*; primaryExp: LPAREN exp RPAREN | lVal | number; -number: ILITERAL | FLITERAL; +number: IntConst | FloatConst; unaryExp: primaryExp # primaryUnaryExp - | IDENT LPAREN funcRParams? RPAREN # callUnaryExp + | Ident LPAREN funcRParams? RPAREN # callUnaryExp | unaryOp unaryExp # opUnaryExp; unaryOp: ADD | SUB | NOT; @@ -87,9 +89,9 @@ lOrExp: lAndExp # andLOrExp | lOrExp OR lAndExp # binaryLOrExp; constExp: addExp; -// ========================= Lexer Rules ========================= +// ===================================== 词法规则(Lexer Rules) ===================================== -// keywords +// ---------- 关键字 ---------- CONST: 'const'; INT: 'int'; FLOAT: 'float'; @@ -101,7 +103,7 @@ BREAK: 'break'; CONTINUE: 'continue'; RETURN: 'return'; -// operators +// ---------- 运算符 ---------- ADD: '+'; SUB: '-'; MUL: '*'; @@ -121,7 +123,7 @@ NOT: '!'; AND: '&&'; OR: '||'; -// punctuations +// ---------- 界符 ---------- LPAREN: '('; RPAREN: ')'; LBRACK: '['; @@ -131,50 +133,67 @@ RBRACE: '}'; COMMA: ','; SEMI: ';'; -// identifiers -IDENT: [a-zA-Z_] [a-zA-Z_0-9]*; +// ---------- 标识符 ---------- 与文档中的 Ident 对应 +Ident: [a-zA-Z_] [a-zA-Z_0-9]*; -// integer literals -fragment DIGIT: [0-9]; +// ===================================== 数值常量相关片段规则 ===================================== -fragment NON_ZERO_DIGIT: [1-9]; +// 十进制数字 +fragment Digit: [0-9]; -fragment OCT_DIGIT: [0-7]; +// 非零十进制数字 +fragment NonzeroDigit: [1-9]; -fragment HEX_DIGIT: [0-9a-fA-F]; +// 八进制数字 +fragment OctDigit: [0-7]; -fragment DEC_INTEGER: NON_ZERO_DIGIT DIGIT*; +// 十六进制数字 +fragment HexDigit: [0-9a-fA-F]; -fragment OCT_INTEGER: '0' OCT_DIGIT*; +// 十进制整数:非零开头,后接若干十进制数字 +fragment DecInteger: NonzeroDigit Digit*; -fragment HEX_INTEGER: '0' [xX] HEX_DIGIT+; +// 八进制整数:以 0 开头 +fragment OctInteger: '0' OctDigit*; -// float literals -fragment DEC_FRACTION: DIGIT+ '.' DIGIT* | '.' DIGIT+; +// 十六进制整数:以 0x 或 0X 开头 +fragment HexInteger: '0' [xX] HexDigit+; -fragment DEC_EXPONENT: [eE] [+\-]? DIGIT+; +// 十进制小数部分 +fragment DecFraction: Digit+ '.' Digit* | '.' Digit+; -fragment DEC_FLOAT: - DEC_FRACTION DEC_EXPONENT? - | DEC_INTEGER DEC_EXPONENT; +// 十进制指数部分 +fragment DecExponent: [eE] [+\-]? Digit+; -fragment HEX_FRACTION: - HEX_DIGIT* '.' HEX_DIGIT+ - | HEX_DIGIT+ '.'; +// 十进制浮点数 +fragment DecFloat: + DecFraction DecExponent? + | DecInteger DecExponent; -fragment BIN_EXPONENT: [pP] [+\-]? DIGIT+; +// 十六进制小数部分 +fragment HexFraction: HexDigit* '.' HexDigit+ | HexDigit+ '.'; -fragment HEX_FLOAT: - '0' [xX] HEX_FRACTION BIN_EXPONENT - | HEX_INTEGER BIN_EXPONENT; +// 十六进制浮点数的二进制指数部分 +fragment BinExponent: [pP] [+\-]? Digit+; -ILITERAL: DEC_INTEGER | OCT_INTEGER | HEX_INTEGER; +// 十六进制浮点数 +fragment HexFloat: + '0' [xX] HexFraction BinExponent + | HexInteger BinExponent; -FLITERAL: DEC_FLOAT | HEX_FLOAT; +// ---------- 整数字面量 ---------- 与文档中的 IntConst 对应 +IntConst: DecInteger | OctInteger | HexInteger; -// comments and whitespace +// ---------- 浮点数字面量 ---------- 与文档中的 FloatConst 对应 +FloatConst: DecFloat | HexFloat; + +// ===================================== 空白符与注释 ===================================== + +// 空白字符直接跳过 WS: [ \t\r\n]+ -> skip; +// 单行注释:从 // 到行末 LINE_COMMENT: '//' ~[\r\n]* -> skip; +// 多行注释:从 /* 到 */ BLOCK_COMMENT: '/*' .*? '*/' -> skip; \ No newline at end of file