1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-10-21 17:24:39 +00:00

Added support for @nooptimize ASM tag. #599

This commit is contained in:
jespergravgaard 2020-12-21 17:49:10 +01:00
parent bda0f28414
commit 7a8a42bb03
17 changed files with 3455 additions and 3447 deletions

View File

@ -1,4 +1,4 @@
//KICKC FRAGMENT CACHE 15355793f5 153557b229
//KICKC FRAGMENT CACHE 13789539dd 13789557f9
//FRAGMENT vbuz1=vbuc1
lda #{c1}
sta {z1}

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
//KICKC FRAGMENT CACHE 15355793f5 153557b229
//KICKC FRAGMENT CACHE 13789539dd 13789557f9
//FRAGMENT vbuz1=vbuc1
lda #{c1}
sta {z1}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
//KICKC FRAGMENT CACHE 15355793f5 153557b229
//KICKC FRAGMENT CACHE 13789539dd 13789557f9
//FRAGMENT vwuz1=vwuc1
lda #<{c1}
sta {z1}

View File

@ -1,4 +1,4 @@
rega: @clob_a lda #0 @clob_a
regx: @clob_x ldx #0 @clob_x
regy: @clob_y ldy #0 @clob_y
rega: @clob_a @nooptimize lda #0 @clob_a @nooptimize
regx: @clob_x @nooptimize ldx #0 @clob_x @nooptimize
regy: @clob_y @nooptimize ldy #0 @clob_y @nooptimize
rti

View File

