From fed99da261b6f07bdbe0f64fa8efe84ac5e90b3f Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Fri, 1 Dec 2017 23:25:53 +0100 Subject: [PATCH] Disallowing code outside methods. Closes #18. --- .../kickc/passes/Pass1GenerateStatementSequence.java | 11 ++++++++++- .../java/dk/camelot64/kickc/test/TestPrograms.java | 10 ++++++++++ .../dk/camelot64/kickc/test/stmt-outside-method.kc | 8 ++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 src/main/java/dk/camelot64/kickc/test/stmt-outside-method.kc diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateStatementSequence.java b/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateStatementSequence.java index 9a1b89241..85308f804 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateStatementSequence.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateStatementSequence.java @@ -52,7 +52,16 @@ public class Pass1GenerateStatementSequence extends KickCBaseVisitor { @Override public Void visitFile(KickCParser.FileContext ctx) { - this.visit(ctx.stmtSeq()); + List stmts = ctx.stmtSeq().stmt(); + for (KickCParser.StmtContext stmt : stmts) { + if (stmt instanceof KickCParser.StmtDeclarationContext || stmt instanceof KickCParser.StmtFunctionContext) { + this.visit(stmt); + } else { + program.getLog().append("Statement not allowed outside method. " + stmt.getText()); + throw new CompileError("Statement not allowed outside method. " + stmt.getText()); + } + + } return null; } diff --git a/src/main/java/dk/camelot64/kickc/test/TestPrograms.java b/src/main/java/dk/camelot64/kickc/test/TestPrograms.java index f9208a33b..d11999045 100644 --- a/src/main/java/dk/camelot64/kickc/test/TestPrograms.java +++ b/src/main/java/dk/camelot64/kickc/test/TestPrograms.java @@ -241,6 +241,16 @@ public class TestPrograms extends TestCase { compileAndCompare("forrangemin"); } + public void testStmtOutsideMethod() throws IOException, URISyntaxException { + try { + compileAndCompare("stmt-outside-method"); + } catch (CompileError e) { + // expecting error! + return; + } + fail("Expected compile error."); + } + public void testUseUndeclared() throws IOException, URISyntaxException { try { compileAndCompare("useundeclared"); diff --git a/src/main/java/dk/camelot64/kickc/test/stmt-outside-method.kc b/src/main/java/dk/camelot64/kickc/test/stmt-outside-method.kc new file mode 100644 index 000000000..6c7bc4a03 --- /dev/null +++ b/src/main/java/dk/camelot64/kickc/test/stmt-outside-method.kc @@ -0,0 +1,8 @@ + +byte b=12; +b=b+1; + +void main() { + byte* screen = $0400; + *screen = b; +} \ No newline at end of file