1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-12-26 18:29:54 +00:00

Added literal char syntax. Added literal test. Improved voronoi by using inmem arrays.

This commit is contained in:
jespergravgaard 2017-10-19 10:21:32 +02:00
parent b4abb9394e
commit 1ee63ce40a
29 changed files with 5297 additions and 6378 deletions

View File

@ -87,6 +87,8 @@ public class AsmFragment {
return asmName.replace("#", "_").replace("$", "_");
} else if (value instanceof ConstantInteger) {
return getAsmNumber(((ConstantInteger) value).getNumber());
} else if (value instanceof ConstantChar) {
return "'"+((ConstantChar) value).getValue()+"'";
} else if (value instanceof ConstantUnary) {
ConstantUnary unary = (ConstantUnary) value;
Operator operator = unary.getOperator();

View File

@ -0,0 +1,37 @@
package dk.camelot64.kickc.model;
/**
* SSA form constant char value (a byte)
*/
public class ConstantChar implements ConstantValue {
private Character value;
public ConstantChar(Character value) {
this.value = value;
}
@Override
public SymbolType getType(ProgramScope scope) {
return SymbolTypeBasic.BYTE;
}
public Character getValue() {
return value;
}
@Override
public String toString() {
return toString(null);
}
@Override
public String toString(Program program) {
if (program == null) {
return "'" + value + "'";
} else {
return "(" + SymbolTypeBasic.BYTE.getTypeName() + ") " + "'" + value + "'";
}
}
}

View File

@ -104,6 +104,8 @@ public class SymbolTypeInference {
return rInt.getType(programScope);
} else if (rValue instanceof ConstantString) {
type = SymbolTypeBasic.STRING;
} else if (rValue instanceof ConstantChar) {
type = SymbolTypeBasic.BYTE;
} else if (rValue instanceof ConstantBool) {
type = SymbolTypeBasic.BOOLEAN;
} else if (rValue instanceof ConstantUnary) {

View File

@ -72,6 +72,7 @@ expr
| NAME #exprId
| NUMBER #exprNumber
| STRING #exprString
| CHAR #exprChar
| BOOLEAN #exprBool
;
@ -81,6 +82,7 @@ parameterList
SIMPLETYPE: 'byte' | 'word' | 'string' | 'boolean' | 'void' ;
STRING : '"' ('\\"' | ~'"')* '"';
CHAR : '\'' ('\\\'' | ~'\'' ) '\'';
BOOLEAN : 'true' | 'false';
NUMBER : NUMFLOAT | NUMINT ;
NUMFLOAT : BINFLOAT | DECFLOAT | HEXFLOAT;

View File

@ -42,20 +42,21 @@ T__40=41
T__41=42
SIMPLETYPE=43
STRING=44
BOOLEAN=45
NUMBER=46
NUMFLOAT=47
BINFLOAT=48
DECFLOAT=49
HEXFLOAT=50
NUMINT=51
BININTEGER=52
DECINTEGER=53
HEXINTEGER=54
NAME=55
WS=56
COMMENT_LINE=57
COMMENT_BLOCK=58
CHAR=45
BOOLEAN=46
NUMBER=47
NUMFLOAT=48
BINFLOAT=49
DECFLOAT=50
HEXFLOAT=51
NUMINT=52
BININTEGER=53
DECINTEGER=54
HEXINTEGER=55
NAME=56
WS=57
COMMENT_LINE=58
COMMENT_BLOCK=59
'{'=1
'}'=2
'('=3

View File

@ -323,30 +323,6 @@ public class KickCBaseListener implements KickCListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitLvaluePar(KickCParser.LvalueParContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterExprCast(KickCParser.ExprCastContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitExprCast(KickCParser.ExprCastContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterExprCall(KickCParser.ExprCallContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitExprCall(KickCParser.ExprCallContext ctx) { }
/**
* {@inheritDoc}
*
@ -371,6 +347,78 @@ public class KickCBaseListener implements KickCListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitExprBinary(KickCParser.ExprBinaryContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterExprPostMod(KickCParser.ExprPostModContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitExprPostMod(KickCParser.ExprPostModContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterExprUnary(KickCParser.ExprUnaryContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitExprUnary(KickCParser.ExprUnaryContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterExprNumber(KickCParser.ExprNumberContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitExprNumber(KickCParser.ExprNumberContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterExprChar(KickCParser.ExprCharContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitExprChar(KickCParser.ExprCharContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterExprCast(KickCParser.ExprCastContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitExprCast(KickCParser.ExprCastContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterExprCall(KickCParser.ExprCallContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitExprCall(KickCParser.ExprCallContext ctx) { }
/**
* {@inheritDoc}
*
@ -407,18 +455,6 @@ public class KickCBaseListener implements KickCListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitExprBool(KickCParser.ExprBoolContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterExprPostMod(KickCParser.ExprPostModContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitExprPostMod(KickCParser.ExprPostModContext ctx) { }
/**
* {@inheritDoc}
*
@ -431,30 +467,6 @@ public class KickCBaseListener implements KickCListener {
* <p>The default implementation does nothing.</p>
*/
@Override public void exitExprId(KickCParser.ExprIdContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterExprUnary(KickCParser.ExprUnaryContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitExprUnary(KickCParser.ExprUnaryContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void enterExprNumber(KickCParser.ExprNumberContext ctx) { }
/**
* {@inheritDoc}
*
* <p>The default implementation does nothing.</p>
*/
@Override public void exitExprNumber(KickCParser.ExprNumberContext ctx) { }
/**
* {@inheritDoc}
*

View File

@ -193,20 +193,6 @@ public class KickCBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitLvaluePar(KickCParser.LvalueParContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExprCast(KickCParser.ExprCastContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExprCall(KickCParser.ExprCallContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@ -221,6 +207,48 @@ public class KickCBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExprBinary(KickCParser.ExprBinaryContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExprPostMod(KickCParser.ExprPostModContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExprUnary(KickCParser.ExprUnaryContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExprNumber(KickCParser.ExprNumberContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExprChar(KickCParser.ExprCharContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExprCast(KickCParser.ExprCastContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExprCall(KickCParser.ExprCallContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@ -242,13 +270,6 @@ public class KickCBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExprBool(KickCParser.ExprBoolContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExprPostMod(KickCParser.ExprPostModContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
@ -256,20 +277,6 @@ public class KickCBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExprId(KickCParser.ExprIdContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExprUnary(KickCParser.ExprUnaryContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
* <p>The default implementation returns the result of calling
* {@link #visitChildren} on {@code ctx}.</p>
*/
@Override public T visitExprNumber(KickCParser.ExprNumberContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*

View File

@ -22,10 +22,10 @@ public class KickCLexer extends Lexer {
T__17=18, T__18=19, T__19=20, T__20=21, T__21=22, T__22=23, T__23=24,
T__24=25, T__25=26, T__26=27, T__27=28, T__28=29, T__29=30, T__30=31,
T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38,
T__38=39, T__39=40, T__40=41, T__41=42, SIMPLETYPE=43, STRING=44, BOOLEAN=45,
NUMBER=46, NUMFLOAT=47, BINFLOAT=48, DECFLOAT=49, HEXFLOAT=50, NUMINT=51,
BININTEGER=52, DECINTEGER=53, HEXINTEGER=54, NAME=55, WS=56, COMMENT_LINE=57,
COMMENT_BLOCK=58;
T__38=39, T__39=40, T__40=41, T__41=42, SIMPLETYPE=43, STRING=44, CHAR=45,
BOOLEAN=46, NUMBER=47, NUMFLOAT=48, BINFLOAT=49, DECFLOAT=50, HEXFLOAT=51,
NUMINT=52, BININTEGER=53, DECINTEGER=54, HEXINTEGER=55, NAME=56, WS=57,
COMMENT_LINE=58, COMMENT_BLOCK=59;
public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
};
@ -40,10 +40,10 @@ public class KickCLexer extends Lexer {
"T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24",
"T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32",
"T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "T__39", "T__40",
"T__41", "SIMPLETYPE", "STRING", "BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT",
"DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER",
"BINDIGIT", "DECDIGIT", "HEXDIGIT", "NAME", "NAME_START", "NAME_CHAR",
"WS", "COMMENT_LINE", "COMMENT_BLOCK"
"T__41", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT",
"BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER",
"HEXINTEGER", "BINDIGIT", "DECDIGIT", "HEXDIGIT", "NAME", "NAME_START",
"NAME_CHAR", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
};
private static final String[] _LITERAL_NAMES = {
@ -57,9 +57,10 @@ public class KickCLexer extends Lexer {
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, "SIMPLETYPE", "STRING", "BOOLEAN",
"NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER",
"DECINTEGER", "HEXINTEGER", "NAME", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
null, null, null, null, null, null, null, "SIMPLETYPE", "STRING", "CHAR",
"BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT",
"BININTEGER", "DECINTEGER", "HEXINTEGER", "NAME", "WS", "COMMENT_LINE",
"COMMENT_BLOCK"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -119,7 +120,7 @@ public class KickCLexer extends Lexer {
public ATN getATN() { return _ATN; }
public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2<\u01be\b\1\4\2\t"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2=\u01c8\b\1\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"+
@ -127,153 +128,156 @@ public class KickCLexer extends Lexer {
"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+
",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+
"\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+
"\4>\t>\4?\t?\4@\t@\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3\6\3\6"+
"\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3"+
"\13\3\13\3\13\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16"+
"\3\16\3\17\3\17\3\20\3\20\3\20\3\21\3\21\3\22\3\22\3\23\3\23\3\24\3\24"+
"\3\25\3\25\3\25\3\26\3\26\3\26\3\27\3\27\3\30\3\30\3\31\3\31\3\31\3\31"+
"\3\32\3\32\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3\37\3\37"+
"\3\37\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,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\5,\u0116\n,\3-\3-"+
"\3-\3-\7-\u011c\n-\f-\16-\u011f\13-\3-\3-\3.\3.\3.\3.\3.\3.\3.\3.\3.\5"+
".\u012c\n.\3/\3/\5/\u0130\n/\3\60\3\60\3\60\5\60\u0135\n\60\3\61\3\61"+
"\3\61\3\61\3\61\5\61\u013c\n\61\3\61\7\61\u013f\n\61\f\61\16\61\u0142"+
"\13\61\3\61\3\61\6\61\u0146\n\61\r\61\16\61\u0147\3\62\7\62\u014b\n\62"+
"\f\62\16\62\u014e\13\62\3\62\3\62\6\62\u0152\n\62\r\62\16\62\u0153\3\63"+
"\3\63\3\63\3\63\3\63\5\63\u015b\n\63\3\63\7\63\u015e\n\63\f\63\16\63\u0161"+
"\13\63\3\63\3\63\6\63\u0165\n\63\r\63\16\63\u0166\3\64\3\64\3\64\5\64"+
"\u016c\n\64\3\65\3\65\3\65\6\65\u0171\n\65\r\65\16\65\u0172\3\65\3\65"+
"\6\65\u0177\n\65\r\65\16\65\u0178\5\65\u017b\n\65\3\66\6\66\u017e\n\66"+
"\r\66\16\66\u017f\3\67\3\67\3\67\3\67\3\67\5\67\u0187\n\67\3\67\6\67\u018a"+
"\n\67\r\67\16\67\u018b\38\38\39\39\3:\3:\3;\3;\7;\u0196\n;\f;\16;\u0199"+
"\13;\3<\3<\3=\3=\3>\6>\u01a0\n>\r>\16>\u01a1\3>\3>\3?\3?\3?\3?\7?\u01aa"+
"\n?\f?\16?\u01ad\13?\3?\3?\3@\3@\3@\3@\7@\u01b5\n@\f@\16@\u01b8\13@\3"+
"@\3@\3@\3@\3@\3\u01b6\2A\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f"+
"\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63"+
"\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62"+
"c\63e\64g\65i\66k\67m8o\2q\2s\2u9w\2y\2{:};\177<\3\2\13\3\2$$\4\2DDdd"+
"\3\2\62\63\3\2\62;\5\2\62;CHch\5\2C\\aac|\6\2\62;C\\aac|\5\2\13\f\17\17"+
"\"\"\4\2\f\f\17\17\2\u01d9\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2"+
"\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2"+
"\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3"+
"\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2"+
"\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67"+
"\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2"+
"\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2"+
"\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]"+
"\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2"+
"\2\2\2k\3\2\2\2\2m\3\2\2\2\2u\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2"+
"\2\2\3\u0081\3\2\2\2\5\u0083\3\2\2\2\7\u0085\3\2\2\2\t\u0087\3\2\2\2\13"+
"\u0089\3\2\2\2\r\u008f\3\2\2\2\17\u0091\3\2\2\2\21\u0093\3\2\2\2\23\u0096"+
"\3\2\2\2\25\u009b\3\2\2\2\27\u00a1\3\2\2\2\31\u00a4\3\2\2\2\33\u00a8\3"+
"\2\2\2\35\u00af\3\2\2\2\37\u00b1\3\2\2\2!\u00b4\3\2\2\2#\u00b6\3\2\2\2"+
"%\u00b8\3\2\2\2\'\u00ba\3\2\2\2)\u00bc\3\2\2\2+\u00bf\3\2\2\2-\u00c2\3"+
"\2\2\2/\u00c4\3\2\2\2\61\u00c6\3\2\2\2\63\u00ca\3\2\2\2\65\u00cc\3\2\2"+
"\2\67\u00ce\3\2\2\29\u00d1\3\2\2\2;\u00d4\3\2\2\2=\u00d6\3\2\2\2?\u00d9"+
"\3\2\2\2A\u00dc\3\2\2\2C\u00df\3\2\2\2E\u00e1\3\2\2\2G\u00e4\3\2\2\2I"+
"\u00e7\3\2\2\2K\u00ea\3\2\2\2M\u00ed\3\2\2\2O\u00ef\3\2\2\2Q\u00f3\3\2"+
"\2\2S\u00f6\3\2\2\2U\u00f9\3\2\2\2W\u0115\3\2\2\2Y\u0117\3\2\2\2[\u012b"+
"\3\2\2\2]\u012f\3\2\2\2_\u0134\3\2\2\2a\u013b\3\2\2\2c\u014c\3\2\2\2e"+
"\u015a\3\2\2\2g\u016b\3\2\2\2i\u017a\3\2\2\2k\u017d\3\2\2\2m\u0186\3\2"+
"\2\2o\u018d\3\2\2\2q\u018f\3\2\2\2s\u0191\3\2\2\2u\u0193\3\2\2\2w\u019a"+
"\3\2\2\2y\u019c\3\2\2\2{\u019f\3\2\2\2}\u01a5\3\2\2\2\177\u01b0\3\2\2"+
"\2\u0081\u0082\7}\2\2\u0082\4\3\2\2\2\u0083\u0084\7\177\2\2\u0084\6\3"+
"\2\2\2\u0085\u0086\7*\2\2\u0086\b\3\2\2\2\u0087\u0088\7+\2\2\u0088\n\3"+
"\2\2\2\u0089\u008a\7e\2\2\u008a\u008b\7q\2\2\u008b\u008c\7p\2\2\u008c"+
"\u008d\7u\2\2\u008d\u008e\7v\2\2\u008e\f\3\2\2\2\u008f\u0090\7?\2\2\u0090"+
"\16\3\2\2\2\u0091\u0092\7=\2\2\u0092\20\3\2\2\2\u0093\u0094\7k\2\2\u0094"+
"\u0095\7h\2\2\u0095\22\3\2\2\2\u0096\u0097\7g\2\2\u0097\u0098\7n\2\2\u0098"+
"\u0099\7u\2\2\u0099\u009a\7g\2\2\u009a\24\3\2\2\2\u009b\u009c\7y\2\2\u009c"+
"\u009d\7j\2\2\u009d\u009e\7k\2\2\u009e\u009f\7n\2\2\u009f\u00a0\7g\2\2"+
"\u00a0\26\3\2\2\2\u00a1\u00a2\7f\2\2\u00a2\u00a3\7q\2\2\u00a3\30\3\2\2"+
"\2\u00a4\u00a5\7h\2\2\u00a5\u00a6\7q\2\2\u00a6\u00a7\7t\2\2\u00a7\32\3"+
"\2\2\2\u00a8\u00a9\7t\2\2\u00a9\u00aa\7g\2\2\u00aa\u00ab\7v\2\2\u00ab"+
"\u00ac\7w\2\2\u00ac\u00ad\7t\2\2\u00ad\u00ae\7p\2\2\u00ae\34\3\2\2\2\u00af"+
"\u00b0\7<\2\2\u00b0\36\3\2\2\2\u00b1\u00b2\7\60\2\2\u00b2\u00b3\7\60\2"+
"\2\u00b3 \3\2\2\2\u00b4\u00b5\7.\2\2\u00b5\"\3\2\2\2\u00b6\u00b7\7,\2"+
"\2\u00b7$\3\2\2\2\u00b8\u00b9\7]\2\2\u00b9&\3\2\2\2\u00ba\u00bb\7_\2\2"+
"\u00bb(\3\2\2\2\u00bc\u00bd\7/\2\2\u00bd\u00be\7/\2\2\u00be*\3\2\2\2\u00bf"+
"\u00c0\7-\2\2\u00c0\u00c1\7-\2\2\u00c1,\3\2\2\2\u00c2\u00c3\7-\2\2\u00c3"+
".\3\2\2\2\u00c4\u00c5\7/\2\2\u00c5\60\3\2\2\2\u00c6\u00c7\7p\2\2\u00c7"+
"\u00c8\7q\2\2\u00c8\u00c9\7v\2\2\u00c9\62\3\2\2\2\u00ca\u00cb\7#\2\2\u00cb"+
"\64\3\2\2\2\u00cc\u00cd\7(\2\2\u00cd\66\3\2\2\2\u00ce\u00cf\7@\2\2\u00cf"+
"\u00d0\7@\2\2\u00d08\3\2\2\2\u00d1\u00d2\7>\2\2\u00d2\u00d3\7>\2\2\u00d3"+
":\3\2\2\2\u00d4\u00d5\7\61\2\2\u00d5<\3\2\2\2\u00d6\u00d7\7?\2\2\u00d7"+
"\u00d8\7?\2\2\u00d8>\3\2\2\2\u00d9\u00da\7#\2\2\u00da\u00db\7?\2\2\u00db"+
"@\3\2\2\2\u00dc\u00dd\7>\2\2\u00dd\u00de\7@\2\2\u00deB\3\2\2\2\u00df\u00e0"+
"\7>\2\2\u00e0D\3\2\2\2\u00e1\u00e2\7>\2\2\u00e2\u00e3\7?\2\2\u00e3F\3"+
"\2\2\2\u00e4\u00e5\7?\2\2\u00e5\u00e6\7>\2\2\u00e6H\3\2\2\2\u00e7\u00e8"+
"\7@\2\2\u00e8\u00e9\7?\2\2\u00e9J\3\2\2\2\u00ea\u00eb\7?\2\2\u00eb\u00ec"+
"\7@\2\2\u00ecL\3\2\2\2\u00ed\u00ee\7@\2\2\u00eeN\3\2\2\2\u00ef\u00f0\7"+
"c\2\2\u00f0\u00f1\7p\2\2\u00f1\u00f2\7f\2\2\u00f2P\3\2\2\2\u00f3\u00f4"+
"\7(\2\2\u00f4\u00f5\7(\2\2\u00f5R\3\2\2\2\u00f6\u00f7\7q\2\2\u00f7\u00f8"+
"\7t\2\2\u00f8T\3\2\2\2\u00f9\u00fa\7~\2\2\u00fa\u00fb\7~\2\2\u00fbV\3"+
"\2\2\2\u00fc\u00fd\7d\2\2\u00fd\u00fe\7{\2\2\u00fe\u00ff\7v\2\2\u00ff"+
"\u0116\7g\2\2\u0100\u0101\7y\2\2\u0101\u0102\7q\2\2\u0102\u0103\7t\2\2"+
"\u0103\u0116\7f\2\2\u0104\u0105\7u\2\2\u0105\u0106\7v\2\2\u0106\u0107"+
"\7t\2\2\u0107\u0108\7k\2\2\u0108\u0109\7p\2\2\u0109\u0116\7i\2\2\u010a"+
"\u010b\7d\2\2\u010b\u010c\7q\2\2\u010c\u010d\7q\2\2\u010d\u010e\7n\2\2"+
"\u010e\u010f\7g\2\2\u010f\u0110\7c\2\2\u0110\u0116\7p\2\2\u0111\u0112"+
"\7x\2\2\u0112\u0113\7q\2\2\u0113\u0114\7k\2\2\u0114\u0116\7f\2\2\u0115"+
"\u00fc\3\2\2\2\u0115\u0100\3\2\2\2\u0115\u0104\3\2\2\2\u0115\u010a\3\2"+
"\2\2\u0115\u0111\3\2\2\2\u0116X\3\2\2\2\u0117\u011d\7$\2\2\u0118\u0119"+
"\7^\2\2\u0119\u011c\7$\2\2\u011a\u011c\n\2\2\2\u011b\u0118\3\2\2\2\u011b"+
"\u011a\3\2\2\2\u011c\u011f\3\2\2\2\u011d\u011b\3\2\2\2\u011d\u011e\3\2"+
"\2\2\u011e\u0120\3\2\2\2\u011f\u011d\3\2\2\2\u0120\u0121\7$\2\2\u0121"+
"Z\3\2\2\2\u0122\u0123\7v\2\2\u0123\u0124\7t\2\2\u0124\u0125\7w\2\2\u0125"+
"\u012c\7g\2\2\u0126\u0127\7h\2\2\u0127\u0128\7c\2\2\u0128\u0129\7n\2\2"+
"\u0129\u012a\7u\2\2\u012a\u012c\7g\2\2\u012b\u0122\3\2\2\2\u012b\u0126"+
"\3\2\2\2\u012c\\\3\2\2\2\u012d\u0130\5_\60\2\u012e\u0130\5g\64\2\u012f"+
"\u012d\3\2\2\2\u012f\u012e\3\2\2\2\u0130^\3\2\2\2\u0131\u0135\5a\61\2"+
"\u0132\u0135\5c\62\2\u0133\u0135\5e\63\2\u0134\u0131\3\2\2\2\u0134\u0132"+
"\3\2\2\2\u0134\u0133\3\2\2\2\u0135`\3\2\2\2\u0136\u013c\7\'\2\2\u0137"+
"\u0138\7\62\2\2\u0138\u013c\7d\2\2\u0139\u013a\7\62\2\2\u013a\u013c\7"+
"D\2\2\u013b\u0136\3\2\2\2\u013b\u0137\3\2\2\2\u013b\u0139\3\2\2\2\u013c"+
"\u0140\3\2\2\2\u013d\u013f\5o8\2\u013e\u013d\3\2\2\2\u013f\u0142\3\2\2"+
"\2\u0140\u013e\3\2\2\2\u0140\u0141\3\2\2\2\u0141\u0143\3\2\2\2\u0142\u0140"+
"\3\2\2\2\u0143\u0145\7\60\2\2\u0144\u0146\5o8\2\u0145\u0144\3\2\2\2\u0146"+
"\u0147\3\2\2\2\u0147\u0145\3\2\2\2\u0147\u0148\3\2\2\2\u0148b\3\2\2\2"+
"\u0149\u014b\5q9\2\u014a\u0149\3\2\2\2\u014b\u014e\3\2\2\2\u014c\u014a"+
"\3\2\2\2\u014c\u014d\3\2\2\2\u014d\u014f\3\2\2\2\u014e\u014c\3\2\2\2\u014f"+
"\u0151\7\60\2\2\u0150\u0152\5q9\2\u0151\u0150\3\2\2\2\u0152\u0153\3\2"+
"\2\2\u0153\u0151\3\2\2\2\u0153\u0154\3\2\2\2\u0154d\3\2\2\2\u0155\u015b"+
"\7&\2\2\u0156\u0157\7\62\2\2\u0157\u015b\7z\2\2\u0158\u0159\7\62\2\2\u0159"+
"\u015b\7Z\2\2\u015a\u0155\3\2\2\2\u015a\u0156\3\2\2\2\u015a\u0158\3\2"+
"\2\2\u015b\u015f\3\2\2\2\u015c\u015e\5s:\2\u015d\u015c\3\2\2\2\u015e\u0161"+
"\3\2\2\2\u015f\u015d\3\2\2\2\u015f\u0160\3\2\2\2\u0160\u0162\3\2\2\2\u0161"+
"\u015f\3\2\2\2\u0162\u0164\7\60\2\2\u0163\u0165\5s:\2\u0164\u0163\3\2"+
"\2\2\u0165\u0166\3\2\2\2\u0166\u0164\3\2\2\2\u0166\u0167\3\2\2\2\u0167"+
"f\3\2\2\2\u0168\u016c\5k\66\2\u0169\u016c\5m\67\2\u016a\u016c\5i\65\2"+
"\u016b\u0168\3\2\2\2\u016b\u0169\3\2\2\2\u016b\u016a\3\2\2\2\u016ch\3"+
"\2\2\2\u016d\u016e\7\62\2\2\u016e\u0170\t\3\2\2\u016f\u0171\5o8\2\u0170"+
"\u016f\3\2\2\2\u0171\u0172\3\2\2\2\u0172\u0170\3\2\2\2\u0172\u0173\3\2"+
"\2\2\u0173\u017b\3\2\2\2\u0174\u0176\7\'\2\2\u0175\u0177\5o8\2\u0176\u0175"+
"\3\2\2\2\u0177\u0178\3\2\2\2\u0178\u0176\3\2\2\2\u0178\u0179\3\2\2\2\u0179"+
"\u017b\3\2\2\2\u017a\u016d\3\2\2\2\u017a\u0174\3\2\2\2\u017bj\3\2\2\2"+
"\u017c\u017e\5q9\2\u017d\u017c\3\2\2\2\u017e\u017f\3\2\2\2\u017f\u017d"+
"\3\2\2\2\u017f\u0180\3\2\2\2\u0180l\3\2\2\2\u0181\u0187\7&\2\2\u0182\u0183"+
"\7\62\2\2\u0183\u0187\7z\2\2\u0184\u0185\7\62\2\2\u0185\u0187\7Z\2\2\u0186"+
"\u0181\3\2\2\2\u0186\u0182\3\2\2\2\u0186\u0184\3\2\2\2\u0187\u0189\3\2"+
"\2\2\u0188\u018a\5s:\2\u0189\u0188\3\2\2\2\u018a\u018b\3\2\2\2\u018b\u0189"+
"\3\2\2\2\u018b\u018c\3\2\2\2\u018cn\3\2\2\2\u018d\u018e\t\4\2\2\u018e"+
"p\3\2\2\2\u018f\u0190\t\5\2\2\u0190r\3\2\2\2\u0191\u0192\t\6\2\2\u0192"+
"t\3\2\2\2\u0193\u0197\5w<\2\u0194\u0196\5y=\2\u0195\u0194\3\2\2\2\u0196"+
"\u0199\3\2\2\2\u0197\u0195\3\2\2\2\u0197\u0198\3\2\2\2\u0198v\3\2\2\2"+
"\u0199\u0197\3\2\2\2\u019a\u019b\t\7\2\2\u019bx\3\2\2\2\u019c\u019d\t"+
"\b\2\2\u019dz\3\2\2\2\u019e\u01a0\t\t\2\2\u019f\u019e\3\2\2\2\u01a0\u01a1"+
"\3\2\2\2\u01a1\u019f\3\2\2\2\u01a1\u01a2\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3"+
"\u01a4\b>\2\2\u01a4|\3\2\2\2\u01a5\u01a6\7\61\2\2\u01a6\u01a7\7\61\2\2"+
"\u01a7\u01ab\3\2\2\2\u01a8\u01aa\n\n\2\2\u01a9\u01a8\3\2\2\2\u01aa\u01ad"+
"\3\2\2\2\u01ab\u01a9\3\2\2\2\u01ab\u01ac\3\2\2\2\u01ac\u01ae\3\2\2\2\u01ad"+
"\u01ab\3\2\2\2\u01ae\u01af\b?\2\2\u01af~\3\2\2\2\u01b0\u01b1\7\61\2\2"+
"\u01b1\u01b2\7,\2\2\u01b2\u01b6\3\2\2\2\u01b3\u01b5\13\2\2\2\u01b4\u01b3"+
"\3\2\2\2\u01b5\u01b8\3\2\2\2\u01b6\u01b7\3\2\2\2\u01b6\u01b4\3\2\2\2\u01b7"+
"\u01b9\3\2\2\2\u01b8\u01b6\3\2\2\2\u01b9\u01ba\7,\2\2\u01ba\u01bb\7\61"+
"\2\2\u01bb\u01bc\3\2\2\2\u01bc\u01bd\b@\2\2\u01bd\u0080\3\2\2\2\34\2\u0115"+
"\u011b\u011d\u012b\u012f\u0134\u013b\u0140\u0147\u014c\u0153\u015a\u015f"+
"\u0166\u016b\u0172\u0178\u017a\u017f\u0186\u018b\u0197\u01a1\u01ab\u01b6"+
"\3\b\2\2";
"\4>\t>\4?\t?\4@\t@\4A\tA\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3"+
"\6\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3"+
"\13\3\13\3\13\3\13\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16"+
"\3\16\3\16\3\17\3\17\3\20\3\20\3\20\3\21\3\21\3\22\3\22\3\23\3\23\3\24"+
"\3\24\3\25\3\25\3\25\3\26\3\26\3\26\3\27\3\27\3\30\3\30\3\31\3\31\3\31"+
"\3\31\3\32\3\32\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3\37"+
"\3\37\3\37\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,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\5,\u0118\n,\3"+
"-\3-\3-\3-\7-\u011e\n-\f-\16-\u0121\13-\3-\3-\3.\3.\3.\3.\5.\u0129\n."+
"\3.\3.\3/\3/\3/\3/\3/\3/\3/\3/\3/\5/\u0136\n/\3\60\3\60\5\60\u013a\n\60"+
"\3\61\3\61\3\61\5\61\u013f\n\61\3\62\3\62\3\62\3\62\3\62\5\62\u0146\n"+
"\62\3\62\7\62\u0149\n\62\f\62\16\62\u014c\13\62\3\62\3\62\6\62\u0150\n"+
"\62\r\62\16\62\u0151\3\63\7\63\u0155\n\63\f\63\16\63\u0158\13\63\3\63"+
"\3\63\6\63\u015c\n\63\r\63\16\63\u015d\3\64\3\64\3\64\3\64\3\64\5\64\u0165"+
"\n\64\3\64\7\64\u0168\n\64\f\64\16\64\u016b\13\64\3\64\3\64\6\64\u016f"+
"\n\64\r\64\16\64\u0170\3\65\3\65\3\65\5\65\u0176\n\65\3\66\3\66\3\66\6"+
"\66\u017b\n\66\r\66\16\66\u017c\3\66\3\66\6\66\u0181\n\66\r\66\16\66\u0182"+
"\5\66\u0185\n\66\3\67\6\67\u0188\n\67\r\67\16\67\u0189\38\38\38\38\38"+
"\58\u0191\n8\38\68\u0194\n8\r8\168\u0195\39\39\3:\3:\3;\3;\3<\3<\7<\u01a0"+
"\n<\f<\16<\u01a3\13<\3=\3=\3>\3>\3?\6?\u01aa\n?\r?\16?\u01ab\3?\3?\3@"+
"\3@\3@\3@\7@\u01b4\n@\f@\16@\u01b7\13@\3@\3@\3A\3A\3A\3A\7A\u01bf\nA\f"+
"A\16A\u01c2\13A\3A\3A\3A\3A\3A\3\u01c0\2B\3\3\5\4\7\5\t\6\13\7\r\b\17"+
"\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+"+
"\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+"+
"U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q\2s\2u\2w:y\2{\2};\177<\u0081"+
"=\3\2\f\3\2$$\3\2))\4\2DDdd\3\2\62\63\3\2\62;\5\2\62;CHch\5\2C\\aac|\6"+
"\2\62;C\\aac|\5\2\13\f\17\17\"\"\4\2\f\f\17\17\2\u01e4\2\3\3\2\2\2\2\5"+
"\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2"+
"\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33"+
"\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2"+
"\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2"+
"\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2"+
"\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K"+
"\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2"+
"\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2"+
"\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2w"+
"\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\3\u0083\3\2\2\2\5\u0085"+
"\3\2\2\2\7\u0087\3\2\2\2\t\u0089\3\2\2\2\13\u008b\3\2\2\2\r\u0091\3\2"+
"\2\2\17\u0093\3\2\2\2\21\u0095\3\2\2\2\23\u0098\3\2\2\2\25\u009d\3\2\2"+
"\2\27\u00a3\3\2\2\2\31\u00a6\3\2\2\2\33\u00aa\3\2\2\2\35\u00b1\3\2\2\2"+
"\37\u00b3\3\2\2\2!\u00b6\3\2\2\2#\u00b8\3\2\2\2%\u00ba\3\2\2\2\'\u00bc"+
"\3\2\2\2)\u00be\3\2\2\2+\u00c1\3\2\2\2-\u00c4\3\2\2\2/\u00c6\3\2\2\2\61"+
"\u00c8\3\2\2\2\63\u00cc\3\2\2\2\65\u00ce\3\2\2\2\67\u00d0\3\2\2\29\u00d3"+
"\3\2\2\2;\u00d6\3\2\2\2=\u00d8\3\2\2\2?\u00db\3\2\2\2A\u00de\3\2\2\2C"+
"\u00e1\3\2\2\2E\u00e3\3\2\2\2G\u00e6\3\2\2\2I\u00e9\3\2\2\2K\u00ec\3\2"+
"\2\2M\u00ef\3\2\2\2O\u00f1\3\2\2\2Q\u00f5\3\2\2\2S\u00f8\3\2\2\2U\u00fb"+
"\3\2\2\2W\u0117\3\2\2\2Y\u0119\3\2\2\2[\u0124\3\2\2\2]\u0135\3\2\2\2_"+
"\u0139\3\2\2\2a\u013e\3\2\2\2c\u0145\3\2\2\2e\u0156\3\2\2\2g\u0164\3\2"+
"\2\2i\u0175\3\2\2\2k\u0184\3\2\2\2m\u0187\3\2\2\2o\u0190\3\2\2\2q\u0197"+
"\3\2\2\2s\u0199\3\2\2\2u\u019b\3\2\2\2w\u019d\3\2\2\2y\u01a4\3\2\2\2{"+
"\u01a6\3\2\2\2}\u01a9\3\2\2\2\177\u01af\3\2\2\2\u0081\u01ba\3\2\2\2\u0083"+
"\u0084\7}\2\2\u0084\4\3\2\2\2\u0085\u0086\7\177\2\2\u0086\6\3\2\2\2\u0087"+
"\u0088\7*\2\2\u0088\b\3\2\2\2\u0089\u008a\7+\2\2\u008a\n\3\2\2\2\u008b"+
"\u008c\7e\2\2\u008c\u008d\7q\2\2\u008d\u008e\7p\2\2\u008e\u008f\7u\2\2"+
"\u008f\u0090\7v\2\2\u0090\f\3\2\2\2\u0091\u0092\7?\2\2\u0092\16\3\2\2"+
"\2\u0093\u0094\7=\2\2\u0094\20\3\2\2\2\u0095\u0096\7k\2\2\u0096\u0097"+
"\7h\2\2\u0097\22\3\2\2\2\u0098\u0099\7g\2\2\u0099\u009a\7n\2\2\u009a\u009b"+
"\7u\2\2\u009b\u009c\7g\2\2\u009c\24\3\2\2\2\u009d\u009e\7y\2\2\u009e\u009f"+
"\7j\2\2\u009f\u00a0\7k\2\2\u00a0\u00a1\7n\2\2\u00a1\u00a2\7g\2\2\u00a2"+
"\26\3\2\2\2\u00a3\u00a4\7f\2\2\u00a4\u00a5\7q\2\2\u00a5\30\3\2\2\2\u00a6"+
"\u00a7\7h\2\2\u00a7\u00a8\7q\2\2\u00a8\u00a9\7t\2\2\u00a9\32\3\2\2\2\u00aa"+
"\u00ab\7t\2\2\u00ab\u00ac\7g\2\2\u00ac\u00ad\7v\2\2\u00ad\u00ae\7w\2\2"+
"\u00ae\u00af\7t\2\2\u00af\u00b0\7p\2\2\u00b0\34\3\2\2\2\u00b1\u00b2\7"+
"<\2\2\u00b2\36\3\2\2\2\u00b3\u00b4\7\60\2\2\u00b4\u00b5\7\60\2\2\u00b5"+
" \3\2\2\2\u00b6\u00b7\7.\2\2\u00b7\"\3\2\2\2\u00b8\u00b9\7,\2\2\u00b9"+
"$\3\2\2\2\u00ba\u00bb\7]\2\2\u00bb&\3\2\2\2\u00bc\u00bd\7_\2\2\u00bd("+
"\3\2\2\2\u00be\u00bf\7/\2\2\u00bf\u00c0\7/\2\2\u00c0*\3\2\2\2\u00c1\u00c2"+
"\7-\2\2\u00c2\u00c3\7-\2\2\u00c3,\3\2\2\2\u00c4\u00c5\7-\2\2\u00c5.\3"+
"\2\2\2\u00c6\u00c7\7/\2\2\u00c7\60\3\2\2\2\u00c8\u00c9\7p\2\2\u00c9\u00ca"+
"\7q\2\2\u00ca\u00cb\7v\2\2\u00cb\62\3\2\2\2\u00cc\u00cd\7#\2\2\u00cd\64"+
"\3\2\2\2\u00ce\u00cf\7(\2\2\u00cf\66\3\2\2\2\u00d0\u00d1\7@\2\2\u00d1"+
"\u00d2\7@\2\2\u00d28\3\2\2\2\u00d3\u00d4\7>\2\2\u00d4\u00d5\7>\2\2\u00d5"+
":\3\2\2\2\u00d6\u00d7\7\61\2\2\u00d7<\3\2\2\2\u00d8\u00d9\7?\2\2\u00d9"+
"\u00da\7?\2\2\u00da>\3\2\2\2\u00db\u00dc\7#\2\2\u00dc\u00dd\7?\2\2\u00dd"+
"@\3\2\2\2\u00de\u00df\7>\2\2\u00df\u00e0\7@\2\2\u00e0B\3\2\2\2\u00e1\u00e2"+
"\7>\2\2\u00e2D\3\2\2\2\u00e3\u00e4\7>\2\2\u00e4\u00e5\7?\2\2\u00e5F\3"+
"\2\2\2\u00e6\u00e7\7?\2\2\u00e7\u00e8\7>\2\2\u00e8H\3\2\2\2\u00e9\u00ea"+
"\7@\2\2\u00ea\u00eb\7?\2\2\u00ebJ\3\2\2\2\u00ec\u00ed\7?\2\2\u00ed\u00ee"+
"\7@\2\2\u00eeL\3\2\2\2\u00ef\u00f0\7@\2\2\u00f0N\3\2\2\2\u00f1\u00f2\7"+
"c\2\2\u00f2\u00f3\7p\2\2\u00f3\u00f4\7f\2\2\u00f4P\3\2\2\2\u00f5\u00f6"+
"\7(\2\2\u00f6\u00f7\7(\2\2\u00f7R\3\2\2\2\u00f8\u00f9\7q\2\2\u00f9\u00fa"+
"\7t\2\2\u00faT\3\2\2\2\u00fb\u00fc\7~\2\2\u00fc\u00fd\7~\2\2\u00fdV\3"+
"\2\2\2\u00fe\u00ff\7d\2\2\u00ff\u0100\7{\2\2\u0100\u0101\7v\2\2\u0101"+
"\u0118\7g\2\2\u0102\u0103\7y\2\2\u0103\u0104\7q\2\2\u0104\u0105\7t\2\2"+
"\u0105\u0118\7f\2\2\u0106\u0107\7u\2\2\u0107\u0108\7v\2\2\u0108\u0109"+
"\7t\2\2\u0109\u010a\7k\2\2\u010a\u010b\7p\2\2\u010b\u0118\7i\2\2\u010c"+
"\u010d\7d\2\2\u010d\u010e\7q\2\2\u010e\u010f\7q\2\2\u010f\u0110\7n\2\2"+
"\u0110\u0111\7g\2\2\u0111\u0112\7c\2\2\u0112\u0118\7p\2\2\u0113\u0114"+
"\7x\2\2\u0114\u0115\7q\2\2\u0115\u0116\7k\2\2\u0116\u0118\7f\2\2\u0117"+
"\u00fe\3\2\2\2\u0117\u0102\3\2\2\2\u0117\u0106\3\2\2\2\u0117\u010c\3\2"+
"\2\2\u0117\u0113\3\2\2\2\u0118X\3\2\2\2\u0119\u011f\7$\2\2\u011a\u011b"+
"\7^\2\2\u011b\u011e\7$\2\2\u011c\u011e\n\2\2\2\u011d\u011a\3\2\2\2\u011d"+
"\u011c\3\2\2\2\u011e\u0121\3\2\2\2\u011f\u011d\3\2\2\2\u011f\u0120\3\2"+
"\2\2\u0120\u0122\3\2\2\2\u0121\u011f\3\2\2\2\u0122\u0123\7$\2\2\u0123"+
"Z\3\2\2\2\u0124\u0128\7)\2\2\u0125\u0126\7^\2\2\u0126\u0129\7)\2\2\u0127"+
"\u0129\n\3\2\2\u0128\u0125\3\2\2\2\u0128\u0127\3\2\2\2\u0129\u012a\3\2"+
"\2\2\u012a\u012b\7)\2\2\u012b\\\3\2\2\2\u012c\u012d\7v\2\2\u012d\u012e"+
"\7t\2\2\u012e\u012f\7w\2\2\u012f\u0136\7g\2\2\u0130\u0131\7h\2\2\u0131"+
"\u0132\7c\2\2\u0132\u0133\7n\2\2\u0133\u0134\7u\2\2\u0134\u0136\7g\2\2"+
"\u0135\u012c\3\2\2\2\u0135\u0130\3\2\2\2\u0136^\3\2\2\2\u0137\u013a\5"+
"a\61\2\u0138\u013a\5i\65\2\u0139\u0137\3\2\2\2\u0139\u0138\3\2\2\2\u013a"+
"`\3\2\2\2\u013b\u013f\5c\62\2\u013c\u013f\5e\63\2\u013d\u013f\5g\64\2"+
"\u013e\u013b\3\2\2\2\u013e\u013c\3\2\2\2\u013e\u013d\3\2\2\2\u013fb\3"+
"\2\2\2\u0140\u0146\7\'\2\2\u0141\u0142\7\62\2\2\u0142\u0146\7d\2\2\u0143"+
"\u0144\7\62\2\2\u0144\u0146\7D\2\2\u0145\u0140\3\2\2\2\u0145\u0141\3\2"+
"\2\2\u0145\u0143\3\2\2\2\u0146\u014a\3\2\2\2\u0147\u0149\5q9\2\u0148\u0147"+
"\3\2\2\2\u0149\u014c\3\2\2\2\u014a\u0148\3\2\2\2\u014a\u014b\3\2\2\2\u014b"+
"\u014d\3\2\2\2\u014c\u014a\3\2\2\2\u014d\u014f\7\60\2\2\u014e\u0150\5"+
"q9\2\u014f\u014e\3\2\2\2\u0150\u0151\3\2\2\2\u0151\u014f\3\2\2\2\u0151"+
"\u0152\3\2\2\2\u0152d\3\2\2\2\u0153\u0155\5s:\2\u0154\u0153\3\2\2\2\u0155"+
"\u0158\3\2\2\2\u0156\u0154\3\2\2\2\u0156\u0157\3\2\2\2\u0157\u0159\3\2"+
"\2\2\u0158\u0156\3\2\2\2\u0159\u015b\7\60\2\2\u015a\u015c\5s:\2\u015b"+
"\u015a\3\2\2\2\u015c\u015d\3\2\2\2\u015d\u015b\3\2\2\2\u015d\u015e\3\2"+
"\2\2\u015ef\3\2\2\2\u015f\u0165\7&\2\2\u0160\u0161\7\62\2\2\u0161\u0165"+
"\7z\2\2\u0162\u0163\7\62\2\2\u0163\u0165\7Z\2\2\u0164\u015f\3\2\2\2\u0164"+
"\u0160\3\2\2\2\u0164\u0162\3\2\2\2\u0165\u0169\3\2\2\2\u0166\u0168\5u"+
";\2\u0167\u0166\3\2\2\2\u0168\u016b\3\2\2\2\u0169\u0167\3\2\2\2\u0169"+
"\u016a\3\2\2\2\u016a\u016c\3\2\2\2\u016b\u0169\3\2\2\2\u016c\u016e\7\60"+
"\2\2\u016d\u016f\5u;\2\u016e\u016d\3\2\2\2\u016f\u0170\3\2\2\2\u0170\u016e"+
"\3\2\2\2\u0170\u0171\3\2\2\2\u0171h\3\2\2\2\u0172\u0176\5m\67\2\u0173"+
"\u0176\5o8\2\u0174\u0176\5k\66\2\u0175\u0172\3\2\2\2\u0175\u0173\3\2\2"+
"\2\u0175\u0174\3\2\2\2\u0176j\3\2\2\2\u0177\u0178\7\62\2\2\u0178\u017a"+
"\t\4\2\2\u0179\u017b\5q9\2\u017a\u0179\3\2\2\2\u017b\u017c\3\2\2\2\u017c"+
"\u017a\3\2\2\2\u017c\u017d\3\2\2\2\u017d\u0185\3\2\2\2\u017e\u0180\7\'"+
"\2\2\u017f\u0181\5q9\2\u0180\u017f\3\2\2\2\u0181\u0182\3\2\2\2\u0182\u0180"+
"\3\2\2\2\u0182\u0183\3\2\2\2\u0183\u0185\3\2\2\2\u0184\u0177\3\2\2\2\u0184"+
"\u017e\3\2\2\2\u0185l\3\2\2\2\u0186\u0188\5s:\2\u0187\u0186\3\2\2\2\u0188"+
"\u0189\3\2\2\2\u0189\u0187\3\2\2\2\u0189\u018a\3\2\2\2\u018an\3\2\2\2"+
"\u018b\u0191\7&\2\2\u018c\u018d\7\62\2\2\u018d\u0191\7z\2\2\u018e\u018f"+
"\7\62\2\2\u018f\u0191\7Z\2\2\u0190\u018b\3\2\2\2\u0190\u018c\3\2\2\2\u0190"+
"\u018e\3\2\2\2\u0191\u0193\3\2\2\2\u0192\u0194\5u;\2\u0193\u0192\3\2\2"+
"\2\u0194\u0195\3\2\2\2\u0195\u0193\3\2\2\2\u0195\u0196\3\2\2\2\u0196p"+
"\3\2\2\2\u0197\u0198\t\5\2\2\u0198r\3\2\2\2\u0199\u019a\t\6\2\2\u019a"+
"t\3\2\2\2\u019b\u019c\t\7\2\2\u019cv\3\2\2\2\u019d\u01a1\5y=\2\u019e\u01a0"+
"\5{>\2\u019f\u019e\3\2\2\2\u01a0\u01a3\3\2\2\2\u01a1\u019f\3\2\2\2\u01a1"+
"\u01a2\3\2\2\2\u01a2x\3\2\2\2\u01a3\u01a1\3\2\2\2\u01a4\u01a5\t\b\2\2"+
"\u01a5z\3\2\2\2\u01a6\u01a7\t\t\2\2\u01a7|\3\2\2\2\u01a8\u01aa\t\n\2\2"+
"\u01a9\u01a8\3\2\2\2\u01aa\u01ab\3\2\2\2\u01ab\u01a9\3\2\2\2\u01ab\u01ac"+
"\3\2\2\2\u01ac\u01ad\3\2\2\2\u01ad\u01ae\b?\2\2\u01ae~\3\2\2\2\u01af\u01b0"+
"\7\61\2\2\u01b0\u01b1\7\61\2\2\u01b1\u01b5\3\2\2\2\u01b2\u01b4\n\13\2"+
"\2\u01b3\u01b2\3\2\2\2\u01b4\u01b7\3\2\2\2\u01b5\u01b3\3\2\2\2\u01b5\u01b6"+
"\3\2\2\2\u01b6\u01b8\3\2\2\2\u01b7\u01b5\3\2\2\2\u01b8\u01b9\b@\2\2\u01b9"+
"\u0080\3\2\2\2\u01ba\u01bb\7\61\2\2\u01bb\u01bc\7,\2\2\u01bc\u01c0\3\2"+
"\2\2\u01bd\u01bf\13\2\2\2\u01be\u01bd\3\2\2\2\u01bf\u01c2\3\2\2\2\u01c0"+
"\u01c1\3\2\2\2\u01c0\u01be\3\2\2\2\u01c1\u01c3\3\2\2\2\u01c2\u01c0\3\2"+
"\2\2\u01c3\u01c4\7,\2\2\u01c4\u01c5\7\61\2\2\u01c5\u01c6\3\2\2\2\u01c6"+
"\u01c7\bA\2\2\u01c7\u0082\3\2\2\2\35\2\u0117\u011d\u011f\u0128\u0135\u0139"+
"\u013e\u0145\u014a\u0151\u0156\u015d\u0164\u0169\u0170\u0175\u017c\u0182"+
"\u0184\u0189\u0190\u0195\u01a1\u01ab\u01b5\u01c0\3\b\2\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -42,20 +42,21 @@ T__40=41
T__41=42
SIMPLETYPE=43
STRING=44
BOOLEAN=45
NUMBER=46
NUMFLOAT=47
BINFLOAT=48
DECFLOAT=49
HEXFLOAT=50
NUMINT=51
BININTEGER=52
DECINTEGER=53
HEXINTEGER=54
NAME=55
WS=56
COMMENT_LINE=57
COMMENT_BLOCK=58
CHAR=45
BOOLEAN=46
NUMBER=47
NUMFLOAT=48
BINFLOAT=49
DECFLOAT=50
HEXFLOAT=51
NUMINT=52
BININTEGER=53
DECINTEGER=54
HEXINTEGER=55
NAME=56
WS=57
COMMENT_LINE=58
COMMENT_BLOCK=59
'{'=1
'}'=2
'('=3

View File

@ -311,30 +311,6 @@ public interface KickCListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitLvaluePar(KickCParser.LvalueParContext ctx);
/**
* Enter a parse tree produced by the {@code exprCast}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void enterExprCast(KickCParser.ExprCastContext ctx);
/**
* Exit a parse tree produced by the {@code exprCast}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void exitExprCast(KickCParser.ExprCastContext ctx);
/**
* Enter a parse tree produced by the {@code exprCall}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void enterExprCall(KickCParser.ExprCallContext ctx);
/**
* Exit a parse tree produced by the {@code exprCall}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void exitExprCall(KickCParser.ExprCallContext ctx);
/**
* Enter a parse tree produced by the {@code exprPreMod}
* labeled alternative in {@link KickCParser#expr}.
@ -359,6 +335,78 @@ public interface KickCListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitExprBinary(KickCParser.ExprBinaryContext ctx);
/**
* Enter a parse tree produced by the {@code exprPostMod}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void enterExprPostMod(KickCParser.ExprPostModContext ctx);
/**
* Exit a parse tree produced by the {@code exprPostMod}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void exitExprPostMod(KickCParser.ExprPostModContext ctx);
/**
* Enter a parse tree produced by the {@code exprUnary}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void enterExprUnary(KickCParser.ExprUnaryContext ctx);
/**
* Exit a parse tree produced by the {@code exprUnary}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void exitExprUnary(KickCParser.ExprUnaryContext ctx);
/**
* Enter a parse tree produced by the {@code exprNumber}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void enterExprNumber(KickCParser.ExprNumberContext ctx);
/**
* Exit a parse tree produced by the {@code exprNumber}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void exitExprNumber(KickCParser.ExprNumberContext ctx);
/**
* Enter a parse tree produced by the {@code exprChar}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void enterExprChar(KickCParser.ExprCharContext ctx);
/**
* Exit a parse tree produced by the {@code exprChar}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void exitExprChar(KickCParser.ExprCharContext ctx);
/**
* Enter a parse tree produced by the {@code exprCast}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void enterExprCast(KickCParser.ExprCastContext ctx);
/**
* Exit a parse tree produced by the {@code exprCast}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void exitExprCast(KickCParser.ExprCastContext ctx);
/**
* Enter a parse tree produced by the {@code exprCall}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void enterExprCall(KickCParser.ExprCallContext ctx);
/**
* Exit a parse tree produced by the {@code exprCall}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void exitExprCall(KickCParser.ExprCallContext ctx);
/**
* Enter a parse tree produced by the {@code exprPar}
* labeled alternative in {@link KickCParser#expr}.
@ -395,18 +443,6 @@ public interface KickCListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitExprBool(KickCParser.ExprBoolContext ctx);
/**
* Enter a parse tree produced by the {@code exprPostMod}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void enterExprPostMod(KickCParser.ExprPostModContext ctx);
/**
* Exit a parse tree produced by the {@code exprPostMod}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void exitExprPostMod(KickCParser.ExprPostModContext ctx);
/**
* Enter a parse tree produced by the {@code exprId}
* labeled alternative in {@link KickCParser#expr}.
@ -419,30 +455,6 @@ public interface KickCListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitExprId(KickCParser.ExprIdContext ctx);
/**
* Enter a parse tree produced by the {@code exprUnary}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void enterExprUnary(KickCParser.ExprUnaryContext ctx);
/**
* Exit a parse tree produced by the {@code exprUnary}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void exitExprUnary(KickCParser.ExprUnaryContext ctx);
/**
* Enter a parse tree produced by the {@code exprNumber}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void enterExprNumber(KickCParser.ExprNumberContext ctx);
/**
* Exit a parse tree produced by the {@code exprNumber}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
*/
void exitExprNumber(KickCParser.ExprNumberContext ctx);
/**
* Enter a parse tree produced by the {@code exprArray}
* labeled alternative in {@link KickCParser#expr}.

View File

@ -22,10 +22,10 @@ public class KickCParser extends Parser {
T__17=18, T__18=19, T__19=20, T__20=21, T__21=22, T__22=23, T__23=24,
T__24=25, T__25=26, T__26=27, T__27=28, T__28=29, T__29=30, T__30=31,
T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38,
T__38=39, T__39=40, T__40=41, T__41=42, SIMPLETYPE=43, STRING=44, BOOLEAN=45,
NUMBER=46, NUMFLOAT=47, BINFLOAT=48, DECFLOAT=49, HEXFLOAT=50, NUMINT=51,
BININTEGER=52, DECINTEGER=53, HEXINTEGER=54, NAME=55, WS=56, COMMENT_LINE=57,
COMMENT_BLOCK=58;
T__38=39, T__39=40, T__40=41, T__41=42, SIMPLETYPE=43, STRING=44, CHAR=45,
BOOLEAN=46, NUMBER=47, NUMFLOAT=48, BINFLOAT=49, DECFLOAT=50, HEXFLOAT=51,
NUMINT=52, BININTEGER=53, DECINTEGER=54, HEXINTEGER=55, NAME=56, WS=57,
COMMENT_LINE=58, COMMENT_BLOCK=59;
public static final int
RULE_file = 0, RULE_stmtSeq = 1, RULE_stmt = 2, RULE_forDeclaration = 3,
RULE_forIteration = 4, RULE_parameterListDecl = 5, RULE_parameterDecl = 6,
@ -47,9 +47,10 @@ public class KickCParser extends Parser {
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, "SIMPLETYPE", "STRING", "BOOLEAN",
"NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER",
"DECINTEGER", "HEXINTEGER", "NAME", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
null, null, null, null, null, null, null, "SIMPLETYPE", "STRING", "CHAR",
"BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT",
"BININTEGER", "DECINTEGER", "HEXINTEGER", "NAME", "WS", "COMMENT_LINE",
"COMMENT_BLOCK"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -193,7 +194,7 @@ public class KickCParser extends Parser {
setState(30);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__2) | (1L << T__4) | (1L << T__7) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__16) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << SIMPLETYPE) | (1L << STRING) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0) );
} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__2) | (1L << T__4) | (1L << T__7) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__16) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << SIMPLETYPE) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0) );
}
}
catch (RecognitionException re) {
@ -458,7 +459,7 @@ public class KickCParser extends Parser {
setState(34);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__2) | (1L << T__4) | (1L << T__7) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__16) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << SIMPLETYPE) | (1L << STRING) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__2) | (1L << T__4) | (1L << T__7) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__16) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << SIMPLETYPE) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) {
{
setState(33);
stmtSeq();
@ -496,7 +497,7 @@ public class KickCParser extends Parser {
setState(46);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__2) | (1L << T__4) | (1L << T__7) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__16) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << SIMPLETYPE) | (1L << STRING) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__2) | (1L << T__4) | (1L << T__7) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__16) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << SIMPLETYPE) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) {
{
setState(45);
stmtSeq();
@ -662,7 +663,7 @@ public class KickCParser extends Parser {
setState(102);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__16) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << STRING) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__16) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) {
{
setState(101);
expr(0);
@ -843,7 +844,7 @@ public class KickCParser extends Parser {
setState(119);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__16) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << STRING) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__16) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) {
{
setState(118);
expr(0);
@ -1121,7 +1122,7 @@ public class KickCParser extends Parser {
setState(147);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__16) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << STRING) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__16) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) {
{
setState(146);
expr(0);
@ -1223,6 +1224,7 @@ public class KickCParser extends Parser {
case T__24:
case T__25:
case STRING:
case CHAR:
case BOOLEAN:
case NUMBER:
case NAME:
@ -1471,6 +1473,119 @@ public class KickCParser extends Parser {
super.copyFrom(ctx);
}
}
public static class ExprPreModContext extends ExprContext {
public ExprContext expr() {
return getRuleContext(ExprContext.class,0);
}
public ExprPreModContext(ExprContext ctx) { copyFrom(ctx); }
@Override
public void enterRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).enterExprPreMod(this);
}
@Override
public void exitRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).exitExprPreMod(this);
}
@Override
public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
if ( visitor instanceof KickCVisitor ) return ((KickCVisitor<? extends T>)visitor).visitExprPreMod(this);
else return visitor.visitChildren(this);
}
}
public static class ExprBinaryContext extends ExprContext {
public List<ExprContext> expr() {
return getRuleContexts(ExprContext.class);
}
public ExprContext expr(int i) {
return getRuleContext(ExprContext.class,i);
}
public ExprBinaryContext(ExprContext ctx) { copyFrom(ctx); }
@Override
public void enterRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).enterExprBinary(this);
}
@Override
public void exitRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).exitExprBinary(this);
}
@Override
public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
if ( visitor instanceof KickCVisitor ) return ((KickCVisitor<? extends T>)visitor).visitExprBinary(this);
else return visitor.visitChildren(this);
}
}
public static class ExprPostModContext extends ExprContext {
public ExprContext expr() {
return getRuleContext(ExprContext.class,0);
}
public ExprPostModContext(ExprContext ctx) { copyFrom(ctx); }
@Override
public void enterRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).enterExprPostMod(this);
}
@Override
public void exitRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).exitExprPostMod(this);
}
@Override
public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
if ( visitor instanceof KickCVisitor ) return ((KickCVisitor<? extends T>)visitor).visitExprPostMod(this);
else return visitor.visitChildren(this);
}
}
public static class ExprUnaryContext extends ExprContext {
public ExprContext expr() {
return getRuleContext(ExprContext.class,0);
}
public ExprUnaryContext(ExprContext ctx) { copyFrom(ctx); }
@Override
public void enterRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).enterExprUnary(this);
}
@Override
public void exitRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).exitExprUnary(this);
}
@Override
public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
if ( visitor instanceof KickCVisitor ) return ((KickCVisitor<? extends T>)visitor).visitExprUnary(this);
else return visitor.visitChildren(this);
}
}
public static class ExprNumberContext extends ExprContext {
public TerminalNode NUMBER() { return getToken(KickCParser.NUMBER, 0); }
public ExprNumberContext(ExprContext ctx) { copyFrom(ctx); }
@Override
public void enterRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).enterExprNumber(this);
}
@Override
public void exitRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).exitExprNumber(this);
}
@Override
public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
if ( visitor instanceof KickCVisitor ) return ((KickCVisitor<? extends T>)visitor).visitExprNumber(this);
else return visitor.visitChildren(this);
}
}
public static class ExprCharContext extends ExprContext {
public TerminalNode CHAR() { return getToken(KickCParser.CHAR, 0); }
public ExprCharContext(ExprContext ctx) { copyFrom(ctx); }
@Override
public void enterRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).enterExprChar(this);
}
@Override
public void exitRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).exitExprChar(this);
}
@Override
public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
if ( visitor instanceof KickCVisitor ) return ((KickCVisitor<? extends T>)visitor).visitExprChar(this);
else return visitor.visitChildren(this);
}
}
public static class ExprCastContext extends ExprContext {
public TypeDeclContext typeDecl() {
return getRuleContext(TypeDeclContext.class,0);
@ -1513,47 +1628,6 @@ public class KickCParser extends Parser {
else return visitor.visitChildren(this);
}
}
public static class ExprPreModContext extends ExprContext {
public ExprContext expr() {
return getRuleContext(ExprContext.class,0);
}
public ExprPreModContext(ExprContext ctx) { copyFrom(ctx); }
@Override
public void enterRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).enterExprPreMod(this);
}
@Override
public void exitRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).exitExprPreMod(this);
}
@Override
public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
if ( visitor instanceof KickCVisitor ) return ((KickCVisitor<? extends T>)visitor).visitExprPreMod(this);
else return visitor.visitChildren(this);
}
}
public static class ExprBinaryContext extends ExprContext {
public List<ExprContext> expr() {
return getRuleContexts(ExprContext.class);
}
public ExprContext expr(int i) {
return getRuleContext(ExprContext.class,i);
}
public ExprBinaryContext(ExprContext ctx) { copyFrom(ctx); }
@Override
public void enterRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).enterExprBinary(this);
}
@Override
public void exitRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).exitExprBinary(this);
}
@Override
public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
if ( visitor instanceof KickCVisitor ) return ((KickCVisitor<? extends T>)visitor).visitExprBinary(this);
else return visitor.visitChildren(this);
}
}
public static class ExprParContext extends ExprContext {
public ExprContext expr() {
return getRuleContext(ExprContext.class,0);
@ -1607,25 +1681,6 @@ public class KickCParser extends Parser {
else return visitor.visitChildren(this);
}
}
public static class ExprPostModContext extends ExprContext {
public ExprContext expr() {
return getRuleContext(ExprContext.class,0);
}
public ExprPostModContext(ExprContext ctx) { copyFrom(ctx); }
@Override
public void enterRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).enterExprPostMod(this);
}
@Override
public void exitRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).exitExprPostMod(this);
}
@Override
public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
if ( visitor instanceof KickCVisitor ) return ((KickCVisitor<? extends T>)visitor).visitExprPostMod(this);
else return visitor.visitChildren(this);
}
}
public static class ExprIdContext extends ExprContext {
public TerminalNode NAME() { return getToken(KickCParser.NAME, 0); }
public ExprIdContext(ExprContext ctx) { copyFrom(ctx); }
@ -1643,42 +1698,6 @@ public class KickCParser extends Parser {
else return visitor.visitChildren(this);
}
}
public static class ExprUnaryContext extends ExprContext {
public ExprContext expr() {
return getRuleContext(ExprContext.class,0);
}
public ExprUnaryContext(ExprContext ctx) { copyFrom(ctx); }
@Override
public void enterRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).enterExprUnary(this);
}
@Override
public void exitRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).exitExprUnary(this);
}
@Override
public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
if ( visitor instanceof KickCVisitor ) return ((KickCVisitor<? extends T>)visitor).visitExprUnary(this);
else return visitor.visitChildren(this);
}
}
public static class ExprNumberContext extends ExprContext {
public TerminalNode NUMBER() { return getToken(KickCParser.NUMBER, 0); }
public ExprNumberContext(ExprContext ctx) { copyFrom(ctx); }
@Override
public void enterRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).enterExprNumber(this);
}
@Override
public void exitRule(ParseTreeListener listener) {
if ( listener instanceof KickCListener ) ((KickCListener)listener).exitExprNumber(this);
}
@Override
public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
if ( visitor instanceof KickCVisitor ) return ((KickCVisitor<? extends T>)visitor).visitExprNumber(this);
else return visitor.visitChildren(this);
}
}
public static class ExprArrayContext extends ExprContext {
public List<ExprContext> expr() {
return getRuleContexts(ExprContext.class);
@ -1718,7 +1737,7 @@ public class KickCParser extends Parser {
int _alt;
enterOuterAlt(_localctx, 1);
{
setState(213);
setState(214);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) {
case 1:
@ -1747,7 +1766,7 @@ public class KickCParser extends Parser {
setState(197);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__16) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << STRING) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__16) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) {
{
setState(196);
parameterList();
@ -1770,7 +1789,7 @@ public class KickCParser extends Parser {
setState(202);
match(T__3);
setState(203);
expr(15);
expr(16);
}
break;
case 4:
@ -1789,7 +1808,7 @@ public class KickCParser extends Parser {
consume();
}
setState(206);
expr(13);
expr(14);
}
break;
case 5:
@ -1808,7 +1827,7 @@ public class KickCParser extends Parser {
consume();
}
setState(208);
expr(11);
expr(12);
}
break;
case 6:
@ -1840,16 +1859,25 @@ public class KickCParser extends Parser {
break;
case 9:
{
_localctx = new ExprBoolContext(_localctx);
_localctx = new ExprCharContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(212);
match(CHAR);
}
break;
case 10:
{
_localctx = new ExprBoolContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(213);
match(BOOLEAN);
}
break;
}
_ctx.stop = _input.LT(-1);
setState(242);
setState(243);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,25,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
@ -1857,16 +1885,16 @@ public class KickCParser extends Parser {
if ( _parseListeners!=null ) triggerExitRuleEvent();
_prevctx = _localctx;
{
setState(240);
setState(241);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) {
case 1:
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
setState(215);
if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)");
setState(216);
if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)");
setState(217);
_la = _input.LA(1);
if ( !(_la==T__26 || _la==T__27) ) {
_errHandler.recoverInline(this);
@ -1876,17 +1904,17 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
setState(217);
expr(11);
setState(218);
expr(12);
}
break;
case 2:
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
setState(218);
if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
setState(219);
if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)");
setState(220);
_la = _input.LA(1);
if ( !(_la==T__16 || _la==T__28) ) {
_errHandler.recoverInline(this);
@ -1896,17 +1924,17 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
setState(220);
expr(10);
setState(221);
expr(11);
}
break;
case 3:
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
setState(221);
if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)");
setState(222);
if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
setState(223);
_la = _input.LA(1);
if ( !(_la==T__21 || _la==T__22) ) {
_errHandler.recoverInline(this);
@ -1916,17 +1944,17 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
setState(223);
expr(9);
setState(224);
expr(10);
}
break;
case 4:
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
setState(224);
if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
setState(225);
if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)");
setState(226);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__29) | (1L << T__30) | (1L << T__31) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37))) != 0)) ) {
_errHandler.recoverInline(this);
@ -1936,17 +1964,17 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
setState(226);
expr(8);
setState(227);
expr(9);
}
break;
case 5:
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
setState(227);
if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
setState(228);
if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
setState(229);
_la = _input.LA(1);
if ( !(_la==T__38 || _la==T__39) ) {
_errHandler.recoverInline(this);
@ -1956,17 +1984,17 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
setState(229);
expr(7);
setState(230);
expr(8);
}
break;
case 6:
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
setState(230);
if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)");
setState(231);
if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
setState(232);
_la = _input.LA(1);
if ( !(_la==T__40 || _la==T__41) ) {
_errHandler.recoverInline(this);
@ -1976,21 +2004,21 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
setState(232);
expr(6);
setState(233);
expr(7);
}
break;
case 7:
{
_localctx = new ExprArrayContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
setState(233);
if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)");
setState(234);
match(T__17);
if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)");
setState(235);
expr(0);
match(T__17);
setState(236);
expr(0);
setState(237);
match(T__18);
}
break;
@ -1998,9 +2026,9 @@ public class KickCParser extends Parser {
{
_localctx = new ExprPostModContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
setState(238);
if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)");
setState(239);
if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)");
setState(240);
_la = _input.LA(1);
if ( !(_la==T__19 || _la==T__20) ) {
_errHandler.recoverInline(this);
@ -2015,7 +2043,7 @@ public class KickCParser extends Parser {
}
}
}
setState(244);
setState(245);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,25,_ctx);
}
@ -2065,21 +2093,21 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
setState(245);
setState(246);
expr(0);
setState(250);
setState(251);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__15) {
{
{
setState(246);
match(T__15);
setState(247);
match(T__15);
setState(248);
expr(0);
}
}
setState(252);
setState(253);
_errHandler.sync(this);
_la = _input.LA(1);
}
@ -2126,27 +2154,27 @@ public class KickCParser extends Parser {
private boolean expr_sempred(ExprContext _localctx, int predIndex) {
switch (predIndex) {
case 3:
return precpred(_ctx, 10);
return precpred(_ctx, 11);
case 4:
return precpred(_ctx, 9);
return precpred(_ctx, 10);
case 5:
return precpred(_ctx, 8);
return precpred(_ctx, 9);
case 6:
return precpred(_ctx, 7);
return precpred(_ctx, 8);
case 7:
return precpred(_ctx, 6);
return precpred(_ctx, 7);
case 8:
return precpred(_ctx, 5);
return precpred(_ctx, 6);
case 9:
return precpred(_ctx, 14);
return precpred(_ctx, 15);
case 10:
return precpred(_ctx, 12);
return precpred(_ctx, 13);
}
return true;
}
public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3<\u0100\4\2\t\2\4"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3=\u0101\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\3\2\3\2\3\2\3\3\6\3\37\n\3\r\3\16\3 \3\4\3\4\5\4%"+
"\n\4\3\4\3\4\3\4\3\4\3\4\5\4,\n\4\3\4\3\4\3\4\5\4\61\n\4\3\4\3\4\3\4\5"+
@ -2160,21 +2188,21 @@ public class KickCParser extends Parser {
"\n\u00a3\n\n\f\n\16\n\u00a6\13\n\3\n\3\n\5\n\u00aa\n\n\3\13\3\13\3\13"+
"\3\13\3\13\3\13\3\13\3\13\5\13\u00b4\n\13\3\13\3\13\3\13\3\13\3\13\7\13"+
"\u00bb\n\13\f\13\16\13\u00be\13\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\5\f"+
"\u00c8\n\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\5\f"+
"\u00d8\n\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f"+
"\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\7\f\u00f3\n\f\f\f\16\f\u00f6"+
"\13\f\3\r\3\r\3\r\7\r\u00fb\n\r\f\r\16\r\u00fe\13\r\3\r\2\5\20\24\26\16"+
"\u00c8\n\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f"+
"\5\f\u00d9\n\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f"+
"\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\7\f\u00f4\n\f\f\f\16\f\u00f7"+
"\13\f\3\r\3\r\3\r\7\r\u00fc\n\r\f\r\16\r\u00ff\13\r\3\r\2\5\20\24\26\16"+
"\2\4\6\b\n\f\16\20\22\24\26\30\2\n\3\2\26\27\4\2\23\23\30\34\3\2\35\36"+
"\4\2\23\23\37\37\3\2\30\31\3\2 (\3\2)*\3\2+,\2\u0124\2\32\3\2\2\2\4\36"+
"\4\2\23\23\37\37\3\2\30\31\3\2 (\3\2)*\3\2+,\2\u0126\2\32\3\2\2\2\4\36"+
"\3\2\2\2\6k\3\2\2\2\bn\3\2\2\2\n\u0080\3\2\2\2\f\u0082\3\2\2\2\16\u008a"+
"\3\2\2\2\20\u008d\3\2\2\2\22\u00a9\3\2\2\2\24\u00b3\3\2\2\2\26\u00d7\3"+
"\2\2\2\30\u00f7\3\2\2\2\32\33\5\4\3\2\33\34\7\2\2\3\34\3\3\2\2\2\35\37"+
"\3\2\2\2\20\u008d\3\2\2\2\22\u00a9\3\2\2\2\24\u00b3\3\2\2\2\26\u00d8\3"+
"\2\2\2\30\u00f8\3\2\2\2\32\33\5\4\3\2\33\34\7\2\2\3\34\3\3\2\2\2\35\37"+
"\5\6\4\2\36\35\3\2\2\2\37 \3\2\2\2 \36\3\2\2\2 !\3\2\2\2!\5\3\2\2\2\""+
"$\7\3\2\2#%\5\4\3\2$#\3\2\2\2$%\3\2\2\2%&\3\2\2\2&l\7\4\2\2\'(\5\20\t"+
"\2()\79\2\2)+\7\5\2\2*,\5\f\7\2+*\3\2\2\2+,\3\2\2\2,-\3\2\2\2-.\7\6\2"+
"\2()\7:\2\2)+\7\5\2\2*,\5\f\7\2+*\3\2\2\2+,\3\2\2\2,-\3\2\2\2-.\7\6\2"+
"\2.\60\7\3\2\2/\61\5\4\3\2\60/\3\2\2\2\60\61\3\2\2\2\61\62\3\2\2\2\62"+
"\63\7\4\2\2\63l\3\2\2\2\64\66\7\7\2\2\65\64\3\2\2\2\65\66\3\2\2\2\66\67"+
"\3\2\2\2\678\5\20\t\28;\79\2\29:\7\b\2\2:<\5\22\n\2;9\3\2\2\2;<\3\2\2"+
"\3\2\2\2\678\5\20\t\28;\7:\2\29:\7\b\2\2:<\5\22\n\2;9\3\2\2\2;<\3\2\2"+
"\2<=\3\2\2\2=>\7\t\2\2>l\3\2\2\2?@\5\24\13\2@A\7\b\2\2AB\5\26\f\2BC\7"+
"\t\2\2Cl\3\2\2\2DE\5\26\f\2EF\7\t\2\2Fl\3\2\2\2GH\7\n\2\2HI\7\5\2\2IJ"+
"\5\26\f\2JK\7\6\2\2KN\5\6\4\2LM\7\13\2\2MO\5\6\4\2NL\3\2\2\2NO\3\2\2\2"+
@ -2184,14 +2212,14 @@ public class KickCParser extends Parser {
"\5\n\6\2cd\7\6\2\2de\5\6\4\2el\3\2\2\2fh\7\17\2\2gi\5\26\f\2hg\3\2\2\2"+
"hi\3\2\2\2ij\3\2\2\2jl\7\t\2\2k\"\3\2\2\2k\'\3\2\2\2k\65\3\2\2\2k?\3\2"+
"\2\2kD\3\2\2\2kG\3\2\2\2kP\3\2\2\2kV\3\2\2\2k]\3\2\2\2kf\3\2\2\2l\7\3"+
"\2\2\2mo\5\20\t\2nm\3\2\2\2no\3\2\2\2op\3\2\2\2ps\79\2\2qr\7\b\2\2rt\5"+
"\2\2\2mo\5\20\t\2nm\3\2\2\2no\3\2\2\2op\3\2\2\2ps\7:\2\2qr\7\b\2\2rt\5"+
"\22\n\2sq\3\2\2\2st\3\2\2\2t\t\3\2\2\2uv\7\t\2\2vw\5\26\f\2wy\7\t\2\2"+
"xz\5\26\f\2yx\3\2\2\2yz\3\2\2\2z\u0081\3\2\2\2{|\7\20\2\2|}\5\26\f\2}"+
"~\7\21\2\2~\177\5\26\f\2\177\u0081\3\2\2\2\u0080u\3\2\2\2\u0080{\3\2\2"+
"\2\u0081\13\3\2\2\2\u0082\u0087\5\16\b\2\u0083\u0084\7\22\2\2\u0084\u0086"+
"\5\16\b\2\u0085\u0083\3\2\2\2\u0086\u0089\3\2\2\2\u0087\u0085\3\2\2\2"+
"\u0087\u0088\3\2\2\2\u0088\r\3\2\2\2\u0089\u0087\3\2\2\2\u008a\u008b\5"+
"\20\t\2\u008b\u008c\79\2\2\u008c\17\3\2\2\2\u008d\u008e\b\t\1\2\u008e"+
"\20\t\2\u008b\u008c\7:\2\2\u008c\17\3\2\2\2\u008d\u008e\b\t\1\2\u008e"+
"\u008f\7-\2\2\u008f\u009a\3\2\2\2\u0090\u0091\f\4\2\2\u0091\u0099\7\23"+
"\2\2\u0092\u0093\f\3\2\2\u0093\u0095\7\24\2\2\u0094\u0096\5\26\f\2\u0095"+
"\u0094\3\2\2\2\u0095\u0096\3\2\2\2\u0096\u0097\3\2\2\2\u0097\u0099\7\25"+
@ -2203,36 +2231,37 @@ public class KickCParser extends Parser {
"\u00a4\3\2\2\2\u00a7\u00a8\7\4\2\2\u00a8\u00aa\3\2\2\2\u00a9\u009d\3\2"+
"\2\2\u00a9\u009e\3\2\2\2\u00aa\23\3\2\2\2\u00ab\u00ac\b\13\1\2\u00ac\u00ad"+
"\7\5\2\2\u00ad\u00ae\5\24\13\2\u00ae\u00af\7\6\2\2\u00af\u00b4\3\2\2\2"+
"\u00b0\u00b4\79\2\2\u00b1\u00b2\7\23\2\2\u00b2\u00b4\5\24\13\4\u00b3\u00ab"+
"\u00b0\u00b4\7:\2\2\u00b1\u00b2\7\23\2\2\u00b2\u00b4\5\24\13\4\u00b3\u00ab"+
"\3\2\2\2\u00b3\u00b0\3\2\2\2\u00b3\u00b1\3\2\2\2\u00b4\u00bc\3\2\2\2\u00b5"+
"\u00b6\f\3\2\2\u00b6\u00b7\7\24\2\2\u00b7\u00b8\5\26\f\2\u00b8\u00b9\7"+
"\25\2\2\u00b9\u00bb\3\2\2\2\u00ba\u00b5\3\2\2\2\u00bb\u00be\3\2\2\2\u00bc"+
"\u00ba\3\2\2\2\u00bc\u00bd\3\2\2\2\u00bd\25\3\2\2\2\u00be\u00bc\3\2\2"+
"\2\u00bf\u00c0\b\f\1\2\u00c0\u00c1\7\5\2\2\u00c1\u00c2\5\26\f\2\u00c2"+
"\u00c3\7\6\2\2\u00c3\u00d8\3\2\2\2\u00c4\u00c5\79\2\2\u00c5\u00c7\7\5"+
"\u00c3\7\6\2\2\u00c3\u00d9\3\2\2\2\u00c4\u00c5\7:\2\2\u00c5\u00c7\7\5"+
"\2\2\u00c6\u00c8\5\30\r\2\u00c7\u00c6\3\2\2\2\u00c7\u00c8\3\2\2\2\u00c8"+
"\u00c9\3\2\2\2\u00c9\u00d8\7\6\2\2\u00ca\u00cb\7\5\2\2\u00cb\u00cc\5\20"+
"\t\2\u00cc\u00cd\7\6\2\2\u00cd\u00ce\5\26\f\21\u00ce\u00d8\3\2\2\2\u00cf"+
"\u00d0\t\2\2\2\u00d0\u00d8\5\26\f\17\u00d1\u00d2\t\3\2\2\u00d2\u00d8\5"+
"\26\f\r\u00d3\u00d8\79\2\2\u00d4\u00d8\7\60\2\2\u00d5\u00d8\7.\2\2\u00d6"+
"\u00d8\7/\2\2\u00d7\u00bf\3\2\2\2\u00d7\u00c4\3\2\2\2\u00d7\u00ca\3\2"+
"\2\2\u00d7\u00cf\3\2\2\2\u00d7\u00d1\3\2\2\2\u00d7\u00d3\3\2\2\2\u00d7"+
"\u00d4\3\2\2\2\u00d7\u00d5\3\2\2\2\u00d7\u00d6\3\2\2\2\u00d8\u00f4\3\2"+
"\2\2\u00d9\u00da\f\f\2\2\u00da\u00db\t\4\2\2\u00db\u00f3\5\26\f\r\u00dc"+
"\u00dd\f\13\2\2\u00dd\u00de\t\5\2\2\u00de\u00f3\5\26\f\f\u00df\u00e0\f"+
"\n\2\2\u00e0\u00e1\t\6\2\2\u00e1\u00f3\5\26\f\13\u00e2\u00e3\f\t\2\2\u00e3"+
"\u00e4\t\7\2\2\u00e4\u00f3\5\26\f\n\u00e5\u00e6\f\b\2\2\u00e6\u00e7\t"+
"\b\2\2\u00e7\u00f3\5\26\f\t\u00e8\u00e9\f\7\2\2\u00e9\u00ea\t\t\2\2\u00ea"+
"\u00f3\5\26\f\b\u00eb\u00ec\f\20\2\2\u00ec\u00ed\7\24\2\2\u00ed\u00ee"+
"\5\26\f\2\u00ee\u00ef\7\25\2\2\u00ef\u00f3\3\2\2\2\u00f0\u00f1\f\16\2"+
"\2\u00f1\u00f3\t\2\2\2\u00f2\u00d9\3\2\2\2\u00f2\u00dc\3\2\2\2\u00f2\u00df"+
"\3\2\2\2\u00f2\u00e2\3\2\2\2\u00f2\u00e5\3\2\2\2\u00f2\u00e8\3\2\2\2\u00f2"+
"\u00eb\3\2\2\2\u00f2\u00f0\3\2\2\2\u00f3\u00f6\3\2\2\2\u00f4\u00f2\3\2"+
"\2\2\u00f4\u00f5\3\2\2\2\u00f5\27\3\2\2\2\u00f6\u00f4\3\2\2\2\u00f7\u00fc"+
"\5\26\f\2\u00f8\u00f9\7\22\2\2\u00f9\u00fb\5\26\f\2\u00fa\u00f8\3\2\2"+
"\2\u00fb\u00fe\3\2\2\2\u00fc\u00fa\3\2\2\2\u00fc\u00fd\3\2\2\2\u00fd\31"+
"\3\2\2\2\u00fe\u00fc\3\2\2\2\35 $+\60\65;N`hknsy\u0080\u0087\u0095\u0098"+
"\u009a\u00a4\u00a9\u00b3\u00bc\u00c7\u00d7\u00f2\u00f4\u00fc";
"\u00c9\3\2\2\2\u00c9\u00d9\7\6\2\2\u00ca\u00cb\7\5\2\2\u00cb\u00cc\5\20"+
"\t\2\u00cc\u00cd\7\6\2\2\u00cd\u00ce\5\26\f\22\u00ce\u00d9\3\2\2\2\u00cf"+
"\u00d0\t\2\2\2\u00d0\u00d9\5\26\f\20\u00d1\u00d2\t\3\2\2\u00d2\u00d9\5"+
"\26\f\16\u00d3\u00d9\7:\2\2\u00d4\u00d9\7\61\2\2\u00d5\u00d9\7.\2\2\u00d6"+
"\u00d9\7/\2\2\u00d7\u00d9\7\60\2\2\u00d8\u00bf\3\2\2\2\u00d8\u00c4\3\2"+
"\2\2\u00d8\u00ca\3\2\2\2\u00d8\u00cf\3\2\2\2\u00d8\u00d1\3\2\2\2\u00d8"+
"\u00d3\3\2\2\2\u00d8\u00d4\3\2\2\2\u00d8\u00d5\3\2\2\2\u00d8\u00d6\3\2"+
"\2\2\u00d8\u00d7\3\2\2\2\u00d9\u00f5\3\2\2\2\u00da\u00db\f\r\2\2\u00db"+
"\u00dc\t\4\2\2\u00dc\u00f4\5\26\f\16\u00dd\u00de\f\f\2\2\u00de\u00df\t"+
"\5\2\2\u00df\u00f4\5\26\f\r\u00e0\u00e1\f\13\2\2\u00e1\u00e2\t\6\2\2\u00e2"+
"\u00f4\5\26\f\f\u00e3\u00e4\f\n\2\2\u00e4\u00e5\t\7\2\2\u00e5\u00f4\5"+
"\26\f\13\u00e6\u00e7\f\t\2\2\u00e7\u00e8\t\b\2\2\u00e8\u00f4\5\26\f\n"+
"\u00e9\u00ea\f\b\2\2\u00ea\u00eb\t\t\2\2\u00eb\u00f4\5\26\f\t\u00ec\u00ed"+
"\f\21\2\2\u00ed\u00ee\7\24\2\2\u00ee\u00ef\5\26\f\2\u00ef\u00f0\7\25\2"+
"\2\u00f0\u00f4\3\2\2\2\u00f1\u00f2\f\17\2\2\u00f2\u00f4\t\2\2\2\u00f3"+
"\u00da\3\2\2\2\u00f3\u00dd\3\2\2\2\u00f3\u00e0\3\2\2\2\u00f3\u00e3\3\2"+
"\2\2\u00f3\u00e6\3\2\2\2\u00f3\u00e9\3\2\2\2\u00f3\u00ec\3\2\2\2\u00f3"+
"\u00f1\3\2\2\2\u00f4\u00f7\3\2\2\2\u00f5\u00f3\3\2\2\2\u00f5\u00f6\3\2"+
"\2\2\u00f6\27\3\2\2\2\u00f7\u00f5\3\2\2\2\u00f8\u00fd\5\26\f\2\u00f9\u00fa"+
"\7\22\2\2\u00fa\u00fc\5\26\f\2\u00fb\u00f9\3\2\2\2\u00fc\u00ff\3\2\2\2"+
"\u00fd\u00fb\3\2\2\2\u00fd\u00fe\3\2\2\2\u00fe\31\3\2\2\2\u00ff\u00fd"+
"\3\2\2\2\35 $+\60\65;N`hknsy\u0080\u0087\u0095\u0098\u009a\u00a4\u00a9"+
"\u00b3\u00bc\u00c7\u00d8\u00f3\u00f5\u00fd";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -188,20 +188,6 @@ public interface KickCVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitLvaluePar(KickCParser.LvalueParContext ctx);
/**
* Visit a parse tree produced by the {@code exprCast}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitExprCast(KickCParser.ExprCastContext ctx);
/**
* Visit a parse tree produced by the {@code exprCall}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitExprCall(KickCParser.ExprCallContext ctx);
/**
* Visit a parse tree produced by the {@code exprPreMod}
* labeled alternative in {@link KickCParser#expr}.
@ -216,6 +202,48 @@ public interface KickCVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitExprBinary(KickCParser.ExprBinaryContext ctx);
/**
* Visit a parse tree produced by the {@code exprPostMod}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitExprPostMod(KickCParser.ExprPostModContext ctx);
/**
* Visit a parse tree produced by the {@code exprUnary}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitExprUnary(KickCParser.ExprUnaryContext ctx);
/**
* Visit a parse tree produced by the {@code exprNumber}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitExprNumber(KickCParser.ExprNumberContext ctx);
/**
* Visit a parse tree produced by the {@code exprChar}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitExprChar(KickCParser.ExprCharContext ctx);
/**
* Visit a parse tree produced by the {@code exprCast}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitExprCast(KickCParser.ExprCastContext ctx);
/**
* Visit a parse tree produced by the {@code exprCall}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitExprCall(KickCParser.ExprCallContext ctx);
/**
* Visit a parse tree produced by the {@code exprPar}
* labeled alternative in {@link KickCParser#expr}.
@ -237,13 +265,6 @@ public interface KickCVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitExprBool(KickCParser.ExprBoolContext ctx);
/**
* Visit a parse tree produced by the {@code exprPostMod}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitExprPostMod(KickCParser.ExprPostModContext ctx);
/**
* Visit a parse tree produced by the {@code exprId}
* labeled alternative in {@link KickCParser#expr}.
@ -251,20 +272,6 @@ public interface KickCVisitor<T> extends ParseTreeVisitor<T> {
* @return the visitor result
*/
T visitExprId(KickCParser.ExprIdContext ctx);
/**
* Visit a parse tree produced by the {@code exprUnary}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitExprUnary(KickCParser.ExprUnaryContext ctx);
/**
* Visit a parse tree produced by the {@code exprNumber}
* labeled alternative in {@link KickCParser#expr}.
* @param ctx the parse tree
* @return the visitor result
*/
T visitExprNumber(KickCParser.ExprNumberContext ctx);
/**
* Visit a parse tree produced by the {@code exprArray}
* labeled alternative in {@link KickCParser#expr}.

View File

@ -496,6 +496,11 @@ public class Pass1GenerateStatementSequence extends KickCBaseVisitor<Object> {
return new ConstantBool(Boolean.valueOf(bool));
}
@Override
public Object visitExprChar(KickCParser.ExprCharContext ctx) {
return new ConstantChar(ctx.getText().charAt(1));
}
@Override
public RValue visitExprBinary(KickCParser.ExprBinaryContext ctx) {
RValue left = (RValue) this.visit(ctx.expr(0));

View File

@ -24,6 +24,10 @@ public class TestCompilationOutput extends TestCase {
helper = new ReferenceHelper("dk/camelot64/kickc/test/ref/");
}
public void testLiterals() throws IOException, URISyntaxException {
compileAndCompare("literals");
}
public void testIncD020() throws IOException, URISyntaxException {
compileAndCompare("incd020");
}

View File

@ -0,0 +1,16 @@
byte* SCREEN = $0400;
byte char = 'a';
byte num = 1;
byte[] str = "bcd";
byte[] nums = { 2, 3, 4};
main();
void main() {
SCREEN[0] = char;
SCREEN[2] = num;
for(byte i : 0..2) {
SCREEN[4+i] = str[i];
SCREEN[8+i] = nums[i];
}
}

View File

@ -0,0 +1,22 @@
.const SCREEN = $400
.const char = 'a'
.const num = 1
str: .text "bcd"
nums: .byte 2, 3, 4
jsr main
main: {
lda #char
sta SCREEN+0
lda #num
sta SCREEN+2
ldx #0
b1:
lda str,x
sta SCREEN+4,x
lda nums,x
sta SCREEN+8,x
inx
cpx #3
bne b1
rts
}

View File

@ -0,0 +1,20 @@
@begin: scope:[] from
[0] call main param-assignment [ ]
to:@end
@end: scope:[] from @begin
main: scope:[main] from @begin
[1] *((const byte*) SCREEN#0+(byte) 0) ← (const byte) char#0 [ ]
[2] *((const byte*) SCREEN#0+(byte) 2) ← (const byte) num#0 [ ]
to:main::@1
main::@1: scope:[main] from main main::@1
[3] (byte) main::i#2 ← phi( main/(byte) 0 main::@1/(byte) main::i#1 ) [ main::i#2 ]
[4] (byte~) main::$1 ← (const byte[]) str#0 *idx (byte) main::i#2 [ main::i#2 main::$1 ]
[5] *((const byte*) SCREEN#0+(byte) 4 + (byte) main::i#2) ← (byte~) main::$1 [ main::i#2 ]
[6] (byte~) main::$3 ← (const byte[]) nums#0 *idx (byte) main::i#2 [ main::i#2 main::$3 ]
[7] *((const byte*) SCREEN#0+(byte) 8 + (byte) main::i#2) ← (byte~) main::$3 [ main::i#2 ]
[8] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ]
[9] if((byte) main::i#1!=(byte) 3) goto main::@1 [ main::i#1 ]
to:main::@return
main::@return: scope:[main] from main::@1
[10] return [ ]
to:@return

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,24 @@
(label) @begin
(label) @end
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = (word) 1024
(byte) char
(const byte) char#0 char = (byte) 'a'
(void()) main()
(byte~) main::$1 reg byte a 22.0
(byte~) main::$3 reg byte a 22.0
(label) main::@1
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte x 16.5
(byte) main::i#2 reg byte x 13.2
(byte) num
(const byte) num#0 num = (byte) 1
(byte[]) nums
(const byte[]) nums#0 nums = { (byte) 2, (byte) 3, (byte) 4 }
(byte[]) str
(const byte[]) str#0 str = (string) "bcd"
reg byte x [ main::i#2 main::i#1 ]
reg byte a [ main::$1 ]
reg byte a [ main::$3 ]

View File

@ -2,8 +2,7 @@
.const RASTER = $d012
.const BGCOL = $d020
.const SCROLL = $d016
TEXT: .text "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
STOP: .byte 0
TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
jsr main
main: {
.const line = SCREEN+$28
@ -38,7 +37,7 @@ main: {
bne b5
ldy #0
lda (nxt),y
cmp #0
cmp #'@'
bne b6
lda #<TEXT
sta nxt

View File

@ -32,7 +32,7 @@ main::@5: scope:[main] from main::@5 main::@8
to:main::@10
main::@10: scope:[main] from main::@5
[18] (byte) main::c#0 ← * (byte*) main::nxt#3 [ main::nxt#3 main::c#0 ]
[19] if((byte) main::c#0!=(byte) 0) goto main::@6 [ main::nxt#3 main::c#0 ]
[19] if((byte) main::c#0!=(byte) '@') goto main::@6 [ main::nxt#3 main::c#0 ]
to:main::@11
main::@11: scope:[main] from main::@10
[20] (byte) main::c#1 ← * (const byte*) TEXT#0 [ main::c#1 ]

View File

@ -2,8 +2,7 @@ byte* SCREEN = $0400;
byte* RASTER = $d012;
byte* BGCOL = $d020;
byte* SCROLL = $d016;
byte* TEXT = "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. ";
byte[] STOP = { 0 };
byte* TEXT = "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @";
main();
void main() {
@ -25,7 +24,7 @@ void main() {
}
// Render next char
byte c = *nxt;
if(c==0) {
if(c=='@') {
nxt = TEXT;
c = *nxt;
}
@ -51,8 +50,7 @@ PROGRAM
(byte*) RASTER ← (word) 53266
(byte*) BGCOL ← (word) 53280
(byte*) SCROLL ← (word) 53270
(byte*) TEXT ← (string) "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
(byte[]) STOP ← { (byte) 0 }
(byte*) TEXT ← (string) "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
(void~) $0 ← call main
proc (void()) main()
(void~) main::$0 ← call fillscreen (byte*) SCREEN (byte) 32
@ -87,7 +85,7 @@ main::@5:
if((boolean~) main::$12) goto main::@5
(byte~) main::$13 ← * (byte*) main::nxt
(byte) main::c ← (byte~) main::$13
(boolean~) main::$14 ← (byte) main::c == (byte) 0
(boolean~) main::$14 ← (byte) main::c == (byte) '@'
(boolean~) main::$15 ← ! (boolean~) main::$14
if((boolean~) main::$15) goto main::@6
(byte*) main::nxt ← (byte*) TEXT
@ -123,7 +121,6 @@ SYMBOLS
(byte*) RASTER
(byte*) SCREEN
(byte*) SCROLL
(byte[]) STOP
(byte*) TEXT
(void()) fillscreen((byte*) fillscreen::screen , (byte) fillscreen::fill)
(byte*~) fillscreen::$0
@ -172,8 +169,7 @@ INITIAL CONTROL FLOW GRAPH
(byte*) RASTER ← (word) 53266
(byte*) BGCOL ← (word) 53280
(byte*) SCROLL ← (word) 53270
(byte*) TEXT ← (string) "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
(byte[]) STOP ← { (byte) 0 }
(byte*) TEXT ← (string) "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
(void~) $0 ← call main
to:@1
main: scope:[main] from
@ -228,7 +224,7 @@ main::@5: scope:[main] from main::@5 main::@9
main::@10: scope:[main] from main::@5
(byte~) main::$13 ← * (byte*) main::nxt
(byte) main::c ← (byte~) main::$13
(boolean~) main::$14 ← (byte) main::c == (byte) 0
(boolean~) main::$14 ← (byte) main::c == (byte) '@'
(boolean~) main::$15 ← ! (boolean~) main::$14
if((boolean~) main::$15) goto main::@6
to:main::@11
@ -278,8 +274,7 @@ CONTROL FLOW GRAPH
(byte*) RASTER ← (word) 53266
(byte*) BGCOL ← (word) 53280
(byte*) SCROLL ← (word) 53270
(byte*) TEXT ← (string) "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
(byte[]) STOP ← { (byte) 0 }
(byte*) TEXT ← (string) "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
(void~) $0 ← call main
to:@end
main: scope:[main] from
@ -332,7 +327,7 @@ main::@5: scope:[main] from main::@5 main::@9
main::@10: scope:[main] from main::@5
(byte~) main::$13 ← * (byte*) main::nxt
(byte) main::c ← (byte~) main::$13
(boolean~) main::$14 ← (byte) main::c == (byte) 0
(boolean~) main::$14 ← (byte) main::c == (byte) '@'
(boolean~) main::$15 ← ! (boolean~) main::$14
if((boolean~) main::$15) goto main::@6
to:main::@11
@ -371,8 +366,7 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL
(byte*) RASTER ← (word) 53266
(byte*) BGCOL ← (word) 53280
(byte*) SCROLL ← (word) 53270
(byte*) TEXT ← (string) "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
(byte[]) STOP ← { (byte) 0 }
(byte*) TEXT ← (string) "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
call main param-assignment
to:@3
@3: scope:[] from @begin
@ -431,7 +425,7 @@ main::@5: scope:[main] from main::@5 main::@9
main::@10: scope:[main] from main::@5
(byte~) main::$13 ← * (byte*) main::nxt
(byte) main::c ← (byte~) main::$13
(boolean~) main::$14 ← (byte) main::c == (byte) 0
(boolean~) main::$14 ← (byte) main::c == (byte) '@'
(boolean~) main::$15 ← ! (boolean~) main::$14
if((boolean~) main::$15) goto main::@6
to:main::@11
@ -478,8 +472,7 @@ CONTROL FLOW GRAPH SSA
(byte*) RASTER#0 ← (word) 53266
(byte*) BGCOL#0 ← (word) 53280
(byte*) SCROLL#0 ← (word) 53270
(byte*) TEXT#0 ← (string) "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
(byte[]) STOP#0 ← { (byte) 0 }
(byte*) TEXT#0 ← (string) "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
call main param-assignment
to:@3
@3: scope:[] from @begin
@ -604,7 +597,7 @@ main::@10: scope:[main] from main::@5
(byte*) main::nxt#3 ← phi( main::@5/(byte*) main::nxt#5 )
(byte~) main::$13 ← * (byte*) main::nxt#3
(byte) main::c#0 ← (byte~) main::$13
(boolean~) main::$14 ← (byte) main::c#0 == (byte) 0
(boolean~) main::$14 ← (byte) main::c#0 == (byte) '@'
(boolean~) main::$15 ← ! (boolean~) main::$14
if((boolean~) main::$15) goto main::@6
to:main::@11
@ -660,8 +653,7 @@ CONTROL FLOW GRAPH WITH ASSIGNMENT CALL & RETURN
(byte*) RASTER#0 ← (word) 53266
(byte*) BGCOL#0 ← (word) 53280
(byte*) SCROLL#0 ← (word) 53270
(byte*) TEXT#0 ← (string) "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
(byte[]) STOP#0 ← { (byte) 0 }
(byte*) TEXT#0 ← (string) "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
call main param-assignment
to:@3
@3: scope:[] from @begin
@ -786,7 +778,7 @@ main::@10: scope:[main] from main::@5
(byte*) main::nxt#3 ← phi( main::@5/(byte*) main::nxt#5 )
(byte~) main::$13 ← * (byte*) main::nxt#3
(byte) main::c#0 ← (byte~) main::$13
(boolean~) main::$14 ← (byte) main::c#0 == (byte) 0
(boolean~) main::$14 ← (byte) main::c#0 == (byte) '@'
(boolean~) main::$15 ← ! (boolean~) main::$14
if((boolean~) main::$15) goto main::@6
to:main::@11
@ -886,8 +878,6 @@ INITIAL SSA SYMBOL TABLE
(byte*) SCROLL#7
(byte*) SCROLL#8
(byte*) SCROLL#9
(byte[]) STOP
(byte[]) STOP#0
(byte*) TEXT
(byte*) TEXT#0
(byte*) TEXT#1
@ -1005,8 +995,7 @@ CONTROL FLOW GRAPH
(byte*) RASTER#0 ← (word) 53266
(byte*) BGCOL#0 ← (word) 53280
(byte*) SCROLL#0 ← (word) 53270
(byte*) TEXT#0 ← (string) "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
(byte[]) STOP#0 ← { (byte) 0 }
(byte*) TEXT#0 ← (string) "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
call main param-assignment
to:@end
main: scope:[main] from @begin
@ -1129,7 +1118,7 @@ main::@10: scope:[main] from main::@5
(byte*) main::nxt#3 ← phi( main::@5/(byte*) main::nxt#5 )
(byte~) main::$13 ← * (byte*) main::nxt#3
(byte) main::c#0 ← (byte~) main::$13
(boolean~) main::$14 ← (byte) main::c#0 == (byte) 0
(boolean~) main::$14 ← (byte) main::c#0 == (byte) '@'
(boolean~) main::$15 ← ! (boolean~) main::$14
if((boolean~) main::$15) goto main::@6
to:main::@11
@ -1180,7 +1169,7 @@ fillscreen::@return: scope:[fillscreen] from fillscreen::@1
@end: scope:[] from @begin
Inversing boolean not (boolean~) main::$9 ← (byte) main::scroll#1 != (byte) 255 from (boolean~) main::$8 ← (byte) main::scroll#1 == (byte) 255
Inversing boolean not (boolean~) main::$15 ← (byte) main::c#0 != (byte) 0 from (boolean~) main::$14 ← (byte) main::c#0 == (byte) 0
Inversing boolean not (boolean~) main::$15 ← (byte) main::c#0 != (byte) '@' from (boolean~) main::$14 ← (byte) main::c#0 == (byte) '@'
Succesful SSA optimization Pass2UnaryNotSimplification
CONTROL FLOW GRAPH
@begin: scope:[] from
@ -1188,8 +1177,7 @@ CONTROL FLOW GRAPH
(byte*) RASTER#0 ← (word) 53266
(byte*) BGCOL#0 ← (word) 53280
(byte*) SCROLL#0 ← (word) 53270
(byte*) TEXT#0 ← (string) "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
(byte[]) STOP#0 ← { (byte) 0 }
(byte*) TEXT#0 ← (string) "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
call main param-assignment
to:@end
main: scope:[main] from @begin
@ -1311,7 +1299,7 @@ main::@10: scope:[main] from main::@5
(byte*) main::nxt#3 ← phi( main::@5/(byte*) main::nxt#5 )
(byte~) main::$13 ← * (byte*) main::nxt#3
(byte) main::c#0 ← (byte~) main::$13
(boolean~) main::$15 ← (byte) main::c#0 != (byte) 0
(boolean~) main::$15 ← (byte) main::c#0 != (byte) '@'
if((boolean~) main::$15) goto main::@6
to:main::@11
main::@6: scope:[main] from main::@10 main::@11
@ -1401,8 +1389,7 @@ CONTROL FLOW GRAPH
(byte*) RASTER#0 ← (word) 53266
(byte*) BGCOL#0 ← (word) 53280
(byte*) SCROLL#0 ← (word) 53270
(byte*) TEXT#0 ← (string) "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
(byte[]) STOP#0 ← { (byte) 0 }
(byte*) TEXT#0 ← (string) "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
call main param-assignment
to:@end
main: scope:[main] from @begin
@ -1485,7 +1472,7 @@ main::@5: scope:[main] from main::@5 main::@9
to:main::@10
main::@10: scope:[main] from main::@5
(byte) main::c#0 ← * (byte*) main::nxt#3
(boolean~) main::$15 ← (byte) main::c#0 != (byte) 0
(boolean~) main::$15 ← (byte) main::c#0 != (byte) '@'
if((boolean~) main::$15) goto main::@6
to:main::@11
main::@6: scope:[main] from main::@10 main::@11
@ -1540,8 +1527,7 @@ CONTROL FLOW GRAPH
(byte*) RASTER#0 ← (word) 53266
(byte*) BGCOL#0 ← (word) 53280
(byte*) SCROLL#0 ← (word) 53270
(byte*) TEXT#0 ← (string) "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
(byte[]) STOP#0 ← { (byte) 0 }
(byte*) TEXT#0 ← (string) "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
call main param-assignment
to:@end
main: scope:[main] from @begin
@ -1624,7 +1610,7 @@ main::@5: scope:[main] from main::@5 main::@9
to:main::@10
main::@10: scope:[main] from main::@5
(byte) main::c#0 ← * (byte*) main::nxt#3
(boolean~) main::$15 ← (byte) main::c#0 != (byte) 0
(boolean~) main::$15 ← (byte) main::c#0 != (byte) '@'
if((boolean~) main::$15) goto main::@6
to:main::@11
main::@6: scope:[main] from main::@10 main::@11
@ -1687,8 +1673,7 @@ CONTROL FLOW GRAPH
(byte*) RASTER#0 ← (word) 53266
(byte*) BGCOL#0 ← (word) 53280
(byte*) SCROLL#0 ← (word) 53270
(byte*) TEXT#0 ← (string) "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
(byte[]) STOP#0 ← { (byte) 0 }
(byte*) TEXT#0 ← (string) "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
call main param-assignment
to:@end
main: scope:[main] from @begin
@ -1771,7 +1756,7 @@ main::@5: scope:[main] from main::@5 main::@9
to:main::@10
main::@10: scope:[main] from main::@5
(byte) main::c#0 ← * (byte*) main::nxt#3
(boolean~) main::$15 ← (byte) main::c#0 != (byte) 0
(boolean~) main::$15 ← (byte) main::c#0 != (byte) '@'
if((boolean~) main::$15) goto main::@6
to:main::@11
main::@6: scope:[main] from main::@10 main::@11
@ -1808,7 +1793,7 @@ Simple Condition (boolean~) main::$3 if((byte~) main::$2!=(byte) 254) goto main:
Simple Condition (boolean~) main::$5 if((byte~) main::$4!=(byte) 255) goto main::@3
Simple Condition (boolean~) main::$9 if((byte) main::scroll#1!=(byte) 255) goto main::@4
Simple Condition (boolean~) main::$12 if((byte) main::i#1!=(byte) 39) goto main::@5
Simple Condition (boolean~) main::$15 if((byte) main::c#0!=(byte) 0) goto main::@6
Simple Condition (boolean~) main::$15 if((byte) main::c#0!=(byte) '@') goto main::@6
Simple Condition (boolean~) fillscreen::$1 if((byte*) fillscreen::cursor#1<(byte*~) fillscreen::$0) goto fillscreen::@1
Succesful SSA optimization Pass2ConditionalJumpSimplification
CONTROL FLOW GRAPH
@ -1817,8 +1802,7 @@ CONTROL FLOW GRAPH
(byte*) RASTER#0 ← (word) 53266
(byte*) BGCOL#0 ← (word) 53280
(byte*) SCROLL#0 ← (word) 53270
(byte*) TEXT#0 ← (string) "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
(byte[]) STOP#0 ← { (byte) 0 }
(byte*) TEXT#0 ← (string) "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
call main param-assignment
to:@end
main: scope:[main] from @begin
@ -1897,7 +1881,7 @@ main::@5: scope:[main] from main::@5 main::@9
to:main::@10
main::@10: scope:[main] from main::@5
(byte) main::c#0 ← * (byte*) main::nxt#3
if((byte) main::c#0!=(byte) 0) goto main::@6
if((byte) main::c#0!=(byte) '@') goto main::@6
to:main::@11
main::@6: scope:[main] from main::@10 main::@11
(byte*) main::nxt#4 ← phi( main::@10/(byte*) main::nxt#3 main::@11/(byte*) main::nxt#2 )
@ -1932,8 +1916,7 @@ Constant (const byte*) SCREEN#0 = 1024
Constant (const byte*) RASTER#0 = 53266
Constant (const byte*) BGCOL#0 = 53280
Constant (const byte*) SCROLL#0 = 53270
Constant (const byte*) TEXT#0 = "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
Constant (const byte[]) STOP#0 = { 0 }
Constant (const byte*) TEXT#0 = "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
Constant (const byte) fillscreen::fill#0 = 32
Constant (const byte) main::scroll#0 = 7
Constant (const byte) main::scroll#2 = 7
@ -2015,7 +1998,7 @@ main::@5: scope:[main] from main::@5 main::@9
to:main::@10
main::@10: scope:[main] from main::@5
(byte) main::c#0 ← * (byte*) main::nxt#3
if((byte) main::c#0!=(byte) 0) goto main::@6
if((byte) main::c#0!=(byte) '@') goto main::@6
to:main::@11
main::@6: scope:[main] from main::@10 main::@11
(byte*) main::nxt#4 ← phi( main::@10/(byte*) main::nxt#3 main::@11/(byte*) main::nxt#2 )
@ -2124,7 +2107,7 @@ main::@5: scope:[main] from main::@5 main::@9
to:main::@10
main::@10: scope:[main] from main::@5
(byte) main::c#0 ← * (byte*) main::nxt#3
if((byte) main::c#0!=(byte) 0) goto main::@6
if((byte) main::c#0!=(byte) '@') goto main::@6
to:main::@11
main::@6: scope:[main] from main::@10 main::@11
(byte*) main::nxt#4 ← phi( main::@10/(byte*) main::nxt#3 main::@11/(byte*) main::nxt#2 )
@ -2228,7 +2211,7 @@ main::@5: scope:[main] from main::@5 main::@9
to:main::@10
main::@10: scope:[main] from main::@5
(byte) main::c#0 ← * (byte*) main::nxt#3
if((byte) main::c#0!=(byte) 0) goto main::@6
if((byte) main::c#0!=(byte) '@') goto main::@6
to:main::@11
main::@6: scope:[main] from main::@10 main::@11
(byte*) main::nxt#4 ← phi( main::@10/(byte*) main::nxt#3 main::@11/(byte*) main::nxt#2 )
@ -2331,7 +2314,7 @@ main::@5: scope:[main] from main::@5 main::@9
to:main::@10
main::@10: scope:[main] from main::@5
(byte) main::c#0 ← * (byte*) main::nxt#3
if((byte) main::c#0!=(byte) 0) goto main::@6
if((byte) main::c#0!=(byte) '@') goto main::@6
to:main::@11
main::@6: scope:[main] from main::@10 main::@11
(byte*) main::nxt#4 ← phi( main::@10/(byte*) main::nxt#3 main::@11/(byte*) main::nxt#2 )
@ -2430,7 +2413,7 @@ main::@5: scope:[main] from main::@5 main::@8
to:main::@10
main::@10: scope:[main] from main::@5
(byte) main::c#0 ← * (byte*) main::nxt#3
if((byte) main::c#0!=(byte) 0) goto main::@6
if((byte) main::c#0!=(byte) '@') goto main::@6
to:main::@11
main::@6: scope:[main] from main::@10 main::@11
(byte*) main::nxt#4 ← phi( main::@10/(byte*) main::nxt#3 main::@11/(byte*) main::nxt#2 )
@ -2520,7 +2503,7 @@ main::@5: scope:[main] from main::@5 main::@8
to:main::@10
main::@10: scope:[main] from main::@5
(byte) main::c#0 ← * (byte*) main::nxt#3
if((byte) main::c#0!=(byte) 0) goto main::@6
if((byte) main::c#0!=(byte) '@') goto main::@6
to:main::@11
main::@6: scope:[main] from main::@10 main::@11
(byte*) main::nxt#4 ← phi( main::@10/(byte*) main::nxt#3 main::@11/(byte*) main::nxt#2 )
@ -2603,7 +2586,7 @@ main::@5: scope:[main] from main::@5 main::@8
to:main::@10
main::@10: scope:[main] from main::@5
(byte) main::c#0 ← * (byte*) main::nxt#3
if((byte) main::c#0!=(byte) 0) goto main::@6
if((byte) main::c#0!=(byte) '@') goto main::@6
to:main::@11
main::@6: scope:[main] from main::@10 main::@11
(byte*) main::nxt#4 ← phi( main::@10/(byte*) main::nxt#3 main::@11/(byte*) main::nxt#2 )
@ -2685,7 +2668,7 @@ main::@5: scope:[main] from main::@5 main::@8
to:main::@10
main::@10: scope:[main] from main::@5
(byte) main::c#0 ← * (byte*) main::nxt#3
if((byte) main::c#0!=(byte) 0) goto main::@6
if((byte) main::c#0!=(byte) '@') goto main::@6
to:main::@11
main::@6: scope:[main] from main::@10 main::@11
(byte*) main::nxt#4 ← phi( main::@10/(byte*) main::nxt#3 main::@11/(byte*) main::nxt#2 )
@ -2762,7 +2745,7 @@ main::@5: scope:[main] from main::@5 main::@8
to:main::@10
main::@10: scope:[main] from main::@5
(byte) main::c#0 ← * (byte*) main::nxt#3
if((byte) main::c#0!=(byte) 0) goto main::@6
if((byte) main::c#0!=(byte) '@') goto main::@6
to:main::@11
main::@6: scope:[main] from main::@10 main::@11
(byte*) main::nxt#4 ← phi( main::@10/(byte*) main::nxt#3 main::@11/(byte*) main::nxt#2 )
@ -2835,7 +2818,7 @@ main::@5: scope:[main] from main::@5 main::@8
to:main::@10
main::@10: scope:[main] from main::@5
(byte) main::c#0 ← * (byte*) main::nxt#3
if((byte) main::c#0!=(byte) 0) goto main::@6
if((byte) main::c#0!=(byte) '@') goto main::@6
to:main::@11
main::@6: scope:[main] from main::@10 main::@11
(byte*) main::nxt#4 ← phi( main::@10/(byte*) main::nxt#3 main::@11/(const byte*) main::nxt#2 )
@ -2910,7 +2893,7 @@ main::@5: scope:[main] from main::@5 main::@8
to:main::@10
main::@10: scope:[main] from main::@5
(byte) main::c#0 ← * (byte*) main::nxt#3
if((byte) main::c#0!=(byte) 0) goto main::@6
if((byte) main::c#0!=(byte) '@') goto main::@6
to:main::@11
main::@6: scope:[main] from main::@10 main::@11
(byte*) main::nxt#4 ← phi( main::@10/(byte*) main::nxt#3 main::@11/(const byte*) main::nxt#2 )
@ -2982,7 +2965,7 @@ main::@5: scope:[main] from main::@5 main::@8
to:main::@10
main::@10: scope:[main] from main::@5
(byte) main::c#0 ← * (byte*) main::nxt#3
if((byte) main::c#0!=(byte) 0) goto main::@6
if((byte) main::c#0!=(byte) '@') goto main::@6
to:main::@11
main::@6: scope:[main] from main::@10 main::@11
(byte*) main::nxt#4 ← phi( main::@10/(byte*) main::nxt#3 main::@11/(const byte*) main::nxt#2 )
@ -3071,7 +3054,7 @@ main::@5: scope:[main] from main::@5 main::@8
to:main::@10
main::@10: scope:[main] from main::@5
(byte) main::c#0 ← * (byte*) main::nxt#3
if((byte) main::c#0!=(byte) 0) goto main::@6
if((byte) main::c#0!=(byte) '@') goto main::@6
to:main::@11
main::@6: scope:[main] from main::@10 main::@11
(byte*) main::nxt#4 ← phi( main::@10/(byte*) main::nxt#3 main::@11/(const byte*) TEXT#0 )
@ -3109,10 +3092,8 @@ FINAL SYMBOL TABLE
(const byte*) SCREEN#0 = (word) 1024
(byte*) SCROLL
(const byte*) SCROLL#0 = (word) 53270
(byte[]) STOP
(const byte[]) STOP#0 = { (byte) 0 }
(byte*) TEXT
(const byte*) TEXT#0 = (string) "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
(const byte*) TEXT#0 = (string) "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
(void()) fillscreen((byte*) fillscreen::screen , (byte) fillscreen::fill)
(label) fillscreen::@1
(label) fillscreen::@return
@ -3199,7 +3180,7 @@ main::@5: scope:[main] from main::@15 main::@8
to:main::@10
main::@10: scope:[main] from main::@5
(byte) main::c#0 ← * (byte*) main::nxt#3
if((byte) main::c#0!=(byte) 0) goto main::@16
if((byte) main::c#0!=(byte) '@') goto main::@16
to:main::@11
main::@11: scope:[main] from main::@10
(byte) main::c#1 ← * (const byte*) TEXT#0
@ -3307,7 +3288,7 @@ main::@5: scope:[main] from main::@15 main::@8
to:main::@10
main::@10: scope:[main] from main::@5
[18] (byte) main::c#0 ← * (byte*) main::nxt#3 [ main::nxt#3 main::c#0 ]
[19] if((byte) main::c#0!=(byte) 0) goto main::@16 [ main::nxt#3 main::c#0 ]
[19] if((byte) main::c#0!=(byte) '@') goto main::@16 [ main::nxt#3 main::c#0 ]
to:main::@11
main::@11: scope:[main] from main::@10
[20] (byte) main::c#1 ← * (const byte*) TEXT#0 [ main::c#1 ]
@ -3429,7 +3410,7 @@ main::@5: scope:[main] from main::@5 main::@8
to:main::@10
main::@10: scope:[main] from main::@5
[18] (byte) main::c#0 ← * (byte*) main::nxt#3 [ main::nxt#3 main::c#0 ]
[19] if((byte) main::c#0!=(byte) 0) goto main::@6 [ main::nxt#3 main::c#0 ]
[19] if((byte) main::c#0!=(byte) '@') goto main::@6 [ main::nxt#3 main::c#0 ]
to:main::@11
main::@11: scope:[main] from main::@10
[20] (byte) main::c#1 ← * (const byte*) TEXT#0 [ main::c#1 ]
@ -3520,7 +3501,6 @@ VARIABLE REGISTER WEIGHTS
(byte*) RASTER
(byte*) SCREEN
(byte*) SCROLL
(byte[]) STOP
(byte*) TEXT
(void()) fillscreen((byte*) fillscreen::screen , (byte) fillscreen::fill)
(byte*) fillscreen::cursor
@ -3598,8 +3578,7 @@ INITIAL ASM
.const RASTER = $d012
.const BGCOL = $d020
.const SCROLL = $d016
TEXT: .text "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
STOP: .byte 0
TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
//SEG1 @begin
bbegin:
//SEG2 [0] call main param-assignment [ ]
@ -3718,8 +3697,9 @@ main: {
ldy #0
lda (nxt),y
sta c
//SEG38 [19] if((byte) main::c#0!=(byte) 0) goto main::@6 [ main::nxt#3 main::c#0 ] -- zpby1_neq_0_then_la1
//SEG38 [19] if((byte) main::c#0!=(byte) '@') goto main::@6 [ main::nxt#3 main::c#0 ] -- zpby1_neq_coby1_then_la1
lda c
cmp #'@'
bne b6_from_b10
jmp b11
//SEG39 main::@11
@ -3888,8 +3868,7 @@ ASSEMBLER
.const RASTER = $d012
.const BGCOL = $d020
.const SCROLL = $d016
TEXT: .text "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
STOP: .byte 0
TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
//SEG1 @begin
bbegin:
//SEG2 [0] call main param-assignment [ ]
@ -3975,8 +3954,8 @@ main: {
//SEG37 [18] (byte) main::c#0 ← * (byte*) main::nxt#3 [ main::nxt#3 main::c#0 ] -- aby=_star_zpptrby1
ldy #0
lda (nxt),y
//SEG38 [19] if((byte) main::c#0!=(byte) 0) goto main::@6 [ main::nxt#3 main::c#0 ] -- aby_neq_0_then_la1
cmp #0
//SEG38 [19] if((byte) main::c#0!=(byte) '@') goto main::@6 [ main::nxt#3 main::c#0 ] -- aby_neq_coby1_then_la1
cmp #'@'
bne b6_from_b10
//SEG39 main::@11
b11:
@ -4092,8 +4071,7 @@ ASSEMBLER
.const RASTER = $d012
.const BGCOL = $d020
.const SCROLL = $d016
TEXT: .text "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
STOP: .byte 0
TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
//SEG1 @begin
bbegin:
//SEG2 [0] call main param-assignment [ ]
@ -4176,8 +4154,8 @@ main: {
//SEG37 [18] (byte) main::c#0 ← * (byte*) main::nxt#3 [ main::nxt#3 main::c#0 ] -- aby=_star_zpptrby1
ldy #0
lda (nxt),y
//SEG38 [19] if((byte) main::c#0!=(byte) 0) goto main::@6 [ main::nxt#3 main::c#0 ] -- aby_neq_0_then_la1
cmp #0
//SEG38 [19] if((byte) main::c#0!=(byte) '@') goto main::@6 [ main::nxt#3 main::c#0 ] -- aby_neq_coby1_then_la1
cmp #'@'
bne b6
//SEG39 main::@11
b11:
@ -4291,8 +4269,7 @@ ASSEMBLER
.const RASTER = $d012
.const BGCOL = $d020
.const SCROLL = $d016
TEXT: .text "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
STOP: .byte 0
TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
//SEG1 @begin
//SEG2 [0] call main param-assignment [ ]
//SEG3 [1] phi from @begin to main
@ -4368,8 +4345,8 @@ main: {
//SEG37 [18] (byte) main::c#0 ← * (byte*) main::nxt#3 [ main::nxt#3 main::c#0 ] -- aby=_star_zpptrby1
ldy #0
lda (nxt),y
//SEG38 [19] if((byte) main::c#0!=(byte) 0) goto main::@6 [ main::nxt#3 main::c#0 ] -- aby_neq_0_then_la1
cmp #0
//SEG38 [19] if((byte) main::c#0!=(byte) '@') goto main::@6 [ main::nxt#3 main::c#0 ] -- aby_neq_coby1_then_la1
cmp #'@'
bne b6
//SEG39 main::@11
//SEG40 [20] (byte) main::c#1 ← * (const byte*) TEXT#0 [ main::c#1 ] -- aby=_star_cowo1
@ -4469,8 +4446,7 @@ ASSEMBLER
.const RASTER = $d012
.const BGCOL = $d020
.const SCROLL = $d016
TEXT: .text "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
STOP: .byte 0
TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
//SEG1 @begin
//SEG2 [0] call main param-assignment [ ]
//SEG3 [1] phi from @begin to main
@ -4544,8 +4520,8 @@ main: {
//SEG37 [18] (byte) main::c#0 ← * (byte*) main::nxt#3 [ main::nxt#3 main::c#0 ] -- aby=_star_zpptrby1
ldy #0
lda (nxt),y
//SEG38 [19] if((byte) main::c#0!=(byte) 0) goto main::@6 [ main::nxt#3 main::c#0 ] -- aby_neq_0_then_la1
cmp #0
//SEG38 [19] if((byte) main::c#0!=(byte) '@') goto main::@6 [ main::nxt#3 main::c#0 ] -- aby_neq_coby1_then_la1
cmp #'@'
bne b6
//SEG39 main::@11
//SEG40 [20] (byte) main::c#1 ← * (const byte*) TEXT#0 [ main::c#1 ] -- aby=_star_cowo1
@ -4639,8 +4615,7 @@ ASSEMBLER
.const RASTER = $d012
.const BGCOL = $d020
.const SCROLL = $d016
TEXT: .text "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
STOP: .byte 0
TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
//SEG1 @begin
//SEG2 [0] call main param-assignment [ ]
//SEG3 [1] phi from @begin to main
@ -4713,8 +4688,8 @@ main: {
//SEG37 [18] (byte) main::c#0 ← * (byte*) main::nxt#3 [ main::nxt#3 main::c#0 ] -- aby=_star_zpptrby1
ldy #0
lda (nxt),y
//SEG38 [19] if((byte) main::c#0!=(byte) 0) goto main::@6 [ main::nxt#3 main::c#0 ] -- aby_neq_0_then_la1
cmp #0
//SEG38 [19] if((byte) main::c#0!=(byte) '@') goto main::@6 [ main::nxt#3 main::c#0 ] -- aby_neq_coby1_then_la1
cmp #'@'
bne b6
//SEG39 main::@11
//SEG40 [20] (byte) main::c#1 ← * (const byte*) TEXT#0 [ main::c#1 ] -- aby=_star_cowo1
@ -4807,8 +4782,7 @@ ASSEMBLER
.const RASTER = $d012
.const BGCOL = $d020
.const SCROLL = $d016
TEXT: .text "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
STOP: .byte 0
TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
//SEG1 @begin
//SEG2 [0] call main param-assignment [ ]
//SEG3 [1] phi from @begin to main
@ -4880,8 +4854,8 @@ main: {
//SEG37 [18] (byte) main::c#0 ← * (byte*) main::nxt#3 [ main::nxt#3 main::c#0 ] -- aby=_star_zpptrby1
ldy #0
lda (nxt),y
//SEG38 [19] if((byte) main::c#0!=(byte) 0) goto main::@6 [ main::nxt#3 main::c#0 ] -- aby_neq_0_then_la1
cmp #0
//SEG38 [19] if((byte) main::c#0!=(byte) '@') goto main::@6 [ main::nxt#3 main::c#0 ] -- aby_neq_coby1_then_la1
cmp #'@'
bne b6
//SEG39 main::@11
//SEG40 [20] (byte) main::c#1 ← * (const byte*) TEXT#0 [ main::c#1 ] -- aby=_star_cowo1
@ -4977,10 +4951,8 @@ FINAL SYMBOL TABLE
(const byte*) SCREEN#0 SCREEN = (word) 1024
(byte*) SCROLL
(const byte*) SCROLL#0 SCROLL = (word) 53270
(byte[]) STOP
(const byte[]) STOP#0 STOP = { (byte) 0 }
(byte*) TEXT
(const byte*) TEXT#0 TEXT = (string) "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
(const byte*) TEXT#0 TEXT = (string) "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
(void()) fillscreen((byte*) fillscreen::screen , (byte) fillscreen::fill)
(label) fillscreen::@1
(label) fillscreen::@return
@ -5044,8 +5016,7 @@ FINAL CODE
.const RASTER = $d012
.const BGCOL = $d020
.const SCROLL = $d016
TEXT: .text "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
STOP: .byte 0
TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
//SEG1 @begin
//SEG2 [0] call main param-assignment [ ]
//SEG3 [1] phi from @begin to main
@ -5117,8 +5088,8 @@ main: {
//SEG37 [18] (byte) main::c#0 ← * (byte*) main::nxt#3 [ main::nxt#3 main::c#0 ] -- aby=_star_zpptrby1
ldy #0
lda (nxt),y
//SEG38 [19] if((byte) main::c#0!=(byte) 0) goto main::@6 [ main::nxt#3 main::c#0 ] -- aby_neq_0_then_la1
cmp #0
//SEG38 [19] if((byte) main::c#0!=(byte) '@') goto main::@6 [ main::nxt#3 main::c#0 ] -- aby_neq_coby1_then_la1
cmp #'@'
bne b6
//SEG39 main::@11
//SEG40 [20] (byte) main::c#1 ← * (const byte*) TEXT#0 [ main::c#1 ] -- aby=_star_cowo1

View File

@ -8,10 +8,8 @@
(const byte*) SCREEN#0 SCREEN = (word) 1024
(byte*) SCROLL
(const byte*) SCROLL#0 SCROLL = (word) 53270
(byte[]) STOP
(const byte[]) STOP#0 STOP = { (byte) 0 }
(byte*) TEXT
(const byte*) TEXT#0 TEXT = (string) "this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. "
(const byte*) TEXT#0 TEXT = (string) "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @"
(void()) fillscreen((byte*) fillscreen::screen , (byte) fillscreen::fill)
(label) fillscreen::@1
(label) fillscreen::@return

View File

@ -1,44 +1,12 @@
.const SCREEN = $400
.const COLORS = $d800
.const FILL = $e6
.const XPOS = $1000
.const YPOS = $1100
.const COLS = $1200
.label numpoints = 8
.const numpoints = 6
XPOS: .byte 5, $f, 6, $22, $15, $1f
YPOS: .byte 5, 8, $e, 2, $11, $16
COLS: .byte 1, 2, 3, 4, 5, 7
jsr main
main: {
lda #1
sta addpoint.c
ldy #5
lda #0
sta numpoints
lda #5
jsr addpoint
lda #2
sta addpoint.c
ldy #8
lda #$f
jsr addpoint
lda #3
sta addpoint.c
ldy #$e
lda #6
jsr addpoint
lda #4
sta addpoint.c
ldy #2
lda #$22
jsr addpoint
lda #5
sta addpoint.c
ldy #$11
lda #$15
jsr addpoint
lda #7
sta addpoint.c
ldy #$16
lda #$1f
jsr addpoint
jsr initscreen
b1:
jsr render
@ -148,10 +116,10 @@ render: {
rts
}
findcol: {
.label x = 9
.label y = 10
.label x = 8
.label y = 9
.label xp = 7
.label yp = 11
.label yp = 10
.label diff = 7
.label mindiff = 6
ldy #0
@ -195,7 +163,7 @@ findcol: {
ldy COLS,x
b8:
inx
cpx numpoints
cpx #numpoints
bcc b19
jmp breturn
b19:
@ -242,16 +210,3 @@ initscreen: {
!:
rts
}
addpoint: {
.label c = 2
ldx numpoints
sta XPOS,x
tya
ldy numpoints
sta YPOS,y
lda c
ldx numpoints
sta COLS,x
inc numpoints
rts
}

View File

@ -4,208 +4,177 @@
@end: scope:[] from @begin
main: scope:[main] from @begin
[1] phi() [ ]
[2] call addpoint param-assignment [ ]
to:main::@3
main::@3: scope:[main] from main
[3] call addpoint param-assignment [ numpoints#1 ]
[2] call initscreen param-assignment [ ]
to:main::@1
main::@1: scope:[main] from main main::@5
[3] call render param-assignment [ ]
to:main::@4
main::@4: scope:[main] from main::@3
[4] call addpoint param-assignment [ numpoints#1 ]
main::@4: scope:[main] from main::@1
[4] call animate param-assignment [ ]
to:main::@5
main::@5: scope:[main] from main::@4
[5] call addpoint param-assignment [ numpoints#1 ]
to:main::@6
main::@6: scope:[main] from main::@5
[6] call addpoint param-assignment [ numpoints#1 ]
to:main::@7
main::@7: scope:[main] from main::@6
[7] call addpoint param-assignment [ numpoints#1 ]
to:main::@8
main::@8: scope:[main] from main::@7
[8] call initscreen param-assignment [ numpoints#1 ]
to:main::@1
main::@1: scope:[main] from main::@11 main::@8
[9] call render param-assignment [ numpoints#1 ]
to:main::@10
main::@10: scope:[main] from main::@1
[10] call animate param-assignment [ numpoints#1 ]
to:main::@11
main::@11: scope:[main] from main::@10
[11] if(true) goto main::@1 [ numpoints#1 ]
[5] if(true) goto main::@1 [ ]
to:main::@return
main::@return: scope:[main] from main::@11
[12] return [ ]
main::@return: scope:[main] from main::@5
[6] return [ ]
to:@return
animate: scope:[animate] from main::@10
[13] (byte~) animate::$0 ← * (const byte[256]) XPOS#0+(byte) 0 [ animate::$0 ]
[14] (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 [ animate::$1 ]
[15] *((const byte[256]) XPOS#0+(byte) 0) ← (byte~) animate::$1 [ ]
[16] (byte~) animate::$2 ← * (const byte[256]) XPOS#0+(byte) 0 [ animate::$2 ]
[17] if((byte~) animate::$2!=(byte) 40) goto animate::@1 [ ]
animate: scope:[animate] from main::@4
[7] (byte~) animate::$0 ← * (const byte[]) XPOS#0+(byte) 0 [ animate::$0 ]
[8] (byte~) animate::$1 ← (byte~) animate::$0 + (byte) 1 [ animate::$1 ]
[9] *((const byte[]) XPOS#0+(byte) 0) ← (byte~) animate::$1 [ ]
[10] (byte~) animate::$2 ← * (const byte[]) XPOS#0+(byte) 0 [ animate::$2 ]
[11] if((byte~) animate::$2!=(byte) 40) goto animate::@1 [ ]
to:animate::@7
animate::@7: scope:[animate] from animate
[18] *((const byte[256]) XPOS#0+(byte) 0) ← (byte) 0 [ ]
[12] *((const byte[]) XPOS#0+(byte) 0) ← (byte) 0 [ ]
to:animate::@1
animate::@1: scope:[animate] from animate animate::@7
[19] (byte~) animate::$5 ← * (const byte[256]) YPOS#0+(byte) 0 [ animate::$5 ]
[20] (byte~) animate::$6 ← (byte~) animate::$5 + (byte) 1 [ animate::$6 ]
[21] *((const byte[256]) YPOS#0+(byte) 0) ← (byte~) animate::$6 [ ]
[22] (byte~) animate::$7 ← * (const byte[256]) YPOS#0+(byte) 0 [ animate::$7 ]
[23] if((byte~) animate::$7!=(byte) 25) goto animate::@2 [ ]
[13] (byte~) animate::$5 ← * (const byte[]) YPOS#0+(byte) 0 [ animate::$5 ]
[14] (byte~) animate::$6 ← (byte~) animate::$5 + (byte) 1 [ animate::$6 ]
[15] *((const byte[]) YPOS#0+(byte) 0) ← (byte~) animate::$6 [ ]
[16] (byte~) animate::$7 ← * (const byte[]) YPOS#0+(byte) 0 [ animate::$7 ]
[17] if((byte~) animate::$7!=(byte) 25) goto animate::@2 [ ]
to:animate::@8
animate::@8: scope:[animate] from animate::@1
[24] *((const byte[256]) YPOS#0+(byte) 0) ← (byte) 0 [ ]
[18] *((const byte[]) YPOS#0+(byte) 0) ← (byte) 0 [ ]
to:animate::@2
animate::@2: scope:[animate] from animate::@1 animate::@8
[25] (byte~) animate::$10 ← * (const byte[256]) XPOS#0+(byte) 1 [ animate::$10 ]
[26] (byte~) animate::$11 ← (byte~) animate::$10 - (byte) 1 [ animate::$11 ]
[27] *((const byte[256]) XPOS#0+(byte) 1) ← (byte~) animate::$11 [ ]
[28] (byte~) animate::$12 ← * (const byte[256]) XPOS#0+(byte) 1 [ animate::$12 ]
[29] if((byte~) animate::$12!=(byte) 255) goto animate::@3 [ ]
[19] (byte~) animate::$10 ← * (const byte[]) XPOS#0+(byte) 1 [ animate::$10 ]
[20] (byte~) animate::$11 ← (byte~) animate::$10 - (byte) 1 [ animate::$11 ]
[21] *((const byte[]) XPOS#0+(byte) 1) ← (byte~) animate::$11 [ ]
[22] (byte~) animate::$12 ← * (const byte[]) XPOS#0+(byte) 1 [ animate::$12 ]
[23] if((byte~) animate::$12!=(byte) 255) goto animate::@3 [ ]
to:animate::@9
animate::@9: scope:[animate] from animate::@2
[30] *((const byte[256]) XPOS#0+(byte) 1) ← (byte) 40 [ ]
[24] *((const byte[]) XPOS#0+(byte) 1) ← (byte) 40 [ ]
to:animate::@3
animate::@3: scope:[animate] from animate::@2 animate::@9
[31] (byte~) animate::$15 ← * (const byte[256]) YPOS#0+(byte) 2 [ animate::$15 ]
[32] (byte~) animate::$16 ← (byte~) animate::$15 + (byte) 1 [ animate::$16 ]
[33] *((const byte[256]) YPOS#0+(byte) 2) ← (byte~) animate::$16 [ ]
[34] (byte~) animate::$17 ← * (const byte[256]) YPOS#0+(byte) 2 [ animate::$17 ]
[35] if((byte~) animate::$17!=(byte) 25) goto animate::@4 [ ]
[25] (byte~) animate::$15 ← * (const byte[]) YPOS#0+(byte) 2 [ animate::$15 ]
[26] (byte~) animate::$16 ← (byte~) animate::$15 + (byte) 1 [ animate::$16 ]
[27] *((const byte[]) YPOS#0+(byte) 2) ← (byte~) animate::$16 [ ]
[28] (byte~) animate::$17 ← * (const byte[]) YPOS#0+(byte) 2 [ animate::$17 ]
[29] if((byte~) animate::$17!=(byte) 25) goto animate::@4 [ ]
to:animate::@10
animate::@10: scope:[animate] from animate::@3
[36] *((const byte[256]) YPOS#0+(byte) 2) ← (byte) 0 [ ]
[30] *((const byte[]) YPOS#0+(byte) 2) ← (byte) 0 [ ]
to:animate::@4
animate::@4: scope:[animate] from animate::@10 animate::@3
[37] (byte~) animate::$20 ← * (const byte[256]) YPOS#0+(byte) 3 [ animate::$20 ]
[38] (byte~) animate::$21 ← (byte~) animate::$20 - (byte) 1 [ animate::$21 ]
[39] *((const byte[256]) YPOS#0+(byte) 3) ← (byte~) animate::$21 [ ]
[40] (byte~) animate::$22 ← * (const byte[256]) YPOS#0+(byte) 3 [ animate::$22 ]
[41] if((byte~) animate::$22!=(byte) 255) goto animate::@return [ ]
[31] (byte~) animate::$20 ← * (const byte[]) YPOS#0+(byte) 3 [ animate::$20 ]
[32] (byte~) animate::$21 ← (byte~) animate::$20 - (byte) 1 [ animate::$21 ]
[33] *((const byte[]) YPOS#0+(byte) 3) ← (byte~) animate::$21 [ ]
[34] (byte~) animate::$22 ← * (const byte[]) YPOS#0+(byte) 3 [ animate::$22 ]
[35] if((byte~) animate::$22!=(byte) 255) goto animate::@return [ ]
to:animate::@11
animate::@11: scope:[animate] from animate::@4
[42] *((const byte[256]) YPOS#0+(byte) 3) ← (byte) 25 [ ]
[43] (byte~) animate::$25 ← * (const byte[256]) XPOS#0+(byte) 3 [ animate::$25 ]
[44] (byte~) animate::$26 ← (byte~) animate::$25 + (byte) 7 [ animate::$26 ]
[45] *((const byte[256]) XPOS#0+(byte) 3) ← (byte~) animate::$26 [ ]
[46] (byte~) animate::$27 ← * (const byte[256]) XPOS#0+(byte) 3 [ animate::$27 ]
[47] if((byte~) animate::$27<(byte) 40) goto animate::@return [ ]
[36] *((const byte[]) YPOS#0+(byte) 3) ← (byte) 25 [ ]
[37] (byte~) animate::$25 ← * (const byte[]) XPOS#0+(byte) 3 [ animate::$25 ]
[38] (byte~) animate::$26 ← (byte~) animate::$25 + (byte) 7 [ animate::$26 ]
[39] *((const byte[]) XPOS#0+(byte) 3) ← (byte~) animate::$26 [ ]
[40] (byte~) animate::$27 ← * (const byte[]) XPOS#0+(byte) 3 [ animate::$27 ]
[41] if((byte~) animate::$27<(byte) 40) goto animate::@return [ ]
to:animate::@12
animate::@12: scope:[animate] from animate::@11
[48] (byte~) animate::$30 ← * (const byte[256]) XPOS#0+(byte) 3 [ animate::$30 ]
[49] (byte~) animate::$31 ← (byte~) animate::$30 - (byte) 40 [ animate::$31 ]
[50] *((const byte[256]) XPOS#0+(byte) 3) ← (byte~) animate::$31 [ ]
[42] (byte~) animate::$30 ← * (const byte[]) XPOS#0+(byte) 3 [ animate::$30 ]
[43] (byte~) animate::$31 ← (byte~) animate::$30 - (byte) 40 [ animate::$31 ]
[44] *((const byte[]) XPOS#0+(byte) 3) ← (byte~) animate::$31 [ ]
to:animate::@return
animate::@return: scope:[animate] from animate::@11 animate::@12 animate::@4
[51] return [ ]
[45] return [ ]
to:@return
render: scope:[render] from main::@1
[52] phi() [ numpoints#1 ]
[46] phi() [ ]
to:render::@1
render::@1: scope:[render] from render render::@3
[53] (byte*) render::colline#2 ← phi( render/(const byte*) COLORS#0 render::@3/(byte*) render::colline#1 ) [ render::y#2 render::colline#2 numpoints#1 ]
[53] (byte) render::y#2 ← phi( render/(byte) 0 render::@3/(byte) render::y#1 ) [ render::y#2 render::colline#2 numpoints#1 ]
[47] (byte*) render::colline#2 ← phi( render/(const byte*) COLORS#0 render::@3/(byte*) render::colline#1 ) [ render::y#2 render::colline#2 ]
[47] (byte) render::y#2 ← phi( render/(byte) 0 render::@3/(byte) render::y#1 ) [ render::y#2 render::colline#2 ]
to:render::@2
render::@2: scope:[render] from render::@1 render::@5
[54] (byte) render::x#2 ← phi( render::@1/(byte) 0 render::@5/(byte) render::x#1 ) [ render::y#2 render::colline#2 render::x#2 numpoints#1 ]
[55] (byte) findcol::x#0 ← (byte) render::x#2 [ render::y#2 render::colline#2 render::x#2 findcol::x#0 numpoints#1 ]
[56] (byte) findcol::y#0 ← (byte) render::y#2 [ render::y#2 render::colline#2 render::x#2 findcol::x#0 findcol::y#0 numpoints#1 ]
[57] call findcol param-assignment [ render::y#2 render::colline#2 render::x#2 findcol::return#0 numpoints#1 ]
[48] (byte) render::x#2 ← phi( render::@1/(byte) 0 render::@5/(byte) render::x#1 ) [ render::y#2 render::colline#2 render::x#2 ]
[49] (byte) findcol::x#0 ← (byte) render::x#2 [ render::y#2 render::colline#2 render::x#2 findcol::x#0 ]
[50] (byte) findcol::y#0 ← (byte) render::y#2 [ render::y#2 render::colline#2 render::x#2 findcol::x#0 findcol::y#0 ]
[51] call findcol param-assignment [ render::y#2 render::colline#2 render::x#2 findcol::return#0 ]
to:render::@5
render::@5: scope:[render] from render::@2
[58] (byte) render::col#0 ← (byte) findcol::return#0 [ render::y#2 render::colline#2 render::x#2 render::col#0 numpoints#1 ]
[59] *((byte*) render::colline#2 + (byte) render::x#2) ← (byte) render::col#0 [ render::y#2 render::colline#2 render::x#2 numpoints#1 ]
[60] (byte) render::x#1 ← ++ (byte) render::x#2 [ render::y#2 render::colline#2 render::x#1 numpoints#1 ]
[61] if((byte) render::x#1!=(byte) 40) goto render::@2 [ render::y#2 render::colline#2 render::x#1 numpoints#1 ]
[52] (byte) render::col#0 ← (byte) findcol::return#0 [ render::y#2 render::colline#2 render::x#2 render::col#0 ]
[53] *((byte*) render::colline#2 + (byte) render::x#2) ← (byte) render::col#0 [ render::y#2 render::colline#2 render::x#2 ]
[54] (byte) render::x#1 ← ++ (byte) render::x#2 [ render::y#2 render::colline#2 render::x#1 ]
[55] if((byte) render::x#1!=(byte) 40) goto render::@2 [ render::y#2 render::colline#2 render::x#1 ]
to:render::@3
render::@3: scope:[render] from render::@5
[62] (byte*) render::colline#1 ← (byte*) render::colline#2 + (byte) 40 [ render::y#2 render::colline#1 numpoints#1 ]
[63] (byte) render::y#1 ← ++ (byte) render::y#2 [ render::y#1 render::colline#1 numpoints#1 ]
[64] if((byte) render::y#1!=(byte) 25) goto render::@1 [ render::y#1 render::colline#1 numpoints#1 ]
[56] (byte*) render::colline#1 ← (byte*) render::colline#2 + (byte) 40 [ render::y#2 render::colline#1 ]
[57] (byte) render::y#1 ← ++ (byte) render::y#2 [ render::y#1 render::colline#1 ]
[58] if((byte) render::y#1!=(byte) 25) goto render::@1 [ render::y#1 render::colline#1 ]
to:render::@return
render::@return: scope:[render] from render::@3
[65] return [ numpoints#1 ]
[59] return [ ]
to:@return
findcol: scope:[findcol] from render::@2
[66] phi() [ findcol::x#0 findcol::y#0 numpoints#1 ]
[60] phi() [ findcol::x#0 findcol::y#0 ]
to:findcol::@1
findcol::@1: scope:[findcol] from findcol findcol::@19
[67] (byte) findcol::mincol#11 ← phi( findcol/(byte) 0 findcol::@19/(byte) findcol::mincol#2 ) [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ]
[67] (byte) findcol::mindiff#10 ← phi( findcol/(byte) 255 findcol::@19/(byte~) findcol::mindiff#13 ) [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ]
[67] (byte) findcol::i#12 ← phi( findcol/(byte) 0 findcol::@19/(byte) findcol::i#1 ) [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 numpoints#1 ]
[68] (byte) findcol::xp#0 ← (const byte[256]) XPOS#0 *idx (byte) findcol::i#12 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::xp#0 numpoints#1 ]
[69] (byte) findcol::yp#0 ← (const byte[256]) YPOS#0 *idx (byte) findcol::i#12 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::xp#0 findcol::yp#0 numpoints#1 ]
[70] if((byte) findcol::x#0!=(byte) findcol::xp#0) goto findcol::@2 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::xp#0 findcol::yp#0 numpoints#1 ]
[61] (byte) findcol::mincol#11 ← phi( findcol/(byte) 0 findcol::@19/(byte) findcol::mincol#2 ) [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 ]
[61] (byte) findcol::mindiff#10 ← phi( findcol/(byte) 255 findcol::@19/(byte~) findcol::mindiff#13 ) [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 ]
[61] (byte) findcol::i#12 ← phi( findcol/(byte) 0 findcol::@19/(byte) findcol::i#1 ) [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 ]
[62] (byte) findcol::xp#0 ← (const byte[]) XPOS#0 *idx (byte) findcol::i#12 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::xp#0 ]
[63] (byte) findcol::yp#0 ← (const byte[]) YPOS#0 *idx (byte) findcol::i#12 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::xp#0 findcol::yp#0 ]
[64] if((byte) findcol::x#0!=(byte) findcol::xp#0) goto findcol::@2 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::xp#0 findcol::yp#0 ]
to:findcol::@9
findcol::@9: scope:[findcol] from findcol::@1
[71] if((byte) findcol::y#0!=(byte) findcol::yp#0) goto findcol::@2 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::xp#0 findcol::yp#0 numpoints#1 ]
[65] if((byte) findcol::y#0!=(byte) findcol::yp#0) goto findcol::@2 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::xp#0 findcol::yp#0 ]
to:findcol::@return
findcol::@return: scope:[findcol] from findcol::@8 findcol::@9
[72] (byte) findcol::return#0 ← phi( findcol::@9/(byte) 0 findcol::@8/(byte) findcol::mincol#2 ) [ findcol::return#0 numpoints#1 ]
[73] return [ findcol::return#0 numpoints#1 ]
[66] (byte) findcol::return#0 ← phi( findcol::@9/(byte) 0 findcol::@8/(byte) findcol::mincol#2 ) [ findcol::return#0 ]
[67] return [ findcol::return#0 ]
to:@return
findcol::@2: scope:[findcol] from findcol::@1 findcol::@9
[74] if((byte) findcol::x#0>=(byte) findcol::xp#0) goto findcol::@4 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::xp#0 findcol::yp#0 numpoints#1 ]
[68] if((byte) findcol::x#0>=(byte) findcol::xp#0) goto findcol::@4 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::xp#0 findcol::yp#0 ]
to:findcol::@12
findcol::@12: scope:[findcol] from findcol::@2
[75] (byte) findcol::diff#1 ← (byte) findcol::xp#0 - (byte) findcol::x#0 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::yp#0 findcol::diff#1 numpoints#1 ]
[69] (byte) findcol::diff#1 ← (byte) findcol::xp#0 - (byte) findcol::x#0 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::yp#0 findcol::diff#1 ]
to:findcol::@5
findcol::@5: scope:[findcol] from findcol::@12 findcol::@4
[76] (byte) findcol::diff#4 ← phi( findcol::@12/(byte) findcol::diff#1 findcol::@4/(byte) findcol::diff#0 ) [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::yp#0 findcol::diff#4 numpoints#1 ]
[77] if((byte) findcol::y#0>=(byte) findcol::yp#0) goto findcol::@6 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::yp#0 findcol::diff#4 numpoints#1 ]
[70] (byte) findcol::diff#4 ← phi( findcol::@12/(byte) findcol::diff#1 findcol::@4/(byte) findcol::diff#0 ) [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::yp#0 findcol::diff#4 ]
[71] if((byte) findcol::y#0>=(byte) findcol::yp#0) goto findcol::@6 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::yp#0 findcol::diff#4 ]
to:findcol::@14
findcol::@14: scope:[findcol] from findcol::@5
[78] (byte~) findcol::$12 ← (byte) findcol::yp#0 - (byte) findcol::y#0 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::diff#4 findcol::$12 numpoints#1 ]
[79] (byte) findcol::diff#3 ← (byte) findcol::diff#4 + (byte~) findcol::$12 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::diff#3 numpoints#1 ]
[72] (byte~) findcol::$12 ← (byte) findcol::yp#0 - (byte) findcol::y#0 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::diff#4 findcol::$12 ]
[73] (byte) findcol::diff#3 ← (byte) findcol::diff#4 + (byte~) findcol::$12 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::diff#3 ]
to:findcol::@7
findcol::@7: scope:[findcol] from findcol::@14 findcol::@6
[80] (byte) findcol::diff#6 ← phi( findcol::@14/(byte) findcol::diff#3 findcol::@6/(byte) findcol::diff#2 ) [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::diff#6 numpoints#1 ]
[81] if((byte) findcol::diff#6>=(byte) findcol::mindiff#10) goto findcol::@21 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::diff#6 numpoints#1 ]
[74] (byte) findcol::diff#6 ← phi( findcol::@14/(byte) findcol::diff#3 findcol::@6/(byte) findcol::diff#2 ) [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::diff#6 ]
[75] if((byte) findcol::diff#6>=(byte) findcol::mindiff#10) goto findcol::@21 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::diff#6 ]
to:findcol::@16
findcol::@16: scope:[findcol] from findcol::@7
[82] (byte) findcol::mincol#1 ← (const byte[256]) COLS#0 *idx (byte) findcol::i#12 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::diff#6 findcol::mincol#1 numpoints#1 ]
[76] (byte) findcol::mincol#1 ← (const byte[]) COLS#0 *idx (byte) findcol::i#12 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::diff#6 findcol::mincol#1 ]
to:findcol::@8
findcol::@8: scope:[findcol] from findcol::@16 findcol::@21
[83] (byte) findcol::mindiff#11 ← phi( findcol::@16/(byte) findcol::diff#6 findcol::@21/(byte~) findcol::mindiff#14 ) [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mincol#2 findcol::mindiff#11 numpoints#1 ]
[83] (byte) findcol::mincol#2 ← phi( findcol::@16/(byte) findcol::mincol#1 findcol::@21/(byte) findcol::mincol#11 ) [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mincol#2 findcol::mindiff#11 numpoints#1 ]
[84] (byte) findcol::i#1 ← ++ (byte) findcol::i#12 [ findcol::x#0 findcol::y#0 findcol::i#1 findcol::mincol#2 findcol::mindiff#11 numpoints#1 ]
[85] if((byte) findcol::i#1<(byte) numpoints#1) goto findcol::@19 [ findcol::x#0 findcol::y#0 findcol::i#1 findcol::mincol#2 findcol::mindiff#11 numpoints#1 ]
[77] (byte) findcol::mindiff#11 ← phi( findcol::@16/(byte) findcol::diff#6 findcol::@21/(byte~) findcol::mindiff#14 ) [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mincol#2 findcol::mindiff#11 ]
[77] (byte) findcol::mincol#2 ← phi( findcol::@16/(byte) findcol::mincol#1 findcol::@21/(byte) findcol::mincol#11 ) [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mincol#2 findcol::mindiff#11 ]
[78] (byte) findcol::i#1 ← ++ (byte) findcol::i#12 [ findcol::x#0 findcol::y#0 findcol::i#1 findcol::mincol#2 findcol::mindiff#11 ]
[79] if((byte) findcol::i#1<(const byte) numpoints#0) goto findcol::@19 [ findcol::x#0 findcol::y#0 findcol::i#1 findcol::mincol#2 findcol::mindiff#11 ]
to:findcol::@return
findcol::@19: scope:[findcol] from findcol::@8
[86] (byte~) findcol::mindiff#13 ← (byte) findcol::mindiff#11 [ findcol::x#0 findcol::y#0 findcol::i#1 findcol::mindiff#13 findcol::mincol#2 numpoints#1 ]
[80] (byte~) findcol::mindiff#13 ← (byte) findcol::mindiff#11 [ findcol::x#0 findcol::y#0 findcol::i#1 findcol::mindiff#13 findcol::mincol#2 ]
to:findcol::@1
findcol::@21: scope:[findcol] from findcol::@7
[87] (byte~) findcol::mindiff#14 ← (byte) findcol::mindiff#10 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mincol#11 findcol::mindiff#14 numpoints#1 ]
[81] (byte~) findcol::mindiff#14 ← (byte) findcol::mindiff#10 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mincol#11 findcol::mindiff#14 ]
to:findcol::@8
findcol::@6: scope:[findcol] from findcol::@5
[88] (byte~) findcol::$14 ← (byte) findcol::y#0 - (byte) findcol::yp#0 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::diff#4 numpoints#1 findcol::$14 ]
[89] (byte) findcol::diff#2 ← (byte) findcol::diff#4 + (byte~) findcol::$14 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::diff#2 numpoints#1 ]
[82] (byte~) findcol::$14 ← (byte) findcol::y#0 - (byte) findcol::yp#0 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::diff#4 findcol::$14 ]
[83] (byte) findcol::diff#2 ← (byte) findcol::diff#4 + (byte~) findcol::$14 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::diff#2 ]
to:findcol::@7
findcol::@4: scope:[findcol] from findcol::@2
[90] (byte) findcol::diff#0 ← (byte) findcol::x#0 - (byte) findcol::xp#0 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::yp#0 findcol::diff#0 numpoints#1 ]
[84] (byte) findcol::diff#0 ← (byte) findcol::x#0 - (byte) findcol::xp#0 [ findcol::x#0 findcol::y#0 findcol::i#12 findcol::mindiff#10 findcol::mincol#11 findcol::yp#0 findcol::diff#0 ]
to:findcol::@5
initscreen: scope:[initscreen] from main::@8
[91] phi() [ ]
initscreen: scope:[initscreen] from main
[85] phi() [ ]
to:initscreen::@1
initscreen::@1: scope:[initscreen] from initscreen initscreen::@1
[92] (byte*) initscreen::screen#2 ← phi( initscreen/(const byte*) SCREEN#0 initscreen::@1/(byte*) initscreen::screen#1 ) [ initscreen::screen#2 ]
[93] *((byte*) initscreen::screen#2) ← (const byte) FILL#0 [ initscreen::screen#2 ]
[94] (byte*) initscreen::screen#1 ← ++ (byte*) initscreen::screen#2 [ initscreen::screen#1 ]
[95] if((byte*) initscreen::screen#1<(const byte*) SCREEN#0+(word) 1000) goto initscreen::@1 [ initscreen::screen#1 ]
[86] (byte*) initscreen::screen#2 ← phi( initscreen/(const byte*) SCREEN#0 initscreen::@1/(byte*) initscreen::screen#1 ) [ initscreen::screen#2 ]
[87] *((byte*) initscreen::screen#2) ← (const byte) FILL#0 [ initscreen::screen#2 ]
[88] (byte*) initscreen::screen#1 ← ++ (byte*) initscreen::screen#2 [ initscreen::screen#1 ]
[89] if((byte*) initscreen::screen#1<(const byte*) SCREEN#0+(word) 1000) goto initscreen::@1 [ initscreen::screen#1 ]
to:initscreen::@return
initscreen::@return: scope:[initscreen] from initscreen::@1
[96] return [ ]
to:@return
addpoint: scope:[addpoint] from main main::@3 main::@4 main::@5 main::@6 main::@7
[97] (byte) addpoint::c#6 ← phi( main/(byte) 1 main::@3/(byte) 2 main::@4/(byte) 3 main::@5/(byte) 4 main::@6/(byte) 5 main::@7/(byte) 7 ) [ addpoint::x#6 numpoints#19 addpoint::y#6 addpoint::c#6 ]
[97] (byte) addpoint::y#6 ← phi( main/(byte) 5 main::@3/(byte) 8 main::@4/(byte) 14 main::@5/(byte) 2 main::@6/(byte) 17 main::@7/(byte) 22 ) [ addpoint::x#6 numpoints#19 addpoint::y#6 addpoint::c#6 ]
[97] (byte) numpoints#19 ← phi( main/(byte) 0 main::@3/(byte) numpoints#1 main::@4/(byte) numpoints#1 main::@5/(byte) numpoints#1 main::@6/(byte) numpoints#1 main::@7/(byte) numpoints#1 ) [ addpoint::x#6 numpoints#19 addpoint::y#6 addpoint::c#6 ]
[97] (byte) addpoint::x#6 ← phi( main/(byte) 5 main::@3/(byte) 15 main::@4/(byte) 6 main::@5/(byte) 34 main::@6/(byte) 21 main::@7/(byte) 31 ) [ addpoint::x#6 numpoints#19 addpoint::y#6 addpoint::c#6 ]
[98] *((const byte[256]) XPOS#0 + (byte) numpoints#19) ← (byte) addpoint::x#6 [ numpoints#19 addpoint::y#6 addpoint::c#6 ]
[99] *((const byte[256]) YPOS#0 + (byte) numpoints#19) ← (byte) addpoint::y#6 [ numpoints#19 addpoint::c#6 ]
[100] *((const byte[256]) COLS#0 + (byte) numpoints#19) ← (byte) addpoint::c#6 [ numpoints#19 ]
[101] (byte) numpoints#1 ← ++ (byte) numpoints#19 [ numpoints#1 ]
to:addpoint::@return
addpoint::@return: scope:[addpoint] from addpoint
[102] return [ numpoints#1 ]
[90] return [ ]
to:@return

File diff suppressed because it is too large Load Diff

View File

@ -2,24 +2,16 @@
(label) @end
(byte*) COLORS
(const byte*) COLORS#0 COLORS = (word) 55296
(byte[256]) COLS
(const byte[256]) COLS#0 COLS = (word) 4608
(byte[]) COLS
(const byte[]) COLS#0 COLS = { (byte) 1, (byte) 2, (byte) 3, (byte) 4, (byte) 5, (byte) 7 }
(byte) FILL
(const byte) FILL#0 FILL = (byte) 230
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = (word) 1024
(byte[256]) XPOS
(const byte[256]) XPOS#0 XPOS = (word) 4096
(byte[256]) YPOS
(const byte[256]) YPOS#0 YPOS = (word) 4352
(void()) addpoint((byte) addpoint::x , (byte) addpoint::y , (byte) addpoint::c)
(label) addpoint::@return
(byte) addpoint::c
(byte) addpoint::c#6 c zp ZP_BYTE:2 0.6666666666666666
(byte) addpoint::x
(byte) addpoint::x#6 reg byte a 2.0
(byte) addpoint::y
(byte) addpoint::y#6 reg byte y 1.0
(byte[]) XPOS
(const byte[]) XPOS#0 XPOS = { (byte) 5, (byte) 15, (byte) 6, (byte) 34, (byte) 21, (byte) 31 }
(byte[]) YPOS
(const byte[]) YPOS#0 YPOS = { (byte) 5, (byte) 8, (byte) 14, (byte) 2, (byte) 17, (byte) 22 }
(void()) animate()
(byte~) animate::$0 reg byte a 4.0
(byte~) animate::$1 reg byte a 4.0
@ -91,13 +83,13 @@
(byte) findcol::return
(byte) findcol::return#0 reg byte y 3667.333333333333
(byte) findcol::x
(byte) findcol::x#0 x zp ZP_BYTE:9 1640.2
(byte) findcol::x#0 x zp ZP_BYTE:8 1640.2
(byte) findcol::xp
(byte) findcol::xp#0 xp zp ZP_BYTE:7 10001.0
(byte) findcol::y
(byte) findcol::y#0 y zp ZP_BYTE:10 1708.5416666666665
(byte) findcol::y#0 y zp ZP_BYTE:9 1708.5416666666665
(byte) findcol::yp
(byte) findcol::yp#0 yp zp ZP_BYTE:11 6250.625
(byte) findcol::yp#0 yp zp ZP_BYTE:10 6250.625
(void()) initscreen()
(label) initscreen::@1
(label) initscreen::@return
@ -106,18 +98,11 @@
(byte*) initscreen::screen#2 screen zp ZP_PTR_BYTE:3 16.5
(void()) main()
(label) main::@1
(label) main::@10
(label) main::@11
(label) main::@3
(label) main::@4
(label) main::@5
(label) main::@6
(label) main::@7
(label) main::@8
(label) main::@return
(byte) numpoints
(byte) numpoints#1 numpoints zp ZP_BYTE:8 200.25999999999996
(byte) numpoints#19 numpoints zp ZP_BYTE:8 4.5
(const byte) numpoints#0 numpoints = (byte) 6
(void()) render()
(label) render::@1
(label) render::@2
@ -136,7 +121,7 @@
(byte) render::y#1 y zp ZP_BYTE:2 151.5
(byte) render::y#2 y zp ZP_BYTE:2 120.29999999999998
zp ZP_BYTE:2 [ render::y#2 render::y#1 addpoint::c#6 ]
zp ZP_BYTE:2 [ render::y#2 render::y#1 ]
zp ZP_PTR_BYTE:3 [ render::colline#2 render::colline#1 initscreen::screen#2 initscreen::screen#1 ]
zp ZP_BYTE:5 [ render::x#2 render::x#1 ]
reg byte x [ findcol::i#12 findcol::i#1 ]
@ -144,9 +129,6 @@ zp ZP_BYTE:6 [ findcol::mindiff#10 findcol::mindiff#13 ]
reg byte y [ findcol::return#0 findcol::mincol#11 findcol::mincol#2 findcol::mincol#1 ]
zp ZP_BYTE:7 [ findcol::diff#4 findcol::diff#1 findcol::diff#0 findcol::xp#0 ]
reg byte a [ findcol::mindiff#11 findcol::diff#6 findcol::diff#3 findcol::diff#2 findcol::mindiff#14 ]
reg byte a [ addpoint::x#6 ]
zp ZP_BYTE:8 [ numpoints#19 numpoints#1 ]
reg byte y [ addpoint::y#6 ]
reg byte a [ animate::$0 ]
reg byte a [ animate::$1 ]
reg byte a [ animate::$2 ]
@ -167,9 +149,9 @@ reg byte a [ animate::$26 ]
reg byte a [ animate::$27 ]
reg byte a [ animate::$30 ]
reg byte a [ animate::$31 ]
zp ZP_BYTE:9 [ findcol::x#0 ]
zp ZP_BYTE:10 [ findcol::y#0 ]
zp ZP_BYTE:8 [ findcol::x#0 ]
zp ZP_BYTE:9 [ findcol::y#0 ]
reg byte a [ render::col#0 ]
zp ZP_BYTE:11 [ findcol::yp#0 ]
zp ZP_BYTE:10 [ findcol::yp#0 ]
reg byte a [ findcol::$12 ]
reg byte a [ findcol::$14 ]

View File

@ -24,7 +24,7 @@ void main() {
}
// Render next char
byte c = *nxt;
if(c==0) {
if(c=='@') {
nxt = TEXT;
c = *nxt;
}

View File

@ -5,22 +5,16 @@ byte *COLORS = $D800;
byte FILL = 230;
// The total number of voronoi points
byte numpoints = 0;
byte numpoints = 6;
// Points to create the Voronoi from
byte[$100] XPOS = $1000;
byte[$100] YPOS = $1100;
byte[$100] COLS = $1200;
byte[] XPOS = {5, 15, 6, 34, 21 ,31};
byte[] YPOS = {5, 8, 14, 2, 17, 22};
byte[] COLS = {1, 2, 3, 4, 5, 7};
main();
void main() {
addpoint(5, 5, 1);
addpoint(15, 8, 2);
addpoint(6, 14, 3);
addpoint(34, 2, 4);
addpoint(21, 17, 5);
addpoint(31, 22, 7);
initscreen();
do {
render();
@ -55,13 +49,6 @@ void animate() {
}
}
void addpoint(byte x, byte y, byte c) {
XPOS[numpoints] = x;
YPOS[numpoints] = y;
COLS[numpoints] = c;
numpoints++;
}
void initscreen() {
for( byte* screen = SCREEN; screen<SCREEN+$03e8; ++screen) {
*screen = FILL;