@ -4,9 +4,6 @@ import dk.camelot64.cpufamily6502.CpuAddressingMode;
import dk.camelot64.cpufamily6502.CpuOpcode;
import dk.camelot64.kickc.model.InternalError;
import java.util.ArrayList;
import java.util.List;
/** A specific assembler instruction line (opcode, addressing mode and specific parameter value) */
public class AsmInstruction extends AsmLine {
@ -19,9 +16,6 @@ public class AsmInstruction extends AsmLine {
/** The second ASM opcode parameter. Null if not used. Only used for addressing mode Zeropage Test Relative {@link CpuAddressingMode#REZ} - eg. BBR0 $12,label */
private String operand2;
/** If true the instruction will not be optimized away. */
private boolean dontOptimize;
public AsmInstruction(CpuOpcode cpuOpcode, String operand1, String operand2) {
this.cpuOpcode = cpuOpcode;
this.operand1 = operand1;
@ -72,14 +66,6 @@ public class AsmInstruction extends AsmLine {
return getAsm();
}
public boolean isDontOptimize() {
return dontOptimize;
}
public void setDontOptimize(boolean dontOptimize) {
this.dontOptimize = dontOptimize;
}
/***
* Get the operand value that represents a jump target (if the opcode is a jump as defined by {@link CpuOpcode#isJump()}
* @return The jump target operand

View File

@ -5,8 +5,6 @@ public class AsmLabel extends AsmLine {
private String label;
private boolean dontOptimize;
public AsmLabel(String label) {
this.label = label;
}
@ -34,14 +32,6 @@ public class AsmLabel extends AsmLine {
return label + ":";
}
public boolean isDontOptimize() {
return dontOptimize;
}
public void setDontOptimize(boolean dontOptimize) {
this.dontOptimize = dontOptimize;
}
@Override
public String toString() {
return getAsm();

View File

@ -36,4 +36,11 @@ public abstract class AsmLine {
return tags;
}
/**
* Has the ASM line been marked as <i>don't optimize</i>?
* @return true if the ASM should not be optimized
*/
public boolean isNoOptimize() {
return getTags().has("nooptimize");
}
}

View File

@ -14,8 +14,10 @@ import dk.camelot64.kickc.model.types.SymbolType;
import dk.camelot64.kickc.model.values.*;
import dk.camelot64.kickc.parser.KickCParser;
import dk.camelot64.kickc.parser.KickCParserBaseVisitor;
import org.antlr.v4.runtime.tree.TerminalNode;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/** ASM Code Fragment with register/variable bindings that can be used for generating ASM code for a specific statement . */
@ -198,26 +200,24 @@ public class AsmFragmentInstance {
this.visit(context);
}
private static AsmLine addTags(AsmLine asmLine, List<TerminalNode> asmTags) {
if(asmTags != null)
for(TerminalNode asmTag : asmTags) {
final String tagName = asmTag.getText().substring(1);
asmLine.getTags().add(tagName);
}
return asmLine;
}
@Override
public Object visitAsmLabelName(KickCParser.AsmLabelNameContext ctx) {
final AsmLabel labelLine = new AsmLabel(ctx.ASM_NAME().getText());
if(ctx.ASM_TAG()!=null) {
final String tagName = ctx.ASM_TAG().getText().substring(1);
labelLine.getTags().add(tagName);
}
asmProgram.addLine(labelLine);
asmProgram.addLine(addTags(new AsmLabel(ctx.ASM_NAME().getText()), ctx.ASM_TAG()));
return null;
}
@Override
public Object visitAsmLabelMulti(KickCParser.AsmLabelMultiContext ctx) {
String label = ctx.ASM_MULTI_NAME().getText();
final AsmLabel labelLine = new AsmLabel(label);
if(ctx.ASM_TAG()!=null) {
final String tagName = ctx.ASM_TAG().getText().substring(1);
labelLine.getTags().add(tagName);
}
asmProgram.addLine(labelLine);
asmProgram.addLine(addTags(new AsmLabel(ctx.ASM_MULTI_NAME().getText()), ctx.ASM_TAG()));
return null;
}
@ -227,7 +227,7 @@ public class AsmFragmentInstance {
for(int i = 1; i < ctx.getChildCount(); i = i + 2) {
values.add(ctx.getChild(i).getText());
}
asmProgram.addLine(new AsmDataNumeric(null, AsmDataNumeric.Type.BYTE, values));
asmProgram.addLine(addTags(new AsmDataNumeric(null, AsmDataNumeric.Type.BYTE, values), ctx.ASM_TAG()));
return null;
}
@ -240,12 +240,8 @@ public class AsmFragmentInstance {
} else {
instruction = (AsmInstruction) this.visit(paramModeCtx);
}
if(ctx.ASM_TAG()!=null) {
final String tagName = ctx.ASM_TAG().getText().substring(1);
instruction.getTags().add(tagName);
}
if(instruction != null) {
asmProgram.addLine(instruction);
asmProgram.addLine(addTags(instruction, ctx.ASM_TAG()));
} else {
throw new RuntimeException("Error parsing ASM fragment line " + name + ".asm\n - Line: " + ctx.getText());
}
@ -352,7 +348,7 @@ public class AsmFragmentInstance {
String operand1 = param1 == null ? null : param1.getParam();
String operand2 = param2 == null ? null : param2.getParam();
if(cpuOpcode == null) {
throw new InternalError("Error in " + name + ".asm line " + instructionCtx.getStart().getLine() + " - Instruction type not supported " + addressingMode.getAsm(mnemonic, operand1, operand2) +" by CPU "+this.fragmentInstance.fragmentTemplate.getTargetCpu().getName());
throw new InternalError("Error in " + name + ".asm line " + instructionCtx.getStart().getLine() + " - Instruction type not supported " + addressingMode.getAsm(mnemonic, operand1, operand2) + " by CPU " + this.fragmentInstance.fragmentTemplate.getTargetCpu().getName());
}
return new AsmInstruction(cpuOpcode, operand1, operand2);
}

View File

@ -279,16 +279,16 @@ asmLine
;
asmLabel
: ASM_NAME ASM_COLON ASM_TAG? #asmLabelName
| ASM_MULTI_NAME ASM_COLON ASM_TAG? #asmLabelMulti
: ASM_NAME ASM_COLON ASM_TAG* #asmLabelName
| ASM_MULTI_NAME ASM_COLON ASM_TAG* #asmLabelMulti
;
asmInstruction
: ASM_MNEMONIC (asmParamMode)? ASM_TAG?
: ASM_MNEMONIC (asmParamMode)? ASM_TAG*
;
asmBytes
: ASM_BYTE asmExpr ( ASM_COMMA asmExpr)* ASM_TAG?
: ASM_BYTE asmExpr ( ASM_COMMA asmExpr)* ASM_TAG*
;
asmParamMode

File diff suppressed because one or more lines are too long

View File

@ -6119,7 +6119,10 @@ public class KickCParser extends Parser {
public static class AsmLabelNameContext extends AsmLabelContext {
public TerminalNode ASM_NAME() { return getToken(KickCParser.ASM_NAME, 0); }
public TerminalNode ASM_COLON() { return getToken(KickCParser.ASM_COLON, 0); }
public TerminalNode ASM_TAG() { return getToken(KickCParser.ASM_TAG, 0); }
public List<TerminalNode> ASM_TAG() { return getTokens(KickCParser.ASM_TAG); }
public TerminalNode ASM_TAG(int i) {
return getToken(KickCParser.ASM_TAG, i);
}
public AsmLabelNameContext(AsmLabelContext ctx) { copyFrom(ctx); }
@Override
public void enterRule(ParseTreeListener listener) {
@ -6138,7 +6141,10 @@ public class KickCParser extends Parser {
public static class AsmLabelMultiContext extends AsmLabelContext {
public TerminalNode ASM_MULTI_NAME() { return getToken(KickCParser.ASM_MULTI_NAME, 0); }
public TerminalNode ASM_COLON() { return getToken(KickCParser.ASM_COLON, 0); }
public TerminalNode ASM_TAG() { return getToken(KickCParser.ASM_TAG, 0); }
public List<TerminalNode> ASM_TAG() { return getTokens(KickCParser.ASM_TAG); }
public TerminalNode ASM_TAG(int i) {
return getToken(KickCParser.ASM_TAG, i);
}
public AsmLabelMultiContext(AsmLabelContext ctx) { copyFrom(ctx); }
@Override
public void enterRule(ParseTreeListener listener) {
@ -6160,7 +6166,7 @@ public class KickCParser extends Parser {
enterRule(_localctx, 84, RULE_asmLabel);
int _la;
try {
setState(761);
setState(767);
_errHandler.sync(this);
switch (_input.LA(1)) {
case ASM_NAME:
@ -6171,36 +6177,44 @@ public class KickCParser extends Parser {
match(ASM_NAME);
setState(752);
match(ASM_COLON);
setState(754);
setState(756);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ASM_TAG) {
while (_la==ASM_TAG) {
{
{
setState(753);
match(ASM_TAG);
}
}
setState(758);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
break;
case ASM_MULTI_NAME:
_localctx = new AsmLabelMultiContext(_localctx);
enterOuterAlt(_localctx, 2);
{
setState(756);
match(ASM_MULTI_NAME);
setState(757);
match(ASM_COLON);
setState(759);
match(ASM_MULTI_NAME);
setState(760);
match(ASM_COLON);
setState(764);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ASM_TAG) {
while (_la==ASM_TAG) {
{
setState(758);
{
setState(761);
match(ASM_TAG);
}
}
setState(766);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
break;
default:
@ -6223,7 +6237,10 @@ public class KickCParser extends Parser {
public AsmParamModeContext asmParamMode() {
return getRuleContext(AsmParamModeContext.class,0);
}
public TerminalNode ASM_TAG() { return getToken(KickCParser.ASM_TAG, 0); }
public List<TerminalNode> ASM_TAG() { return getTokens(KickCParser.ASM_TAG); }
public TerminalNode ASM_TAG(int i) {
return getToken(KickCParser.ASM_TAG, i);
}
public AsmInstructionContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@ -6250,28 +6267,32 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
setState(763);
setState(769);
match(ASM_MNEMONIC);
setState(765);
setState(771);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,82,_ctx) ) {
case 1:
{
setState(764);
setState(770);
asmParamMode();
}
break;
}
setState(768);
setState(776);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ASM_TAG) {
while (_la==ASM_TAG) {
{
setState(767);
{
setState(773);
match(ASM_TAG);
}
}
setState(778);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
}
catch (RecognitionException re) {
@ -6297,7 +6318,10 @@ public class KickCParser extends Parser {
public TerminalNode ASM_COMMA(int i) {
return getToken(KickCParser.ASM_COMMA, i);
}
public TerminalNode ASM_TAG() { return getToken(KickCParser.ASM_TAG, 0); }
public List<TerminalNode> ASM_TAG() { return getTokens(KickCParser.ASM_TAG); }
public TerminalNode ASM_TAG(int i) {
return getToken(KickCParser.ASM_TAG, i);
}
public AsmBytesContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@ -6324,36 +6348,40 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
setState(770);
setState(779);
match(ASM_BYTE);
setState(771);
setState(780);
asmExpr(0);
setState(776);
setState(785);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==ASM_COMMA) {
{
{
setState(772);
setState(781);
match(ASM_COMMA);
setState(773);
setState(782);
asmExpr(0);
}
}
setState(778);
setState(787);
_errHandler.sync(this);
_la = _input.LA(1);
}
setState(780);
setState(791);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==ASM_TAG) {
while (_la==ASM_TAG) {
{
setState(779);
{
setState(788);
match(ASM_TAG);
}
}
setState(793);
_errHandler.sync(this);
_la = _input.LA(1);
}
}
}
catch (RecognitionException re) {
@ -6597,14 +6625,14 @@ public class KickCParser extends Parser {
AsmParamModeContext _localctx = new AsmParamModeContext(_ctx, getState());
enterRule(_localctx, 90, RULE_asmParamMode);
try {
setState(827);
setState(839);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,86,_ctx) ) {
case 1:
_localctx = new AsmModeAbsContext(_localctx);
enterOuterAlt(_localctx, 1);
{
setState(782);
setState(794);
asmExpr(0);
}
break;
@ -6612,9 +6640,9 @@ public class KickCParser extends Parser {
_localctx = new AsmModeImmContext(_localctx);
enterOuterAlt(_localctx, 2);
{
setState(783);
setState(795);
match(ASM_IMM);
setState(784);
setState(796);
asmExpr(0);
}
break;
@ -6622,11 +6650,11 @@ public class KickCParser extends Parser {
_localctx = new AsmModeAbsXYContext(_localctx);
enterOuterAlt(_localctx, 3);
{
setState(785);
setState(797);
asmExpr(0);
setState(786);
setState(798);
match(ASM_COMMA);
setState(787);
setState(799);
asmExpr(0);
}
break;
@ -6634,15 +6662,15 @@ public class KickCParser extends Parser {
_localctx = new AsmModeIndIdxXYContext(_localctx);
enterOuterAlt(_localctx, 4);
{
setState(789);
setState(801);
match(ASM_PAR_BEGIN);
setState(790);
setState(802);
asmExpr(0);
setState(791);
setState(803);
match(ASM_PAR_END);
setState(792);
setState(804);
match(ASM_COMMA);
setState(793);
setState(805);
match(ASM_NAME);
}
break;
@ -6650,19 +6678,19 @@ public class KickCParser extends Parser {
_localctx = new AsmModeIndLongIdxXYContext(_localctx);
enterOuterAlt(_localctx, 5);
{
setState(795);
setState(807);
match(ASM_PAR_BEGIN);
setState(796);
setState(808);
match(ASM_PAR_BEGIN);
setState(797);
setState(809);
asmExpr(0);
setState(798);
setState(810);
match(ASM_PAR_END);
setState(799);
setState(811);
match(ASM_PAR_END);
setState(800);
setState(812);
match(ASM_COMMA);
setState(801);
setState(813);
match(ASM_NAME);
}
break;
@ -6670,19 +6698,19 @@ public class KickCParser extends Parser {
_localctx = new AsmModeSPIndIdxContext(_localctx);
enterOuterAlt(_localctx, 6);
{
setState(803);
setState(815);
match(ASM_PAR_BEGIN);
setState(804);
setState(816);
asmExpr(0);
setState(805);
setState(817);
match(ASM_COMMA);
setState(806);
setState(818);
match(ASM_NAME);
setState(807);
setState(819);
match(ASM_PAR_END);
setState(808);
setState(820);
match(ASM_COMMA);
setState(809);
setState(821);
match(ASM_NAME);
}
break;
@ -6690,15 +6718,15 @@ public class KickCParser extends Parser {
_localctx = new AsmModeIdxIndXYContext(_localctx);
enterOuterAlt(_localctx, 7);
{
setState(811);
setState(823);
match(ASM_PAR_BEGIN);
setState(812);
setState(824);
asmExpr(0);
setState(813);
setState(825);
match(ASM_COMMA);
setState(814);
setState(826);
match(ASM_NAME);
setState(815);
setState(827);
match(ASM_PAR_END);
}
break;
@ -6706,11 +6734,11 @@ public class KickCParser extends Parser {
_localctx = new AsmModeIndContext(_localctx);
enterOuterAlt(_localctx, 8);
{
setState(817);
setState(829);
match(ASM_PAR_BEGIN);
setState(818);
setState(830);
asmExpr(0);
setState(819);
setState(831);
match(ASM_PAR_END);
}
break;
@ -6718,15 +6746,15 @@ public class KickCParser extends Parser {
_localctx = new AsmModeIndLongContext(_localctx);
enterOuterAlt(_localctx, 9);
{
setState(821);
setState(833);
match(ASM_PAR_BEGIN);
setState(822);
setState(834);
match(ASM_PAR_BEGIN);
setState(823);
setState(835);
asmExpr(0);
setState(824);
setState(836);
match(ASM_PAR_END);
setState(825);
setState(837);
match(ASM_PAR_END);
}
break;
@ -6931,7 +6959,7 @@ public class KickCParser extends Parser {
int _alt;
enterOuterAlt(_localctx, 1);
{
setState(843);
setState(855);
_errHandler.sync(this);
switch (_input.LA(1)) {
case ASM_BRACKET_BEGIN:
@ -6940,11 +6968,11 @@ public class KickCParser extends Parser {
_ctx = _localctx;
_prevctx = _localctx;
setState(830);
setState(842);
match(ASM_BRACKET_BEGIN);
setState(831);
setState(843);
asmExpr(0);
setState(832);
setState(844);
match(ASM_BRACKET_END);
}
break;
@ -6956,7 +6984,7 @@ public class KickCParser extends Parser {
_localctx = new AsmExprUnaryContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(834);
setState(846);
_la = _input.LA(1);
if ( !(((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (ASM_PLUS - 125)) | (1L << (ASM_MINUS - 125)) | (1L << (ASM_LESS_THAN - 125)) | (1L << (ASM_GREATER_THAN - 125)))) != 0)) ) {
_errHandler.recoverInline(this);
@ -6966,7 +6994,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
setState(835);
setState(847);
asmExpr(8);
}
break;
@ -6975,7 +7003,7 @@ public class KickCParser extends Parser {
_localctx = new AsmExprLabelContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(836);
setState(848);
match(ASM_NAME);
}
break;
@ -6984,7 +7012,7 @@ public class KickCParser extends Parser {
_localctx = new AsmExprLabelRelContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(837);
setState(849);
match(ASM_MULTI_REL);
}
break;
@ -6993,11 +7021,11 @@ public class KickCParser extends Parser {
_localctx = new AsmExprReplaceContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(838);
setState(850);
match(ASM_CURLY_BEGIN);
setState(839);
setState(851);
match(ASM_NAME);
setState(840);
setState(852);
match(ASM_CURLY_END);
}
break;
@ -7006,7 +7034,7 @@ public class KickCParser extends Parser {
_localctx = new AsmExprIntContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(841);
setState(853);
match(ASM_NUMBER);
}
break;
@ -7015,7 +7043,7 @@ public class KickCParser extends Parser {
_localctx = new AsmExprCharContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(842);
setState(854);
match(ASM_CHAR);
}
break;
@ -7023,7 +7051,7 @@ public class KickCParser extends Parser {
throw new NoViableAltException(this);
}
_ctx.stop = _input.LT(-1);
setState(859);
setState(871);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,89,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
@ -7031,20 +7059,20 @@ public class KickCParser extends Parser {
if ( _parseListeners!=null ) triggerExitRuleEvent();
_prevctx = _localctx;
{
setState(857);
setState(869);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,88,_ctx) ) {
case 1:
{
_localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_asmExpr);
setState(845);
setState(857);
if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)");
{
setState(846);
setState(858);
match(ASM_DOT);
}
setState(847);
setState(859);
asmExpr(11);
}
break;
@ -7052,9 +7080,9 @@ public class KickCParser extends Parser {
{
_localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_asmExpr);
setState(848);
setState(860);
if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
setState(849);
setState(861);
_la = _input.LA(1);
if ( !(_la==ASM_SHIFT_LEFT || _la==ASM_SHIFT_RIGHT) ) {
_errHandler.recoverInline(this);
@ -7064,7 +7092,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
setState(850);
setState(862);
asmExpr(10);
}
break;
@ -7072,9 +7100,9 @@ public class KickCParser extends Parser {
{
_localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_asmExpr);
setState(851);
setState(863);
if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
setState(852);
setState(864);
_la = _input.LA(1);
if ( !(_la==ASM_MULTIPLY || _la==ASM_DIVIDE) ) {
_errHandler.recoverInline(this);
@ -7084,7 +7112,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
setState(853);
setState(865);
asmExpr(8);
}
break;
@ -7092,9 +7120,9 @@ public class KickCParser extends Parser {
{
_localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_asmExpr);
setState(854);
setState(866);
if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
setState(855);
setState(867);
_la = _input.LA(1);
if ( !(_la==ASM_PLUS || _la==ASM_MINUS) ) {
_errHandler.recoverInline(this);
@ -7104,14 +7132,14 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
setState(856);
setState(868);
asmExpr(7);
}
break;
}
}
}
setState(861);
setState(873);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,89,_ctx);
}
@ -7240,7 +7268,7 @@ public class KickCParser extends Parser {
}
public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u009c\u0361\4\2\t"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u009c\u036d\4\2\t"+
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@ -7295,61 +7323,62 @@ public class KickCParser extends Parser {
"\u02bd\n%\f%\16%\u02c0\13%\3&\3&\3&\7&\u02c5\n&\f&\16&\u02c8\13&\3\'\3"+
"\'\5\'\u02cc\n\'\3\'\3\'\3(\3(\3(\3(\7(\u02d4\n(\f(\16(\u02d7\13(\3(\3"+
"(\3)\3)\3)\3)\3)\3)\3)\3)\3)\3)\5)\u02e5\n)\3*\7*\u02e8\n*\f*\16*\u02eb"+
"\13*\3+\3+\3+\5+\u02f0\n+\3,\3,\3,\5,\u02f5\n,\3,\3,\3,\5,\u02fa\n,\5"+
",\u02fc\n,\3-\3-\5-\u0300\n-\3-\5-\u0303\n-\3.\3.\3.\3.\7.\u0309\n.\f"+
".\16.\u030c\13.\3.\5.\u030f\n.\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/"+
"\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/"+
"\3/\3/\3/\3/\3/\3/\3/\3/\3/\5/\u033e\n/\3\60\3\60\3\60\3\60\3\60\3\60"+
"\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\5\60\u034e\n\60\3\60\3\60\3\60"+
"\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\7\60\u035c\n\60\f\60\16"+
"\60\u035f\13\60\3\60\2\t\f\30\32&FH^\61\2\4\6\b\n\f\16\20\22\24\26\30"+
"\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^\2\r\3\2\27\30\5\2"+
"\22\23\31\32RR\4\2!!$$\3\2\35\36\3\2\24\26\3\2\22\23\3\2\37$\3\2\177\u0082"+
"\3\2}~\3\2\u0083\u0084\3\2\177\u0080\2\u03e2\2`\3\2\2\2\4c\3\2\2\2\6i"+
"\3\2\2\2\bz\3\2\2\2\n|\3\2\2\2\f\177\3\2\2\2\16\u0096\3\2\2\2\20\u00bb"+
"\3\2\2\2\22\u00c0\3\2\2\2\24\u00ca\3\2\2\2\26\u00d1\3\2\2\2\30\u00d7\3"+
"\2\2\2\32\u00f6\3\2\2\2\34\u0106\3\2\2\2\36\u0109\3\2\2\2 \u0115\3\2\2"+
"\2\"\u0118\3\2\2\2$\u011b\3\2\2\2&\u0123\3\2\2\2(\u012e\3\2\2\2*\u0133"+
"\3\2\2\2,\u0144\3\2\2\2.\u014a\3\2\2\2\60\u015d\3\2\2\2\62\u015f\3\2\2"+
"\2\64\u0173\3\2\2\2\66\u01a2\3\2\2\28\u01a5\3\2\2\2:\u01fe\3\2\2\2<\u0201"+
"\3\2\2\2>\u020c\3\2\2\2@\u022a\3\2\2\2B\u0230\3\2\2\2D\u0232\3\2\2\2F"+
"\u0234\3\2\2\2H\u0280\3\2\2\2J\u02c1\3\2\2\2L\u02c9\3\2\2\2N\u02cf\3\2"+
"\2\2P\u02e4\3\2\2\2R\u02e9\3\2\2\2T\u02ef\3\2\2\2V\u02fb\3\2\2\2X\u02fd"+
"\3\2\2\2Z\u0304\3\2\2\2\\\u033d\3\2\2\2^\u034d\3\2\2\2`a\5\6\4\2ab\7\2"+
"\2\3b\3\3\2\2\2cd\5R*\2de\7\2\2\3e\5\3\2\2\2fh\5\b\5\2gf\3\2\2\2hk\3\2"+
"\2\2ig\3\2\2\2ij\3\2\2\2j\7\3\2\2\2ki\3\2\2\2lm\5\n\6\2mn\7\n\2\2n{\3"+
"\2\2\2op\5\36\20\2pq\7\n\2\2q{\3\2\2\2rs\5$\23\2st\7\n\2\2t{\3\2\2\2u"+
"{\5*\26\2v{\5\62\32\2wx\5\16\b\2xy\7\n\2\2y{\3\2\2\2zl\3\2\2\2zo\3\2\2"+
"\2zr\3\2\2\2zu\3\2\2\2zv\3\2\2\2zw\3\2\2\2{\t\3\2\2\2|}\5\22\n\2}~\5\f"+
"\7\2~\13\3\2\2\2\177\u0083\b\7\1\2\u0080\u0082\5\24\13\2\u0081\u0080\3"+
"\2\2\2\u0082\u0085\3\2\2\2\u0083\u0081\3\2\2\2\u0083\u0084\3\2\2\2\u0084"+
"\u0086\3\2\2\2\u0085\u0083\3\2\2\2\u0086\u0087\5\20\t\2\u0087\u0093\3"+
"\2\2\2\u0088\u0089\f\3\2\2\u0089\u008d\7\f\2\2\u008a\u008c\5\24\13\2\u008b"+
"\u008a\3\2\2\2\u008c\u008f\3\2\2\2\u008d\u008b\3\2\2\2\u008d\u008e\3\2"+
"\2\2\u008e\u0090\3\2\2\2\u008f\u008d\3\2\2\2\u0090\u0092\5\20\t\2\u0091"+
"\u0088\3\2\2\2\u0092\u0095\3\2\2\2\u0093\u0091\3\2\2\2\u0093\u0094\3\2"+
"\2\2\u0094\r\3\2\2\2\u0095\u0093\3\2\2\2\u0096\u0097\7)\2\2\u0097\u009b"+
"\5\22\n\2\u0098\u009a\5\24\13\2\u0099\u0098\3\2\2\2\u009a\u009d\3\2\2"+
"\2\u009b\u0099\3\2\2\2\u009b\u009c\3\2\2\2\u009c\u009e\3\2\2\2\u009d\u009b"+
"\3\2\2\2\u009e\u00a2\7m\2\2\u009f\u00a1\5\26\f\2\u00a0\u009f\3\2\2\2\u00a1"+
"\u00a4\3\2\2\2\u00a2\u00a0\3\2\2\2\u00a2\u00a3\3\2\2\2\u00a3\u00a5\3\2"+
"\2\2\u00a4\u00a2\3\2\2\2\u00a5\u00a6\b\b\1\2\u00a6\17\3\2\2\2\u00a7\u00ab"+
"\7m\2\2\u00a8\u00aa\5\26\f\2\u00a9\u00a8\3\2\2\2\u00aa\u00ad\3\2\2\2\u00ab"+
"\u00a9\3\2\2\2\u00ab\u00ac\3\2\2\2\u00ac\u00b0\3\2\2\2\u00ad\u00ab\3\2"+
"\2\2\u00ae\u00af\7\'\2\2\u00af\u00b1\5H%\2\u00b0\u00ae\3\2\2\2\u00b0\u00b1"+
"\3\2\2\2\u00b1\u00bc\3\2\2\2\u00b2\u00b6\7m\2\2\u00b3\u00b5\5\26\f\2\u00b4"+
"\u00b3\3\2\2\2\u00b5\u00b8\3\2\2\2\u00b6\u00b4\3\2\2\2\u00b6\u00b7\3\2"+
"\2\2\u00b7\u00b9\3\2\2\2\u00b8\u00b6\3\2\2\2\u00b9\u00ba\7\'\2\2\u00ba"+
"\u00bc\5L\'\2\u00bb\u00a7\3\2\2\2\u00bb\u00b2\3\2\2\2\u00bc\21\3\2\2\2"+
"\u00bd\u00bf\5\66\34\2\u00be\u00bd\3\2\2\2\u00bf\u00c2\3\2\2\2\u00c0\u00be"+
"\3\2\2\2\u00c0\u00c1\3\2\2\2\u00c1\u00c3\3\2\2\2\u00c2\u00c0\3\2\2\2\u00c3"+
"\u00c7\5\32\16\2\u00c4\u00c6\5\66\34\2\u00c5\u00c4\3\2\2\2\u00c6\u00c9"+
"\3\2\2\2\u00c7\u00c5\3\2\2\2\u00c7\u00c8\3\2\2\2\u00c8\23\3\2\2\2\u00c9"+
"\u00c7\3\2\2\2\u00ca\u00ce\7\24\2\2\u00cb\u00cd\5\66\34\2\u00cc\u00cb"+
"\3\2\2\2\u00cd\u00d0\3\2\2\2\u00ce\u00cc\3\2\2\2\u00ce\u00cf\3\2\2\2\u00cf"+
"\25\3\2\2\2\u00d0\u00ce\3\2\2\2\u00d1\u00d3\7\6\2\2\u00d2\u00d4\5H%\2"+
"\u00d3\u00d2\3\2\2\2\u00d3\u00d4\3\2\2\2\u00d4\u00d5\3\2\2\2\u00d5\u00d6"+
"\7\7\2\2\u00d6\27\3\2\2\2\u00d7\u00d8\b\r\1\2\u00d8\u00d9\5\32\16\2\u00d9"+
"\13*\3+\3+\3+\5+\u02f0\n+\3,\3,\3,\7,\u02f5\n,\f,\16,\u02f8\13,\3,\3,"+
"\3,\7,\u02fd\n,\f,\16,\u0300\13,\5,\u0302\n,\3-\3-\5-\u0306\n-\3-\7-\u0309"+
"\n-\f-\16-\u030c\13-\3.\3.\3.\3.\7.\u0312\n.\f.\16.\u0315\13.\3.\7.\u0318"+
"\n.\f.\16.\u031b\13.\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3"+
"/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3/\3"+
"/\3/\3/\3/\3/\3/\5/\u034a\n/\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3"+
"\60\3\60\3\60\3\60\3\60\3\60\5\60\u035a\n\60\3\60\3\60\3\60\3\60\3\60"+
"\3\60\3\60\3\60\3\60\3\60\3\60\3\60\7\60\u0368\n\60\f\60\16\60\u036b\13"+
"\60\3\60\2\t\f\30\32&FH^\61\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \""+
"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^\2\r\3\2\27\30\5\2\22\23\31\32"+
"RR\4\2!!$$\3\2\35\36\3\2\24\26\3\2\22\23\3\2\37$\3\2\177\u0082\3\2}~\3"+
"\2\u0083\u0084\3\2\177\u0080\2\u03ee\2`\3\2\2\2\4c\3\2\2\2\6i\3\2\2\2"+
"\bz\3\2\2\2\n|\3\2\2\2\f\177\3\2\2\2\16\u0096\3\2\2\2\20\u00bb\3\2\2\2"+
"\22\u00c0\3\2\2\2\24\u00ca\3\2\2\2\26\u00d1\3\2\2\2\30\u00d7\3\2\2\2\32"+
"\u00f6\3\2\2\2\34\u0106\3\2\2\2\36\u0109\3\2\2\2 \u0115\3\2\2\2\"\u0118"+
"\3\2\2\2$\u011b\3\2\2\2&\u0123\3\2\2\2(\u012e\3\2\2\2*\u0133\3\2\2\2,"+
"\u0144\3\2\2\2.\u014a\3\2\2\2\60\u015d\3\2\2\2\62\u015f\3\2\2\2\64\u0173"+
"\3\2\2\2\66\u01a2\3\2\2\28\u01a5\3\2\2\2:\u01fe\3\2\2\2<\u0201\3\2\2\2"+
">\u020c\3\2\2\2@\u022a\3\2\2\2B\u0230\3\2\2\2D\u0232\3\2\2\2F\u0234\3"+
"\2\2\2H\u0280\3\2\2\2J\u02c1\3\2\2\2L\u02c9\3\2\2\2N\u02cf\3\2\2\2P\u02e4"+
"\3\2\2\2R\u02e9\3\2\2\2T\u02ef\3\2\2\2V\u0301\3\2\2\2X\u0303\3\2\2\2Z"+
"\u030d\3\2\2\2\\\u0349\3\2\2\2^\u0359\3\2\2\2`a\5\6\4\2ab\7\2\2\3b\3\3"+
"\2\2\2cd\5R*\2de\7\2\2\3e\5\3\2\2\2fh\5\b\5\2gf\3\2\2\2hk\3\2\2\2ig\3"+
"\2\2\2ij\3\2\2\2j\7\3\2\2\2ki\3\2\2\2lm\5\n\6\2mn\7\n\2\2n{\3\2\2\2op"+
"\5\36\20\2pq\7\n\2\2q{\3\2\2\2rs\5$\23\2st\7\n\2\2t{\3\2\2\2u{\5*\26\2"+
"v{\5\62\32\2wx\5\16\b\2xy\7\n\2\2y{\3\2\2\2zl\3\2\2\2zo\3\2\2\2zr\3\2"+
"\2\2zu\3\2\2\2zv\3\2\2\2zw\3\2\2\2{\t\3\2\2\2|}\5\22\n\2}~\5\f\7\2~\13"+
"\3\2\2\2\177\u0083\b\7\1\2\u0080\u0082\5\24\13\2\u0081\u0080\3\2\2\2\u0082"+
"\u0085\3\2\2\2\u0083\u0081\3\2\2\2\u0083\u0084\3\2\2\2\u0084\u0086\3\2"+
"\2\2\u0085\u0083\3\2\2\2\u0086\u0087\5\20\t\2\u0087\u0093\3\2\2\2\u0088"+
"\u0089\f\3\2\2\u0089\u008d\7\f\2\2\u008a\u008c\5\24\13\2\u008b\u008a\3"+
"\2\2\2\u008c\u008f\3\2\2\2\u008d\u008b\3\2\2\2\u008d\u008e\3\2\2\2\u008e"+
"\u0090\3\2\2\2\u008f\u008d\3\2\2\2\u0090\u0092\5\20\t\2\u0091\u0088\3"+
"\2\2\2\u0092\u0095\3\2\2\2\u0093\u0091\3\2\2\2\u0093\u0094\3\2\2\2\u0094"+
"\r\3\2\2\2\u0095\u0093\3\2\2\2\u0096\u0097\7)\2\2\u0097\u009b\5\22\n\2"+
"\u0098\u009a\5\24\13\2\u0099\u0098\3\2\2\2\u009a\u009d\3\2\2\2\u009b\u0099"+
"\3\2\2\2\u009b\u009c\3\2\2\2\u009c\u009e\3\2\2\2\u009d\u009b\3\2\2\2\u009e"+
"\u00a2\7m\2\2\u009f\u00a1\5\26\f\2\u00a0\u009f\3\2\2\2\u00a1\u00a4\3\2"+
"\2\2\u00a2\u00a0\3\2\2\2\u00a2\u00a3\3\2\2\2\u00a3\u00a5\3\2\2\2\u00a4"+
"\u00a2\3\2\2\2\u00a5\u00a6\b\b\1\2\u00a6\17\3\2\2\2\u00a7\u00ab\7m\2\2"+
"\u00a8\u00aa\5\26\f\2\u00a9\u00a8\3\2\2\2\u00aa\u00ad\3\2\2\2\u00ab\u00a9"+
"\3\2\2\2\u00ab\u00ac\3\2\2\2\u00ac\u00b0\3\2\2\2\u00ad\u00ab\3\2\2\2\u00ae"+
"\u00af\7\'\2\2\u00af\u00b1\5H%\2\u00b0\u00ae\3\2\2\2\u00b0\u00b1\3\2\2"+
"\2\u00b1\u00bc\3\2\2\2\u00b2\u00b6\7m\2\2\u00b3\u00b5\5\26\f\2\u00b4\u00b3"+
"\3\2\2\2\u00b5\u00b8\3\2\2\2\u00b6\u00b4\3\2\2\2\u00b6\u00b7\3\2\2\2\u00b7"+
"\u00b9\3\2\2\2\u00b8\u00b6\3\2\2\2\u00b9\u00ba\7\'\2\2\u00ba\u00bc\5L"+
"\'\2\u00bb\u00a7\3\2\2\2\u00bb\u00b2\3\2\2\2\u00bc\21\3\2\2\2\u00bd\u00bf"+
"\5\66\34\2\u00be\u00bd\3\2\2\2\u00bf\u00c2\3\2\2\2\u00c0\u00be\3\2\2\2"+
"\u00c0\u00c1\3\2\2\2\u00c1\u00c3\3\2\2\2\u00c2\u00c0\3\2\2\2\u00c3\u00c7"+
"\5\32\16\2\u00c4\u00c6\5\66\34\2\u00c5\u00c4\3\2\2\2\u00c6\u00c9\3\2\2"+
"\2\u00c7\u00c5\3\2\2\2\u00c7\u00c8\3\2\2\2\u00c8\23\3\2\2\2\u00c9\u00c7"+
"\3\2\2\2\u00ca\u00ce\7\24\2\2\u00cb\u00cd\5\66\34\2\u00cc\u00cb\3\2\2"+
"\2\u00cd\u00d0\3\2\2\2\u00ce\u00cc\3\2\2\2\u00ce\u00cf\3\2\2\2\u00cf\25"+
"\3\2\2\2\u00d0\u00ce\3\2\2\2\u00d1\u00d3\7\6\2\2\u00d2\u00d4\5H%\2\u00d3"+
"\u00d2\3\2\2\2\u00d3\u00d4\3\2\2\2\u00d4\u00d5\3\2\2\2\u00d5\u00d6\7\7"+
"\2\2\u00d6\27\3\2\2\2\u00d7\u00d8\b\r\1\2\u00d8\u00d9\5\32\16\2\u00d9"+
"\u00e4\3\2\2\2\u00da\u00db\f\4\2\2\u00db\u00e3\7\24\2\2\u00dc\u00dd\f"+
"\3\2\2\u00dd\u00df\7\6\2\2\u00de\u00e0\5H%\2\u00df\u00de\3\2\2\2\u00df"+
"\u00e0\3\2\2\2\u00e0\u00e1\3\2\2\2\u00e1\u00e3\7\7\2\2\u00e2\u00da\3\2"+
@ -7535,52 +7564,56 @@ public class KickCParser extends Parser {
"\u02eb\3\2\2\2\u02e9\u02e7\3\2\2\2\u02e9\u02ea\3\2\2\2\u02eaS\3\2\2\2"+
"\u02eb\u02e9\3\2\2\2\u02ec\u02f0\5V,\2\u02ed\u02f0\5X-\2\u02ee\u02f0\5"+
"Z.\2\u02ef\u02ec\3\2\2\2\u02ef\u02ed\3\2\2\2\u02ef\u02ee\3\2\2\2\u02f0"+
"U\3\2\2\2\u02f1\u02f2\7\u0093\2\2\u02f2\u02f4\7v\2\2\u02f3\u02f5\7\u0094"+
"\2\2\u02f4\u02f3\3\2\2\2\u02f4\u02f5\3\2\2\2\u02f5\u02fc\3\2\2\2\u02f6"+
"\u02f7\7\u0092\2\2\u02f7\u02f9\7v\2\2\u02f8\u02fa\7\u0094\2\2\u02f9\u02f8"+
"\3\2\2\2\u02f9\u02fa\3\2\2\2\u02fa\u02fc\3\2\2\2\u02fb\u02f1\3\2\2\2\u02fb"+
"\u02f6\3\2\2\2\u02fcW\3\2\2\2\u02fd\u02ff\7t\2\2\u02fe\u0300\5\\/\2\u02ff"+
"\u02fe\3\2\2\2\u02ff\u0300\3\2\2\2\u0300\u0302\3\2\2\2\u0301\u0303\7\u0094"+
"\2\2\u0302\u0301\3\2\2\2\u0302\u0303\3\2\2\2\u0303Y\3\2\2\2\u0304\u0305"+
"\7s\2\2\u0305\u030a\5^\60\2\u0306\u0307\7w\2\2\u0307\u0309\5^\60\2\u0308"+
"\u0306\3\2\2\2\u0309\u030c\3\2\2\2\u030a\u0308\3\2\2\2\u030a\u030b\3\2"+
"\2\2\u030b\u030e\3\2\2\2\u030c\u030a\3\2\2\2\u030d\u030f\7\u0094\2\2\u030e"+
"\u030d\3\2\2\2\u030e\u030f\3\2\2\2\u030f[\3\2\2\2\u0310\u033e\5^\60\2"+
"\u0311\u0312\7u\2\2\u0312\u033e\5^\60\2\u0313\u0314\5^\60\2\u0314\u0315"+
"\7w\2\2\u0315\u0316\5^\60\2\u0316\u033e\3\2\2\2\u0317\u0318\7x\2\2\u0318"+
"\u0319\5^\60\2\u0319\u031a\7y\2\2\u031a\u031b\7w\2\2\u031b\u031c\7\u0093"+
"\2\2\u031c\u033e\3\2\2\2\u031d\u031e\7x\2\2\u031e\u031f\7x\2\2\u031f\u0320"+
"\5^\60\2\u0320\u0321\7y\2\2\u0321\u0322\7y\2\2\u0322\u0323\7w\2\2\u0323"+
"\u0324\7\u0093\2\2\u0324\u033e\3\2\2\2\u0325\u0326\7x\2\2\u0326\u0327"+
"\5^\60\2\u0327\u0328\7w\2\2\u0328\u0329\7\u0093\2\2\u0329\u032a\7y\2\2"+
"\u032a\u032b\7w\2\2\u032b\u032c\7\u0093\2\2\u032c\u033e\3\2\2\2\u032d"+
"\u032e\7x\2\2\u032e\u032f\5^\60\2\u032f\u0330\7w\2\2\u0330\u0331\7\u0093"+
"\2\2\u0331\u0332\7y\2\2\u0332\u033e\3\2\2\2\u0333\u0334\7x\2\2\u0334\u0335"+
"\5^\60\2\u0335\u0336\7y\2\2\u0336\u033e\3\2\2\2\u0337\u0338\7x\2\2\u0338"+
"\u0339\7x\2\2\u0339\u033a\5^\60\2\u033a\u033b\7y\2\2\u033b\u033c\7y\2"+
"\2\u033c\u033e\3\2\2\2\u033d\u0310\3\2\2\2\u033d\u0311\3\2\2\2\u033d\u0313"+
"\3\2\2\2\u033d\u0317\3\2\2\2\u033d\u031d\3\2\2\2\u033d\u0325\3\2\2\2\u033d"+
"\u032d\3\2\2\2\u033d\u0333\3\2\2\2\u033d\u0337\3\2\2\2\u033e]\3\2\2\2"+
"\u033f\u0340\b\60\1\2\u0340\u0341\7z\2\2\u0341\u0342\5^\60\2\u0342\u0343"+
"\7{\2\2\u0343\u034e\3\2\2\2\u0344\u0345\t\t\2\2\u0345\u034e\5^\60\n\u0346"+
"\u034e\7\u0093\2\2\u0347\u034e\7\u0091\2\2\u0348\u0349\7\u0085\2\2\u0349"+
"\u034a\7\u0093\2\2\u034a\u034e\7\u0086\2\2\u034b\u034e\7\u0087\2\2\u034c"+
"\u034e\7\u0090\2\2\u034d\u033f\3\2\2\2\u034d\u0344\3\2\2\2\u034d\u0346"+
"\3\2\2\2\u034d\u0347\3\2\2\2\u034d\u0348\3\2\2\2\u034d\u034b\3\2\2\2\u034d"+
"\u034c\3\2\2\2\u034e\u035d\3\2\2\2\u034f\u0350\f\f\2\2\u0350\u0351\7|"+
"\2\2\u0351\u035c\5^\60\r\u0352\u0353\f\13\2\2\u0353\u0354\t\n\2\2\u0354"+
"\u035c\5^\60\f\u0355\u0356\f\t\2\2\u0356\u0357\t\13\2\2\u0357\u035c\5"+
"^\60\n\u0358\u0359\f\b\2\2\u0359\u035a\t\f\2\2\u035a\u035c\5^\60\t\u035b"+
"\u034f\3\2\2\2\u035b\u0352\3\2\2\2\u035b\u0355\3\2\2\2\u035b\u0358\3\2"+
"\2\2\u035c\u035f\3\2\2\2\u035d\u035b\3\2\2\2\u035d\u035e\3\2\2\2\u035e"+
"_\3\2\2\2\u035f\u035d\3\2\2\2\\iz\u0083\u008d\u0093\u009b\u00a2\u00ab"+
"\u00b0\u00b6\u00bb\u00c0\u00c7\u00ce\u00d3\u00df\u00e2\u00e4\u00ef\u00f6"+
"\u00fb\u0101\u0103\u010b\u0111\u011d\u012b\u0131\u0137\u013d\u0142\u0146"+
"\u014f\u0156\u015d\u0167\u0173\u017e\u0193\u019c\u01a2\u01a7\u01ae\u01bb"+
"\u01c0\u01cc\u01da\u01ed\u01f6\u01fe\u0203\u0208\u020a\u0210\u0215\u0219"+
"\u021f\u0222\u022a\u022d\u0230\u023c\u0248\u0250\u0256\u025a\u026f\u0273"+
"\u027c\u0280\u02b2\u02bc\u02be\u02c6\u02cb\u02d5\u02e4\u02e9\u02ef\u02f4"+
"\u02f9\u02fb\u02ff\u0302\u030a\u030e\u033d\u034d\u035b\u035d";
"U\3\2\2\2\u02f1\u02f2\7\u0093\2\2\u02f2\u02f6\7v\2\2\u02f3\u02f5\7\u0094"+
"\2\2\u02f4\u02f3\3\2\2\2\u02f5\u02f8\3\2\2\2\u02f6\u02f4\3\2\2\2\u02f6"+
"\u02f7\3\2\2\2\u02f7\u0302\3\2\2\2\u02f8\u02f6\3\2\2\2\u02f9\u02fa\7\u0092"+
"\2\2\u02fa\u02fe\7v\2\2\u02fb\u02fd\7\u0094\2\2\u02fc\u02fb\3\2\2\2\u02fd"+
"\u0300\3\2\2\2\u02fe\u02fc\3\2\2\2\u02fe\u02ff\3\2\2\2\u02ff\u0302\3\2"+
"\2\2\u0300\u02fe\3\2\2\2\u0301\u02f1\3\2\2\2\u0301\u02f9\3\2\2\2\u0302"+
"W\3\2\2\2\u0303\u0305\7t\2\2\u0304\u0306\5\\/\2\u0305\u0304\3\2\2\2\u0305"+
"\u0306\3\2\2\2\u0306\u030a\3\2\2\2\u0307\u0309\7\u0094\2\2\u0308\u0307"+
"\3\2\2\2\u0309\u030c\3\2\2\2\u030a\u0308\3\2\2\2\u030a\u030b\3\2\2\2\u030b"+
"Y\3\2\2\2\u030c\u030a\3\2\2\2\u030d\u030e\7s\2\2\u030e\u0313\5^\60\2\u030f"+
"\u0310\7w\2\2\u0310\u0312\5^\60\2\u0311\u030f\3\2\2\2\u0312\u0315\3\2"+
"\2\2\u0313\u0311\3\2\2\2\u0313\u0314\3\2\2\2\u0314\u0319\3\2\2\2\u0315"+
"\u0313\3\2\2\2\u0316\u0318\7\u0094\2\2\u0317\u0316\3\2\2\2\u0318\u031b"+
"\3\2\2\2\u0319\u0317\3\2\2\2\u0319\u031a\3\2\2\2\u031a[\3\2\2\2\u031b"+
"\u0319\3\2\2\2\u031c\u034a\5^\60\2\u031d\u031e\7u\2\2\u031e\u034a\5^\60"+
"\2\u031f\u0320\5^\60\2\u0320\u0321\7w\2\2\u0321\u0322\5^\60\2\u0322\u034a"+
"\3\2\2\2\u0323\u0324\7x\2\2\u0324\u0325\5^\60\2\u0325\u0326\7y\2\2\u0326"+
"\u0327\7w\2\2\u0327\u0328\7\u0093\2\2\u0328\u034a\3\2\2\2\u0329\u032a"+
"\7x\2\2\u032a\u032b\7x\2\2\u032b\u032c\5^\60\2\u032c\u032d\7y\2\2\u032d"+
"\u032e\7y\2\2\u032e\u032f\7w\2\2\u032f\u0330\7\u0093\2\2\u0330\u034a\3"+
"\2\2\2\u0331\u0332\7x\2\2\u0332\u0333\5^\60\2\u0333\u0334\7w\2\2\u0334"+
"\u0335\7\u0093\2\2\u0335\u0336\7y\2\2\u0336\u0337\7w\2\2\u0337\u0338\7"+
"\u0093\2\2\u0338\u034a\3\2\2\2\u0339\u033a\7x\2\2\u033a\u033b\5^\60\2"+
"\u033b\u033c\7w\2\2\u033c\u033d\7\u0093\2\2\u033d\u033e\7y\2\2\u033e\u034a"+
"\3\2\2\2\u033f\u0340\7x\2\2\u0340\u0341\5^\60\2\u0341\u0342\7y\2\2\u0342"+
"\u034a\3\2\2\2\u0343\u0344\7x\2\2\u0344\u0345\7x\2\2\u0345\u0346\5^\60"+
"\2\u0346\u0347\7y\2\2\u0347\u0348\7y\2\2\u0348\u034a\3\2\2\2\u0349\u031c"+
"\3\2\2\2\u0349\u031d\3\2\2\2\u0349\u031f\3\2\2\2\u0349\u0323\3\2\2\2\u0349"+
"\u0329\3\2\2\2\u0349\u0331\3\2\2\2\u0349\u0339\3\2\2\2\u0349\u033f\3\2"+
"\2\2\u0349\u0343\3\2\2\2\u034a]\3\2\2\2\u034b\u034c\b\60\1\2\u034c\u034d"+
"\7z\2\2\u034d\u034e\5^\60\2\u034e\u034f\7{\2\2\u034f\u035a\3\2\2\2\u0350"+
"\u0351\t\t\2\2\u0351\u035a\5^\60\n\u0352\u035a\7\u0093\2\2\u0353\u035a"+
"\7\u0091\2\2\u0354\u0355\7\u0085\2\2\u0355\u0356\7\u0093\2\2\u0356\u035a"+
"\7\u0086\2\2\u0357\u035a\7\u0087\2\2\u0358\u035a\7\u0090\2\2\u0359\u034b"+
"\3\2\2\2\u0359\u0350\3\2\2\2\u0359\u0352\3\2\2\2\u0359\u0353\3\2\2\2\u0359"+
"\u0354\3\2\2\2\u0359\u0357\3\2\2\2\u0359\u0358\3\2\2\2\u035a\u0369\3\2"+
"\2\2\u035b\u035c\f\f\2\2\u035c\u035d\7|\2\2\u035d\u0368\5^\60\r\u035e"+
"\u035f\f\13\2\2\u035f\u0360\t\n\2\2\u0360\u0368\5^\60\f\u0361\u0362\f"+
"\t\2\2\u0362\u0363\t\13\2\2\u0363\u0368\5^\60\n\u0364\u0365\f\b\2\2\u0365"+
"\u0366\t\f\2\2\u0366\u0368\5^\60\t\u0367\u035b\3\2\2\2\u0367\u035e\3\2"+
"\2\2\u0367\u0361\3\2\2\2\u0367\u0364\3\2\2\2\u0368\u036b\3\2\2\2\u0369"+
"\u0367\3\2\2\2\u0369\u036a\3\2\2\2\u036a_\3\2\2\2\u036b\u0369\3\2\2\2"+
"\\iz\u0083\u008d\u0093\u009b\u00a2\u00ab\u00b0\u00b6\u00bb\u00c0\u00c7"+
"\u00ce\u00d3\u00df\u00e2\u00e4\u00ef\u00f6\u00fb\u0101\u0103\u010b\u0111"+
"\u011d\u012b\u0131\u0137\u013d\u0142\u0146\u014f\u0156\u015d\u0167\u0173"+
"\u017e\u0193\u019c\u01a2\u01a7\u01ae\u01bb\u01c0\u01cc\u01da\u01ed\u01f6"+
"\u01fe\u0203\u0208\u020a\u0210\u0215\u0219\u021f\u0222\u022a\u022d\u0230"+
"\u023c\u0248\u0250\u0256\u025a\u026f\u0273\u027c\u0280\u02b2\u02bc\u02be"+
"\u02c6\u02cb\u02d5\u02e4\u02e9\u02ef\u02f6\u02fe\u0301\u0305\u030a\u0313"+
"\u0319\u0349\u0359\u0367\u0369";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -1060,10 +1060,6 @@ public class Pass4CodeGeneration {
} catch(AsmFragmentTemplateSynthesizer.UnknownFragmentException e) {
throw new CompileError("Interrupt type not supported " + procedure.getInterruptType() + " int " + procedure.toString() + "\n" + e.getMessage());
}
// Mark labels as don't optimize
for(AsmLine asmLine : asm.getCurrentChunk().getLines()) {
if(asmLine instanceof AsmLabel) ((AsmLabel) asmLine).setDontOptimize(true);
}
}
private void addKickAsm(AsmProgram asm, StatementKickAsm statementKasm) {

View File

@ -32,7 +32,7 @@ public class Pass5UnnecesaryLoadElimination extends Pass5AsmOptimization {
AsmLine line = lineIt.next();
if(line instanceof AsmInstruction) {
AsmInstruction instruction = (AsmInstruction) line;
if(instruction.isDontOptimize()) {
if(instruction.isNoOptimize()) {
continue;
}
CpuOpcode cpuOpcode = instruction.getCpuOpcode();

View File

@ -72,7 +72,7 @@ public class Pass5UnusedLabelElimination extends Pass5AsmOptimization {
currentScope = "";
} else if(line instanceof AsmLabel) {
AsmLabel label = (AsmLabel) line;
if(label.isDontOptimize()) {
if(label.isNoOptimize()) {
continue;
}
String labelStr = currentScope + "::" + label.getLabel();