diff --git a/src/dk/camelot64/kickc/asm/AsmFragment.java b/src/dk/camelot64/kickc/asm/AsmFragment.java
index c1f0aa66f..3df80db4f 100644
--- a/src/dk/camelot64/kickc/asm/AsmFragment.java
+++ b/src/dk/camelot64/kickc/asm/AsmFragment.java
@@ -32,7 +32,7 @@ public class AsmFragment {
*/
private String signature;
- public AsmFragment(StatementConditionalJump conditionalJump, SymbolTable symbols) {
+ public AsmFragment(StatementConditionalJump conditionalJump, SymbolTable symbols, ControlFlowGraph graph, ControlFlowBlock block) {
this.bindings = new HashMap<>();
this.symbols = symbols;
StringBuilder signature = new StringBuilder();
@@ -48,7 +48,13 @@ public class AsmFragment {
signature.append(bind(conditionalJump.getRValue2()));
}
signature.append("_then_");
- signature.append(bind(conditionalJump.getDestination()));
+ Label destination = conditionalJump.getDestination();
+ ControlFlowBlock destinationBlock = graph.getBlock(destination);
+ String destinationLabel = destination.getName();
+ if(destinationBlock.hasPhiStatements()) {
+ destinationLabel = destination.getName()+"_from_"+block.getLabel().getName();
+ }
+ signature.append(bind(new Label(destinationLabel, false)));
setSignature(signature.toString());
}
@@ -172,6 +178,10 @@ public class AsmFragment {
String name = "xby";
bindings.put(name, value);
return name;
+ } else if (RegisterAllocation.RegisterType.REG_Y_BYTE.equals(register.getType())) {
+ String name = "yby";
+ bindings.put(name, value);
+ return name;
} else {
throw new RuntimeException("Binding of register type not supported " + register.getType());
}
diff --git a/src/dk/camelot64/kickc/asm/fragment/xby_neq_0_then_la1.asm b/src/dk/camelot64/kickc/asm/fragment/xby_neq_0_then_la1.asm
new file mode 100644
index 000000000..0f99f0508
--- /dev/null
+++ b/src/dk/camelot64/kickc/asm/fragment/xby_neq_0_then_la1.asm
@@ -0,0 +1,2 @@
+cpx #0
+bne {la1}
\ No newline at end of file
diff --git a/src/dk/camelot64/kickc/asm/fragment/yby=coby1.asm b/src/dk/camelot64/kickc/asm/fragment/yby=coby1.asm
new file mode 100644
index 000000000..c9907eace
--- /dev/null
+++ b/src/dk/camelot64/kickc/asm/fragment/yby=coby1.asm
@@ -0,0 +1 @@
+ldy #{coby1}
\ No newline at end of file
diff --git a/src/dk/camelot64/kickc/asm/fragment/yby=zpby1.asm b/src/dk/camelot64/kickc/asm/fragment/yby=zpby1.asm
new file mode 100644
index 000000000..cc9e7b012
--- /dev/null
+++ b/src/dk/camelot64/kickc/asm/fragment/yby=zpby1.asm
@@ -0,0 +1 @@
+ldy {zpby1}
\ No newline at end of file
diff --git a/src/dk/camelot64/kickc/asm/fragment/zpby1=yby_plus_zpby2.asm b/src/dk/camelot64/kickc/asm/fragment/zpby1=yby_plus_zpby2.asm
new file mode 100644
index 000000000..56a5f591f
--- /dev/null
+++ b/src/dk/camelot64/kickc/asm/fragment/zpby1=yby_plus_zpby2.asm
@@ -0,0 +1,4 @@
+tya
+clc
+adc {zpby2}
+sta {zpby1}
\ No newline at end of file
diff --git a/src/dk/camelot64/kickc/icl/ControlFlowBlock.java b/src/dk/camelot64/kickc/icl/ControlFlowBlock.java
index 07beaf984..12d411846 100644
--- a/src/dk/camelot64/kickc/icl/ControlFlowBlock.java
+++ b/src/dk/camelot64/kickc/icl/ControlFlowBlock.java
@@ -104,4 +104,12 @@ public class ControlFlowBlock {
return label.hashCode();
}
+ public boolean hasPhiStatements() {
+ if(statements.size()>0) {
+ if(statements.get(0) instanceof StatementPhi) {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/src/dk/camelot64/kickc/icl/Pass1GenerateStatementSequence.java b/src/dk/camelot64/kickc/icl/Pass1GenerateStatementSequence.java
index 41bc59f0e..5de45ba40 100644
--- a/src/dk/camelot64/kickc/icl/Pass1GenerateStatementSequence.java
+++ b/src/dk/camelot64/kickc/icl/Pass1GenerateStatementSequence.java
@@ -97,6 +97,18 @@ public class Pass1GenerateStatementSequence extends KickCBaseVisitor The default implementation does nothing. The default implementation does nothing. The default implementation does nothing.
The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.
+ */ + @Override public T visitStmtDoWhile(KickCParser.StmtDoWhileContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/src/dk/camelot64/kickc/parser/KickCLexer.java b/src/dk/camelot64/kickc/parser/KickCLexer.java index 57d8252cc..ffa71b9e2 100644 --- a/src/dk/camelot64/kickc/parser/KickCLexer.java +++ b/src/dk/camelot64/kickc/parser/KickCLexer.java @@ -20,9 +20,9 @@ public class KickCLexer extends Lexer { T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9, T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, T__14=15, T__15=16, T__16=17, 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, TYPE=29, STRING=30, BOOLEAN=31, - NUMBER=32, NUMFLOAT=33, BINFLOAT=34, DECFLOAT=35, HEXFLOAT=36, NUMINT=37, - BININTEGER=38, DECINTEGER=39, HEXINTEGER=40, NAME=41, WS=42; + T__24=25, T__25=26, T__26=27, T__27=28, T__28=29, TYPE=30, STRING=31, + BOOLEAN=32, NUMBER=33, NUMFLOAT=34, BINFLOAT=35, DECFLOAT=36, HEXFLOAT=37, + NUMINT=38, BININTEGER=39, DECINTEGER=40, HEXINTEGER=41, NAME=42, WS=43; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; @@ -35,23 +35,24 @@ public class KickCLexer extends Lexer { "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8", "T__9", "T__10", "T__11", "T__12", "T__13", "T__14", "T__15", "T__16", "T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24", - "T__25", "T__26", "T__27", "TYPE", "STRING", "BOOLEAN", "NUMBER", "NUMFLOAT", - "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", - "HEXINTEGER", "BINDIGIT", "DECDIGIT", "HEXDIGIT", "NAME", "NAME_START", - "NAME_CHAR", "WS" + "T__25", "T__26", "T__27", "T__28", "TYPE", "STRING", "BOOLEAN", "NUMBER", + "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", + "DECINTEGER", "HEXINTEGER", "BINDIGIT", "DECDIGIT", "HEXDIGIT", "NAME", + "NAME_START", "NAME_CHAR", "WS" }; private static final String[] _LITERAL_NAMES = { null, "'{'", "'}'", "'='", "';'", "'if'", "'('", "')'", "'else'", "'while'", - "'+'", "'-'", "'not'", "'!'", "'*'", "'/'", "'=='", "'!='", "'<>'", "'<'", - "'<='", "'=<'", "'>='", "'=>'", "'>'", "'and'", "'&&'", "'or'", "'||'" + "'do'", "'+'", "'-'", "'not'", "'!'", "'*'", "'/'", "'=='", "'!='", "'<>'", + "'<'", "'<='", "'=<'", "'>='", "'=>'", "'>'", "'and'", "'&&'", "'or'", + "'||'" }; private static final String[] _SYMBOLIC_NAMES = { 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, "TYPE", "STRING", "BOOLEAN", "NUMBER", "NUMFLOAT", - "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", - "HEXINTEGER", "NAME", "WS" + null, null, null, null, null, null, "TYPE", "STRING", "BOOLEAN", "NUMBER", + "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", + "DECINTEGER", "HEXINTEGER", "NAME", "WS" }; public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); @@ -111,121 +112,123 @@ 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,\u0154\b\1\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2-\u0159\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"+ "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\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.\t.\4/\t/\4\60\t\60\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3"+ - "\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\13"+ - "\3\13\3\f\3\f\3\r\3\r\3\r\3\r\3\16\3\16\3\17\3\17\3\20\3\20\3\21\3\21"+ - "\3\21\3\22\3\22\3\22\3\23\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\27\3\30\3\30\3\30\3\31\3\31\3\32\3\32\3\32\3\32\3\33"+ - "\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36"+ - "\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36"+ - "\3\36\5\36\u00c5\n\36\3\37\3\37\3\37\3\37\7\37\u00cb\n\37\f\37\16\37\u00ce"+ - "\13\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \5 \u00db\n \3!\3!\5!\u00df"+ - "\n!\3\"\3\"\3\"\5\"\u00e4\n\"\3#\3#\3#\3#\3#\5#\u00eb\n#\3#\7#\u00ee\n"+ - "#\f#\16#\u00f1\13#\3#\3#\6#\u00f5\n#\r#\16#\u00f6\3$\7$\u00fa\n$\f$\16"+ - "$\u00fd\13$\3$\3$\6$\u0101\n$\r$\16$\u0102\3%\3%\3%\3%\3%\5%\u010a\n%"+ - "\3%\7%\u010d\n%\f%\16%\u0110\13%\3%\3%\6%\u0114\n%\r%\16%\u0115\3&\3&"+ - "\3&\5&\u011b\n&\3\'\3\'\3\'\6\'\u0120\n\'\r\'\16\'\u0121\3\'\3\'\6\'\u0126"+ - "\n\'\r\'\16\'\u0127\5\'\u012a\n\'\3(\6(\u012d\n(\r(\16(\u012e\3)\3)\3"+ - ")\3)\3)\5)\u0136\n)\3)\6)\u0139\n)\r)\16)\u013a\3*\3*\3+\3+\3,\3,\3-\3"+ - "-\7-\u0145\n-\f-\16-\u0148\13-\3.\3.\3/\3/\3\60\6\60\u014f\n\60\r\60\16"+ - "\60\u0150\3\60\3\60\2\2\61\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\2U\2W\2Y+[\2]\2_,"+ - "\3\2\n\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\"\"\2\u016c\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\2"+ - "O\3\2\2\2\2Q\3\2\2\2\2Y\3\2\2\2\2_\3\2\2\2\3a\3\2\2\2\5c\3\2\2\2\7e\3"+ - "\2\2\2\tg\3\2\2\2\13i\3\2\2\2\rl\3\2\2\2\17n\3\2\2\2\21p\3\2\2\2\23u\3"+ - "\2\2\2\25{\3\2\2\2\27}\3\2\2\2\31\177\3\2\2\2\33\u0083\3\2\2\2\35\u0085"+ - "\3\2\2\2\37\u0087\3\2\2\2!\u0089\3\2\2\2#\u008c\3\2\2\2%\u008f\3\2\2\2"+ - "\'\u0092\3\2\2\2)\u0094\3\2\2\2+\u0097\3\2\2\2-\u009a\3\2\2\2/\u009d\3"+ - "\2\2\2\61\u00a0\3\2\2\2\63\u00a2\3\2\2\2\65\u00a6\3\2\2\2\67\u00a9\3\2"+ - "\2\29\u00ac\3\2\2\2;\u00c4\3\2\2\2=\u00c6\3\2\2\2?\u00da\3\2\2\2A\u00de"+ - "\3\2\2\2C\u00e3\3\2\2\2E\u00ea\3\2\2\2G\u00fb\3\2\2\2I\u0109\3\2\2\2K"+ - "\u011a\3\2\2\2M\u0129\3\2\2\2O\u012c\3\2\2\2Q\u0135\3\2\2\2S\u013c\3\2"+ - "\2\2U\u013e\3\2\2\2W\u0140\3\2\2\2Y\u0142\3\2\2\2[\u0149\3\2\2\2]\u014b"+ - "\3\2\2\2_\u014e\3\2\2\2ab\7}\2\2b\4\3\2\2\2cd\7\177\2\2d\6\3\2\2\2ef\7"+ - "?\2\2f\b\3\2\2\2gh\7=\2\2h\n\3\2\2\2ij\7k\2\2jk\7h\2\2k\f\3\2\2\2lm\7"+ - "*\2\2m\16\3\2\2\2no\7+\2\2o\20\3\2\2\2pq\7g\2\2qr\7n\2\2rs\7u\2\2st\7"+ - "g\2\2t\22\3\2\2\2uv\7y\2\2vw\7j\2\2wx\7k\2\2xy\7n\2\2yz\7g\2\2z\24\3\2"+ - "\2\2{|\7-\2\2|\26\3\2\2\2}~\7/\2\2~\30\3\2\2\2\177\u0080\7p\2\2\u0080"+ - "\u0081\7q\2\2\u0081\u0082\7v\2\2\u0082\32\3\2\2\2\u0083\u0084\7#\2\2\u0084"+ - "\34\3\2\2\2\u0085\u0086\7,\2\2\u0086\36\3\2\2\2\u0087\u0088\7\61\2\2\u0088"+ - " \3\2\2\2\u0089\u008a\7?\2\2\u008a\u008b\7?\2\2\u008b\"\3\2\2\2\u008c"+ - "\u008d\7#\2\2\u008d\u008e\7?\2\2\u008e$\3\2\2\2\u008f\u0090\7>\2\2\u0090"+ - "\u0091\7@\2\2\u0091&\3\2\2\2\u0092\u0093\7>\2\2\u0093(\3\2\2\2\u0094\u0095"+ - "\7>\2\2\u0095\u0096\7?\2\2\u0096*\3\2\2\2\u0097\u0098\7?\2\2\u0098\u0099"+ - "\7>\2\2\u0099,\3\2\2\2\u009a\u009b\7@\2\2\u009b\u009c\7?\2\2\u009c.\3"+ - "\2\2\2\u009d\u009e\7?\2\2\u009e\u009f\7@\2\2\u009f\60\3\2\2\2\u00a0\u00a1"+ - "\7@\2\2\u00a1\62\3\2\2\2\u00a2\u00a3\7c\2\2\u00a3\u00a4\7p\2\2\u00a4\u00a5"+ - "\7f\2\2\u00a5\64\3\2\2\2\u00a6\u00a7\7(\2\2\u00a7\u00a8\7(\2\2\u00a8\66"+ - "\3\2\2\2\u00a9\u00aa\7q\2\2\u00aa\u00ab\7t\2\2\u00ab8\3\2\2\2\u00ac\u00ad"+ - "\7~\2\2\u00ad\u00ae\7~\2\2\u00ae:\3\2\2\2\u00af\u00b0\7d\2\2\u00b0\u00b1"+ - "\7{\2\2\u00b1\u00b2\7v\2\2\u00b2\u00c5\7g\2\2\u00b3\u00b4\7y\2\2\u00b4"+ - "\u00b5\7q\2\2\u00b5\u00b6\7t\2\2\u00b6\u00c5\7f\2\2\u00b7\u00b8\7u\2\2"+ - "\u00b8\u00b9\7v\2\2\u00b9\u00ba\7t\2\2\u00ba\u00bb\7k\2\2\u00bb\u00bc"+ - "\7p\2\2\u00bc\u00c5\7i\2\2\u00bd\u00be\7d\2\2\u00be\u00bf\7q\2\2\u00bf"+ - "\u00c0\7q\2\2\u00c0\u00c1\7n\2\2\u00c1\u00c2\7g\2\2\u00c2\u00c3\7c\2\2"+ - "\u00c3\u00c5\7p\2\2\u00c4\u00af\3\2\2\2\u00c4\u00b3\3\2\2\2\u00c4\u00b7"+ - "\3\2\2\2\u00c4\u00bd\3\2\2\2\u00c5<\3\2\2\2\u00c6\u00cc\7$\2\2\u00c7\u00c8"+ - "\7^\2\2\u00c8\u00cb\7$\2\2\u00c9\u00cb\n\2\2\2\u00ca\u00c7\3\2\2\2\u00ca"+ - "\u00c9\3\2\2\2\u00cb\u00ce\3\2\2\2\u00cc\u00ca\3\2\2\2\u00cc\u00cd\3\2"+ - "\2\2\u00cd\u00cf\3\2\2\2\u00ce\u00cc\3\2\2\2\u00cf\u00d0\7$\2\2\u00d0"+ - ">\3\2\2\2\u00d1\u00d2\7v\2\2\u00d2\u00d3\7t\2\2\u00d3\u00d4\7w\2\2\u00d4"+ - "\u00db\7g\2\2\u00d5\u00d6\7h\2\2\u00d6\u00d7\7c\2\2\u00d7\u00d8\7n\2\2"+ - "\u00d8\u00d9\7u\2\2\u00d9\u00db\7g\2\2\u00da\u00d1\3\2\2\2\u00da\u00d5"+ - "\3\2\2\2\u00db@\3\2\2\2\u00dc\u00df\5C\"\2\u00dd\u00df\5K&\2\u00de\u00dc"+ - "\3\2\2\2\u00de\u00dd\3\2\2\2\u00dfB\3\2\2\2\u00e0\u00e4\5E#\2\u00e1\u00e4"+ - "\5G$\2\u00e2\u00e4\5I%\2\u00e3\u00e0\3\2\2\2\u00e3\u00e1\3\2\2\2\u00e3"+ - "\u00e2\3\2\2\2\u00e4D\3\2\2\2\u00e5\u00eb\7\'\2\2\u00e6\u00e7\7\62\2\2"+ - "\u00e7\u00eb\7d\2\2\u00e8\u00e9\7\62\2\2\u00e9\u00eb\7D\2\2\u00ea\u00e5"+ - "\3\2\2\2\u00ea\u00e6\3\2\2\2\u00ea\u00e8\3\2\2\2\u00eb\u00ef\3\2\2\2\u00ec"+ - "\u00ee\5S*\2\u00ed\u00ec\3\2\2\2\u00ee\u00f1\3\2\2\2\u00ef\u00ed\3\2\2"+ - "\2\u00ef\u00f0\3\2\2\2\u00f0\u00f2\3\2\2\2\u00f1\u00ef\3\2\2\2\u00f2\u00f4"+ - "\7\60\2\2\u00f3\u00f5\5S*\2\u00f4\u00f3\3\2\2\2\u00f5\u00f6\3\2\2\2\u00f6"+ - "\u00f4\3\2\2\2\u00f6\u00f7\3\2\2\2\u00f7F\3\2\2\2\u00f8\u00fa\5U+\2\u00f9"+ - "\u00f8\3\2\2\2\u00fa\u00fd\3\2\2\2\u00fb\u00f9\3\2\2\2\u00fb\u00fc\3\2"+ - "\2\2\u00fc\u00fe\3\2\2\2\u00fd\u00fb\3\2\2\2\u00fe\u0100\7\60\2\2\u00ff"+ - "\u0101\5U+\2\u0100\u00ff\3\2\2\2\u0101\u0102\3\2\2\2\u0102\u0100\3\2\2"+ - "\2\u0102\u0103\3\2\2\2\u0103H\3\2\2\2\u0104\u010a\7&\2\2\u0105\u0106\7"+ - "\62\2\2\u0106\u010a\7z\2\2\u0107\u0108\7\62\2\2\u0108\u010a\7Z\2\2\u0109"+ - "\u0104\3\2\2\2\u0109\u0105\3\2\2\2\u0109\u0107\3\2\2\2\u010a\u010e\3\2"+ - "\2\2\u010b\u010d\5W,\2\u010c\u010b\3\2\2\2\u010d\u0110\3\2\2\2\u010e\u010c"+ - "\3\2\2\2\u010e\u010f\3\2\2\2\u010f\u0111\3\2\2\2\u0110\u010e\3\2\2\2\u0111"+ - "\u0113\7\60\2\2\u0112\u0114\5W,\2\u0113\u0112\3\2\2\2\u0114\u0115\3\2"+ - "\2\2\u0115\u0113\3\2\2\2\u0115\u0116\3\2\2\2\u0116J\3\2\2\2\u0117\u011b"+ - "\5O(\2\u0118\u011b\5Q)\2\u0119\u011b\5M\'\2\u011a\u0117\3\2\2\2\u011a"+ - "\u0118\3\2\2\2\u011a\u0119\3\2\2\2\u011bL\3\2\2\2\u011c\u011d\7\62\2\2"+ - "\u011d\u011f\t\3\2\2\u011e\u0120\5S*\2\u011f\u011e\3\2\2\2\u0120\u0121"+ - "\3\2\2\2\u0121\u011f\3\2\2\2\u0121\u0122\3\2\2\2\u0122\u012a\3\2\2\2\u0123"+ - "\u0125\7\'\2\2\u0124\u0126\5S*\2\u0125\u0124\3\2\2\2\u0126\u0127\3\2\2"+ - "\2\u0127\u0125\3\2\2\2\u0127\u0128\3\2\2\2\u0128\u012a\3\2\2\2\u0129\u011c"+ - "\3\2\2\2\u0129\u0123\3\2\2\2\u012aN\3\2\2\2\u012b\u012d\5U+\2\u012c\u012b"+ - "\3\2\2\2\u012d\u012e\3\2\2\2\u012e\u012c\3\2\2\2\u012e\u012f\3\2\2\2\u012f"+ - "P\3\2\2\2\u0130\u0136\7&\2\2\u0131\u0132\7\62\2\2\u0132\u0136\7z\2\2\u0133"+ - "\u0134\7\62\2\2\u0134\u0136\7Z\2\2\u0135\u0130\3\2\2\2\u0135\u0131\3\2"+ - "\2\2\u0135\u0133\3\2\2\2\u0136\u0138\3\2\2\2\u0137\u0139\5W,\2\u0138\u0137"+ - "\3\2\2\2\u0139\u013a\3\2\2\2\u013a\u0138\3\2\2\2\u013a\u013b\3\2\2\2\u013b"+ - "R\3\2\2\2\u013c\u013d\t\4\2\2\u013dT\3\2\2\2\u013e\u013f\t\5\2\2\u013f"+ - "V\3\2\2\2\u0140\u0141\t\6\2\2\u0141X\3\2\2\2\u0142\u0146\5[.\2\u0143\u0145"+ - "\5]/\2\u0144\u0143\3\2\2\2\u0145\u0148\3\2\2\2\u0146\u0144\3\2\2\2\u0146"+ - "\u0147\3\2\2\2\u0147Z\3\2\2\2\u0148\u0146\3\2\2\2\u0149\u014a\t\7\2\2"+ - "\u014a\\\3\2\2\2\u014b\u014c\t\b\2\2\u014c^\3\2\2\2\u014d\u014f\t\t\2"+ - "\2\u014e\u014d\3\2\2\2\u014f\u0150\3\2\2\2\u0150\u014e\3\2\2\2\u0150\u0151"+ - "\3\2\2\2\u0151\u0152\3\2\2\2\u0152\u0153\b\60\2\2\u0153`\3\2\2\2\32\2"+ - "\u00c4\u00ca\u00cc\u00da\u00de\u00e3\u00ea\u00ef\u00f6\u00fb\u0102\u0109"+ - "\u010e\u0115\u011a\u0121\u0127\u0129\u012e\u0135\u013a\u0146\u0150\3\b"+ + ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\3\2\3\2\3\3\3\3\3\4\3\4\3\5"+ + "\3\5\3\6\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3"+ + "\n\3\n\3\13\3\13\3\13\3\f\3\f\3\r\3\r\3\16\3\16\3\16\3\16\3\17\3\17\3"+ + "\20\3\20\3\21\3\21\3\22\3\22\3\22\3\23\3\23\3\23\3\24\3\24\3\24\3\25\3"+ + "\25\3\26\3\26\3\26\3\27\3\27\3\27\3\30\3\30\3\30\3\31\3\31\3\31\3\32\3"+ + "\32\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3\36\3"+ + "\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3"+ + "\37\3\37\3\37\3\37\3\37\3\37\3\37\5\37\u00ca\n\37\3 \3 \3 \3 \7 \u00d0"+ + "\n \f \16 \u00d3\13 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u00e0\n!\3\""+ + "\3\"\5\"\u00e4\n\"\3#\3#\3#\5#\u00e9\n#\3$\3$\3$\3$\3$\5$\u00f0\n$\3$"+ + "\7$\u00f3\n$\f$\16$\u00f6\13$\3$\3$\6$\u00fa\n$\r$\16$\u00fb\3%\7%\u00ff"+ + "\n%\f%\16%\u0102\13%\3%\3%\6%\u0106\n%\r%\16%\u0107\3&\3&\3&\3&\3&\5&"+ + "\u010f\n&\3&\7&\u0112\n&\f&\16&\u0115\13&\3&\3&\6&\u0119\n&\r&\16&\u011a"+ + "\3\'\3\'\3\'\5\'\u0120\n\'\3(\3(\3(\6(\u0125\n(\r(\16(\u0126\3(\3(\6("+ + "\u012b\n(\r(\16(\u012c\5(\u012f\n(\3)\6)\u0132\n)\r)\16)\u0133\3*\3*\3"+ + "*\3*\3*\5*\u013b\n*\3*\6*\u013e\n*\r*\16*\u013f\3+\3+\3,\3,\3-\3-\3.\3"+ + ".\7.\u014a\n.\f.\16.\u014d\13.\3/\3/\3\60\3\60\3\61\6\61\u0154\n\61\r"+ + "\61\16\61\u0155\3\61\3\61\2\2\62\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\2W\2Y\2[,"+ + "]\2_\2a-\3\2\n\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\"\"\2\u0171\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\2[\3\2\2\2\2a\3\2\2\2\3c\3\2"+ + "\2\2\5e\3\2\2\2\7g\3\2\2\2\ti\3\2\2\2\13k\3\2\2\2\rn\3\2\2\2\17p\3\2\2"+ + "\2\21r\3\2\2\2\23w\3\2\2\2\25}\3\2\2\2\27\u0080\3\2\2\2\31\u0082\3\2\2"+ + "\2\33\u0084\3\2\2\2\35\u0088\3\2\2\2\37\u008a\3\2\2\2!\u008c\3\2\2\2#"+ + "\u008e\3\2\2\2%\u0091\3\2\2\2\'\u0094\3\2\2\2)\u0097\3\2\2\2+\u0099\3"+ + "\2\2\2-\u009c\3\2\2\2/\u009f\3\2\2\2\61\u00a2\3\2\2\2\63\u00a5\3\2\2\2"+ + "\65\u00a7\3\2\2\2\67\u00ab\3\2\2\29\u00ae\3\2\2\2;\u00b1\3\2\2\2=\u00c9"+ + "\3\2\2\2?\u00cb\3\2\2\2A\u00df\3\2\2\2C\u00e3\3\2\2\2E\u00e8\3\2\2\2G"+ + "\u00ef\3\2\2\2I\u0100\3\2\2\2K\u010e\3\2\2\2M\u011f\3\2\2\2O\u012e\3\2"+ + "\2\2Q\u0131\3\2\2\2S\u013a\3\2\2\2U\u0141\3\2\2\2W\u0143\3\2\2\2Y\u0145"+ + "\3\2\2\2[\u0147\3\2\2\2]\u014e\3\2\2\2_\u0150\3\2\2\2a\u0153\3\2\2\2c"+ + "d\7}\2\2d\4\3\2\2\2ef\7\177\2\2f\6\3\2\2\2gh\7?\2\2h\b\3\2\2\2ij\7=\2"+ + "\2j\n\3\2\2\2kl\7k\2\2lm\7h\2\2m\f\3\2\2\2no\7*\2\2o\16\3\2\2\2pq\7+\2"+ + "\2q\20\3\2\2\2rs\7g\2\2st\7n\2\2tu\7u\2\2uv\7g\2\2v\22\3\2\2\2wx\7y\2"+ + "\2xy\7j\2\2yz\7k\2\2z{\7n\2\2{|\7g\2\2|\24\3\2\2\2}~\7f\2\2~\177\7q\2"+ + "\2\177\26\3\2\2\2\u0080\u0081\7-\2\2\u0081\30\3\2\2\2\u0082\u0083\7/\2"+ + "\2\u0083\32\3\2\2\2\u0084\u0085\7p\2\2\u0085\u0086\7q\2\2\u0086\u0087"+ + "\7v\2\2\u0087\34\3\2\2\2\u0088\u0089\7#\2\2\u0089\36\3\2\2\2\u008a\u008b"+ + "\7,\2\2\u008b \3\2\2\2\u008c\u008d\7\61\2\2\u008d\"\3\2\2\2\u008e\u008f"+ + "\7?\2\2\u008f\u0090\7?\2\2\u0090$\3\2\2\2\u0091\u0092\7#\2\2\u0092\u0093"+ + "\7?\2\2\u0093&\3\2\2\2\u0094\u0095\7>\2\2\u0095\u0096\7@\2\2\u0096(\3"+ + "\2\2\2\u0097\u0098\7>\2\2\u0098*\3\2\2\2\u0099\u009a\7>\2\2\u009a\u009b"+ + "\7?\2\2\u009b,\3\2\2\2\u009c\u009d\7?\2\2\u009d\u009e\7>\2\2\u009e.\3"+ + "\2\2\2\u009f\u00a0\7@\2\2\u00a0\u00a1\7?\2\2\u00a1\60\3\2\2\2\u00a2\u00a3"+ + "\7?\2\2\u00a3\u00a4\7@\2\2\u00a4\62\3\2\2\2\u00a5\u00a6\7@\2\2\u00a6\64"+ + "\3\2\2\2\u00a7\u00a8\7c\2\2\u00a8\u00a9\7p\2\2\u00a9\u00aa\7f\2\2\u00aa"+ + "\66\3\2\2\2\u00ab\u00ac\7(\2\2\u00ac\u00ad\7(\2\2\u00ad8\3\2\2\2\u00ae"+ + "\u00af\7q\2\2\u00af\u00b0\7t\2\2\u00b0:\3\2\2\2\u00b1\u00b2\7~\2\2\u00b2"+ + "\u00b3\7~\2\2\u00b3<\3\2\2\2\u00b4\u00b5\7d\2\2\u00b5\u00b6\7{\2\2\u00b6"+ + "\u00b7\7v\2\2\u00b7\u00ca\7g\2\2\u00b8\u00b9\7y\2\2\u00b9\u00ba\7q\2\2"+ + "\u00ba\u00bb\7t\2\2\u00bb\u00ca\7f\2\2\u00bc\u00bd\7u\2\2\u00bd\u00be"+ + "\7v\2\2\u00be\u00bf\7t\2\2\u00bf\u00c0\7k\2\2\u00c0\u00c1\7p\2\2\u00c1"+ + "\u00ca\7i\2\2\u00c2\u00c3\7d\2\2\u00c3\u00c4\7q\2\2\u00c4\u00c5\7q\2\2"+ + "\u00c5\u00c6\7n\2\2\u00c6\u00c7\7g\2\2\u00c7\u00c8\7c\2\2\u00c8\u00ca"+ + "\7p\2\2\u00c9\u00b4\3\2\2\2\u00c9\u00b8\3\2\2\2\u00c9\u00bc\3\2\2\2\u00c9"+ + "\u00c2\3\2\2\2\u00ca>\3\2\2\2\u00cb\u00d1\7$\2\2\u00cc\u00cd\7^\2\2\u00cd"+ + "\u00d0\7$\2\2\u00ce\u00d0\n\2\2\2\u00cf\u00cc\3\2\2\2\u00cf\u00ce\3\2"+ + "\2\2\u00d0\u00d3\3\2\2\2\u00d1\u00cf\3\2\2\2\u00d1\u00d2\3\2\2\2\u00d2"+ + "\u00d4\3\2\2\2\u00d3\u00d1\3\2\2\2\u00d4\u00d5\7$\2\2\u00d5@\3\2\2\2\u00d6"+ + "\u00d7\7v\2\2\u00d7\u00d8\7t\2\2\u00d8\u00d9\7w\2\2\u00d9\u00e0\7g\2\2"+ + "\u00da\u00db\7h\2\2\u00db\u00dc\7c\2\2\u00dc\u00dd\7n\2\2\u00dd\u00de"+ + "\7u\2\2\u00de\u00e0\7g\2\2\u00df\u00d6\3\2\2\2\u00df\u00da\3\2\2\2\u00e0"+ + "B\3\2\2\2\u00e1\u00e4\5E#\2\u00e2\u00e4\5M\'\2\u00e3\u00e1\3\2\2\2\u00e3"+ + "\u00e2\3\2\2\2\u00e4D\3\2\2\2\u00e5\u00e9\5G$\2\u00e6\u00e9\5I%\2\u00e7"+ + "\u00e9\5K&\2\u00e8\u00e5\3\2\2\2\u00e8\u00e6\3\2\2\2\u00e8\u00e7\3\2\2"+ + "\2\u00e9F\3\2\2\2\u00ea\u00f0\7\'\2\2\u00eb\u00ec\7\62\2\2\u00ec\u00f0"+ + "\7d\2\2\u00ed\u00ee\7\62\2\2\u00ee\u00f0\7D\2\2\u00ef\u00ea\3\2\2\2\u00ef"+ + "\u00eb\3\2\2\2\u00ef\u00ed\3\2\2\2\u00f0\u00f4\3\2\2\2\u00f1\u00f3\5U"+ + "+\2\u00f2\u00f1\3\2\2\2\u00f3\u00f6\3\2\2\2\u00f4\u00f2\3\2\2\2\u00f4"+ + "\u00f5\3\2\2\2\u00f5\u00f7\3\2\2\2\u00f6\u00f4\3\2\2\2\u00f7\u00f9\7\60"+ + "\2\2\u00f8\u00fa\5U+\2\u00f9\u00f8\3\2\2\2\u00fa\u00fb\3\2\2\2\u00fb\u00f9"+ + "\3\2\2\2\u00fb\u00fc\3\2\2\2\u00fcH\3\2\2\2\u00fd\u00ff\5W,\2\u00fe\u00fd"+ + "\3\2\2\2\u00ff\u0102\3\2\2\2\u0100\u00fe\3\2\2\2\u0100\u0101\3\2\2\2\u0101"+ + "\u0103\3\2\2\2\u0102\u0100\3\2\2\2\u0103\u0105\7\60\2\2\u0104\u0106\5"+ + "W,\2\u0105\u0104\3\2\2\2\u0106\u0107\3\2\2\2\u0107\u0105\3\2\2\2\u0107"+ + "\u0108\3\2\2\2\u0108J\3\2\2\2\u0109\u010f\7&\2\2\u010a\u010b\7\62\2\2"+ + "\u010b\u010f\7z\2\2\u010c\u010d\7\62\2\2\u010d\u010f\7Z\2\2\u010e\u0109"+ + "\3\2\2\2\u010e\u010a\3\2\2\2\u010e\u010c\3\2\2\2\u010f\u0113\3\2\2\2\u0110"+ + "\u0112\5Y-\2\u0111\u0110\3\2\2\2\u0112\u0115\3\2\2\2\u0113\u0111\3\2\2"+ + "\2\u0113\u0114\3\2\2\2\u0114\u0116\3\2\2\2\u0115\u0113\3\2\2\2\u0116\u0118"+ + "\7\60\2\2\u0117\u0119\5Y-\2\u0118\u0117\3\2\2\2\u0119\u011a\3\2\2\2\u011a"+ + "\u0118\3\2\2\2\u011a\u011b\3\2\2\2\u011bL\3\2\2\2\u011c\u0120\5Q)\2\u011d"+ + "\u0120\5S*\2\u011e\u0120\5O(\2\u011f\u011c\3\2\2\2\u011f\u011d\3\2\2\2"+ + "\u011f\u011e\3\2\2\2\u0120N\3\2\2\2\u0121\u0122\7\62\2\2\u0122\u0124\t"+ + "\3\2\2\u0123\u0125\5U+\2\u0124\u0123\3\2\2\2\u0125\u0126\3\2\2\2\u0126"+ + "\u0124\3\2\2\2\u0126\u0127\3\2\2\2\u0127\u012f\3\2\2\2\u0128\u012a\7\'"+ + "\2\2\u0129\u012b\5U+\2\u012a\u0129\3\2\2\2\u012b\u012c\3\2\2\2\u012c\u012a"+ + "\3\2\2\2\u012c\u012d\3\2\2\2\u012d\u012f\3\2\2\2\u012e\u0121\3\2\2\2\u012e"+ + "\u0128\3\2\2\2\u012fP\3\2\2\2\u0130\u0132\5W,\2\u0131\u0130\3\2\2\2\u0132"+ + "\u0133\3\2\2\2\u0133\u0131\3\2\2\2\u0133\u0134\3\2\2\2\u0134R\3\2\2\2"+ + "\u0135\u013b\7&\2\2\u0136\u0137\7\62\2\2\u0137\u013b\7z\2\2\u0138\u0139"+ + "\7\62\2\2\u0139\u013b\7Z\2\2\u013a\u0135\3\2\2\2\u013a\u0136\3\2\2\2\u013a"+ + "\u0138\3\2\2\2\u013b\u013d\3\2\2\2\u013c\u013e\5Y-\2\u013d\u013c\3\2\2"+ + "\2\u013e\u013f\3\2\2\2\u013f\u013d\3\2\2\2\u013f\u0140\3\2\2\2\u0140T"+ + "\3\2\2\2\u0141\u0142\t\4\2\2\u0142V\3\2\2\2\u0143\u0144\t\5\2\2\u0144"+ + "X\3\2\2\2\u0145\u0146\t\6\2\2\u0146Z\3\2\2\2\u0147\u014b\5]/\2\u0148\u014a"+ + "\5_\60\2\u0149\u0148\3\2\2\2\u014a\u014d\3\2\2\2\u014b\u0149\3\2\2\2\u014b"+ + "\u014c\3\2\2\2\u014c\\\3\2\2\2\u014d\u014b\3\2\2\2\u014e\u014f\t\7\2\2"+ + "\u014f^\3\2\2\2\u0150\u0151\t\b\2\2\u0151`\3\2\2\2\u0152\u0154\t\t\2\2"+ + "\u0153\u0152\3\2\2\2\u0154\u0155\3\2\2\2\u0155\u0153\3\2\2\2\u0155\u0156"+ + "\3\2\2\2\u0156\u0157\3\2\2\2\u0157\u0158\b\61\2\2\u0158b\3\2\2\2\32\2"+ + "\u00c9\u00cf\u00d1\u00df\u00e3\u00e8\u00ef\u00f4\u00fb\u0100\u0107\u010e"+ + "\u0113\u011a\u011f\u0126\u012c\u012e\u0133\u013a\u013f\u014b\u0155\3\b"+ "\2\2"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); diff --git a/src/dk/camelot64/kickc/parser/KickCLexer.tokens b/src/dk/camelot64/kickc/parser/KickCLexer.tokens index 69c474e0f..fb63df5b8 100644 --- a/src/dk/camelot64/kickc/parser/KickCLexer.tokens +++ b/src/dk/camelot64/kickc/parser/KickCLexer.tokens @@ -26,20 +26,21 @@ T__24=25 T__25=26 T__26=27 T__27=28 -TYPE=29 -STRING=30 -BOOLEAN=31 -NUMBER=32 -NUMFLOAT=33 -BINFLOAT=34 -DECFLOAT=35 -HEXFLOAT=36 -NUMINT=37 -BININTEGER=38 -DECINTEGER=39 -HEXINTEGER=40 -NAME=41 -WS=42 +T__28=29 +TYPE=30 +STRING=31 +BOOLEAN=32 +NUMBER=33 +NUMFLOAT=34 +BINFLOAT=35 +DECFLOAT=36 +HEXFLOAT=37 +NUMINT=38 +BININTEGER=39 +DECINTEGER=40 +HEXINTEGER=41 +NAME=42 +WS=43 '{'=1 '}'=2 '='=3 @@ -49,22 +50,23 @@ WS=42 ')'=7 'else'=8 'while'=9 -'+'=10 -'-'=11 -'not'=12 -'!'=13 -'*'=14 -'/'=15 -'=='=16 -'!='=17 -'<>'=18 -'<'=19 -'<='=20 -'=<'=21 -'>='=22 -'=>'=23 -'>'=24 -'and'=25 -'&&'=26 -'or'=27 -'||'=28 +'do'=10 +'+'=11 +'-'=12 +'not'=13 +'!'=14 +'*'=15 +'/'=16 +'=='=17 +'!='=18 +'<>'=19 +'<'=20 +'<='=21 +'=<'=22 +'>='=23 +'=>'=24 +'>'=25 +'and'=26 +'&&'=27 +'or'=28 +'||'=29 diff --git a/src/dk/camelot64/kickc/parser/KickCListener.java b/src/dk/camelot64/kickc/parser/KickCListener.java index dfce0dcdd..7053c9c07 100644 --- a/src/dk/camelot64/kickc/parser/KickCListener.java +++ b/src/dk/camelot64/kickc/parser/KickCListener.java @@ -87,6 +87,18 @@ public interface KickCListener extends ParseTreeListener { * @param ctx the parse tree */ void exitStmtWhile(KickCParser.StmtWhileContext ctx); + /** + * Enter a parse tree produced by the {@code stmtDoWhile} + * labeled alternative in {@link KickCParser#stmt}. + * @param ctx the parse tree + */ + void enterStmtDoWhile(KickCParser.StmtDoWhileContext ctx); + /** + * Exit a parse tree produced by the {@code stmtDoWhile} + * labeled alternative in {@link KickCParser#stmt}. + * @param ctx the parse tree + */ + void exitStmtDoWhile(KickCParser.StmtDoWhileContext ctx); /** * Enter a parse tree produced by the {@code exprBinary} * labeled alternative in {@link KickCParser#expr}. diff --git a/src/dk/camelot64/kickc/parser/KickCParser.java b/src/dk/camelot64/kickc/parser/KickCParser.java index 44744aa15..ed8b3e6d3 100644 --- a/src/dk/camelot64/kickc/parser/KickCParser.java +++ b/src/dk/camelot64/kickc/parser/KickCParser.java @@ -20,9 +20,9 @@ public class KickCParser extends Parser { T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, T__8=9, T__9=10, T__10=11, T__11=12, T__12=13, T__13=14, T__14=15, T__15=16, T__16=17, 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, TYPE=29, STRING=30, BOOLEAN=31, - NUMBER=32, NUMFLOAT=33, BINFLOAT=34, DECFLOAT=35, HEXFLOAT=36, NUMINT=37, - BININTEGER=38, DECINTEGER=39, HEXINTEGER=40, NAME=41, WS=42; + T__24=25, T__25=26, T__26=27, T__27=28, T__28=29, TYPE=30, STRING=31, + BOOLEAN=32, NUMBER=33, NUMFLOAT=34, BINFLOAT=35, DECFLOAT=36, HEXFLOAT=37, + NUMINT=38, BININTEGER=39, DECINTEGER=40, HEXINTEGER=41, NAME=42, WS=43; public static final int RULE_file = 0, RULE_stmtSeq = 1, RULE_stmt = 2, RULE_expr = 3; public static final String[] ruleNames = { @@ -31,15 +31,16 @@ public class KickCParser extends Parser { private static final String[] _LITERAL_NAMES = { null, "'{'", "'}'", "'='", "';'", "'if'", "'('", "')'", "'else'", "'while'", - "'+'", "'-'", "'not'", "'!'", "'*'", "'/'", "'=='", "'!='", "'<>'", "'<'", - "'<='", "'=<'", "'>='", "'=>'", "'>'", "'and'", "'&&'", "'or'", "'||'" + "'do'", "'+'", "'-'", "'not'", "'!'", "'*'", "'/'", "'=='", "'!='", "'<>'", + "'<'", "'<='", "'=<'", "'>='", "'=>'", "'>'", "'and'", "'&&'", "'or'", + "'||'" }; private static final String[] _SYMBOLIC_NAMES = { 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, "TYPE", "STRING", "BOOLEAN", "NUMBER", "NUMFLOAT", - "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", - "HEXINTEGER", "NAME", "WS" + null, null, null, null, null, null, "TYPE", "STRING", "BOOLEAN", "NUMBER", + "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", + "DECINTEGER", "HEXINTEGER", "NAME", "WS" }; public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); @@ -183,7 +184,7 @@ public class KickCParser extends Parser { setState(14); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__4) | (1L << T__5) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << TYPE) | (1L << STRING) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0) ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__4) | (1L << T__5) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << TYPE) | (1L << STRING) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0) ); } } catch (RecognitionException re) { @@ -268,6 +269,28 @@ public class KickCParser extends Parser { else return visitor.visitChildren(this); } } + public static class StmtDoWhileContext extends StmtContext { + public StmtContext stmt() { + return getRuleContext(StmtContext.class,0); + } + public ExprContext expr() { + return getRuleContext(ExprContext.class,0); + } + public StmtDoWhileContext(StmtContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof KickCListener ) ((KickCListener)listener).enterStmtDoWhile(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof KickCListener ) ((KickCListener)listener).exitStmtDoWhile(this); + } + @Override + public