From eb5621ea9a81b91c3638207c254e373c3414ea83 Mon Sep 17 00:00:00 2001 From: Eddie Date: Mon, 10 Jun 2024 19:53:05 -0400 Subject: [PATCH] feat: sleep keyword --- README.md | 22 +++--- out/artifacts/jungle_jar/jungle.jar | Bin 900957 -> 903141 bytes programs/multitask-inline.source | 6 +- programs/multitask.source | 11 +++ programs/sleep.source | 1 + src/main/java/com/jungle/ast/NodeType.java | 1 + .../jungle/compiler/visitor/MainVisitor.java | 16 +++++ .../jungle/compiler/visitor/SleepVisitor.java | 66 ++++++++++++++++++ src/main/java/com/jungle/parser/Parser.java | 18 +++++ src/main/java/com/jungle/scanner/Scanner.java | 2 + 10 files changed, 128 insertions(+), 15 deletions(-) create mode 100644 programs/sleep.source create mode 100644 src/main/java/com/jungle/compiler/visitor/SleepVisitor.java diff --git a/README.md b/README.md index 8db85bd..5c40f08 100644 --- a/README.md +++ b/README.md @@ -174,22 +174,24 @@ Ensure the class for `multitask`: - implements the `java.lang.Runnable` interface - compiled with the `JUNGLE_CLASSPATH` environment variable with the classpath -```shell -# Compile the Java class used by our program -javac programs/classes/com/example/MultitaskRunnable.java +--- + +This program demonstrates: +- Multi-threading is possible with this language +- Threads print to the same standard output +- Runnable classes are compiled from a single program -# Declare or provide the jungle classpath before compiling or running, -# so that our Runnable class can be validated during compile and found during runtime. -# The jungle classpath is used to declare dependencies to compile the program and run the program. -export JUNGLE_CLASSPATH='.:./programs/classes' +The program describes 2 threads: +1. The first thread pauses program execution for a short duration and then prints out `thread!` +2. The second thread immediately prints out `Inline...` -# Compile and run the program -cat programs/multitask.source | jungle run +```shell +cat programs/multitask-inline.source | jungle run ``` Expected output: ``` -Hello, world! +Inline... thread! ``` ## Environment Variables diff --git a/out/artifacts/jungle_jar/jungle.jar b/out/artifacts/jungle_jar/jungle.jar index 557bcde8aa65a9919278a6c625b43f52a95e0cc0..dbdbb0c0802373b4fbdcf88c4015b847622c417d 100644 GIT binary patch delta 51032 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 bn!=iEW`QAxHF)nkj&}UK9_PUu;CA>w^v|uM delta 48377 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 diff --git a/programs/multitask-inline.source b/programs/multitask-inline.source index d7653b3..3f7102c 100644 --- a/programs/multitask-inline.source +++ b/programs/multitask-inline.source @@ -1,9 +1,5 @@ multitask "com.example.RunnableTaskOne" : { - # Wait a little - x = 999999 - loop (greaterThan x 0) { - x = - x 1 - } + sleep 100 print "thread!\n" } diff --git a/programs/multitask.source b/programs/multitask.source index 4d32c82..44f9c95 100644 --- a/programs/multitask.source +++ b/programs/multitask.source @@ -1,2 +1,13 @@ +# Compile the Java class used by our program +# `javac programs/classes/com/example/MultitaskRunnable.java` + +# Declare or provide the jungle classpath before compiling or running, +# so that our Runnable class can be validated during compile and found during runtime. +# The jungle classpath is used to declare dependencies to compile the program and run the program. +# `export JUNGLE_CLASSPATH='.:./programs/classes'` + +# Compile and run the program +# `cat programs/multitask.source | jungle run` + multitask "com.example.MultitaskRunnable" print "Hello" diff --git a/programs/sleep.source b/programs/sleep.source new file mode 100644 index 0000000..fb71a90 --- /dev/null +++ b/programs/sleep.source @@ -0,0 +1 @@ +sleep 1000 diff --git a/src/main/java/com/jungle/ast/NodeType.java b/src/main/java/com/jungle/ast/NodeType.java index e9b5de1..64ecb64 100644 --- a/src/main/java/com/jungle/ast/NodeType.java +++ b/src/main/java/com/jungle/ast/NodeType.java @@ -60,6 +60,7 @@ public enum NodeType { ASSERT, PRINT, MULTITASK, + SLEEP, TRUE, FALSE; diff --git a/src/main/java/com/jungle/compiler/visitor/MainVisitor.java b/src/main/java/com/jungle/compiler/visitor/MainVisitor.java index 4290ca9..1f794e6 100644 --- a/src/main/java/com/jungle/compiler/visitor/MainVisitor.java +++ b/src/main/java/com/jungle/compiler/visitor/MainVisitor.java @@ -102,6 +102,17 @@ private MultitaskVisitor getMultitaskVisitor() { return multitaskVisitor; } + @Nullable + private SleepVisitor sleepVisitor; + + @NotNull + private SleepVisitor getSleepVisitor() { + if (sleepVisitor == null) { + sleepVisitor = new SleepVisitor(getCompilerOptions()); + } + return sleepVisitor; + } + @Nullable private SequenceVisitor sequenceVisitor; @@ -180,6 +191,11 @@ public void visit( return; } + if (getSleepVisitor().canVisit(ast)) { + getSleepVisitor().visit(mv, ast, context); + return; + } + throw new Error("unexpected node " + ast); } } diff --git a/src/main/java/com/jungle/compiler/visitor/SleepVisitor.java b/src/main/java/com/jungle/compiler/visitor/SleepVisitor.java new file mode 100644 index 0000000..ee9dd65 --- /dev/null +++ b/src/main/java/com/jungle/compiler/visitor/SleepVisitor.java @@ -0,0 +1,66 @@ +package com.jungle.compiler.visitor; + +import static org.objectweb.asm.Opcodes.I2L; +import static org.objectweb.asm.Opcodes.INVOKESTATIC; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.objectweb.asm.MethodVisitor; + +import com.jungle.ast.INode; +import com.jungle.ast.NodeType; +import com.jungle.compiler.ICompilerOptions; +import com.jungle.compiler.operand.OperandStackContext; +import com.jungle.compiler.operand.OperandStackType; + +public class SleepVisitor extends AbstractVisitor { + + @Nullable + private ExpressionVisitor expressionVisitor; + + @NotNull + private ExpressionVisitor getExpressionVisitor() { + if (expressionVisitor == null) { + expressionVisitor = new ExpressionVisitor(getCompilerOptions()); + } + return expressionVisitor; + } + + public SleepVisitor(@NotNull ICompilerOptions options) { + super(options); + } + + @Override + public boolean canVisit(@NotNull INode ast) { + return ast.getType().equals(NodeType.SLEEP); + } + + @Override + public void visit(@NotNull MethodVisitor mv, @NotNull INode ast, @NotNull OperandStackContext context) { + // generate code for the integer representing the number of milliseconds to wait + + if (ast.getLeft() == null) { + throw new Error("sleep missing expression"); + } + + // push expression onto operand stack + getExpressionVisitor().visit(mv, ast.getLeft(), context); + + // verify that the expression was an integer type + if (context.peek() != OperandStackType.INTEGER) { + throw new Error("sleep expression expected to be type integer"); + } + + // For now, convert the integer to long + mv.visitInsn(I2L); + + // invoke static method: Thread.sleep() + mv.visitMethodInsn( + INVOKESTATIC, + "java/lang/Thread", + "sleep", + "(J)V", + false + ); + } +} diff --git a/src/main/java/com/jungle/parser/Parser.java b/src/main/java/com/jungle/parser/Parser.java index e7a13a0..c4ac354 100644 --- a/src/main/java/com/jungle/parser/Parser.java +++ b/src/main/java/com/jungle/parser/Parser.java @@ -81,11 +81,15 @@ protected INode parseNumber() { public INode parseNumberExpression() { /* * number_expression := number + * | identifier * | "(" number_expression ")" * | ( "+" | "-" | "*" | "/" | "%" ) expression expression * ; */ consumeWhitespace(); + if (accepts(TokenType.SYMBOL)) { + return parseIdentifier(); + } if (accepts(TokenType.NUMBER)) { return parseNumber(); } @@ -362,6 +366,16 @@ protected INode parseStatementMultitask() { return node; } + @NotNull + protected INode parseStatementSleep() { + /* + * statement_sleep := "sleep" expression_number + */ + expectKeyword(KEYWORD_SLEEP); + consumeWhitespace(); + return new Node(NodeType.SLEEP).withLeft(parseNumberExpression()); + } + @Nullable protected INode parseStatementIf() { /* @@ -418,6 +432,7 @@ protected INode parseStatementKeyword() { * | statement_print * | statement_if * | statement_multitask + * | statement_wait * ; */ consumeWhitespace(); @@ -436,6 +451,9 @@ protected INode parseStatementKeyword() { if (acceptKeyword(KEYWORD_MULTITASK)) { return parseStatementMultitask(); } + if (acceptKeyword(KEYWORD_SLEEP)) { + return parseStatementSleep(); + } throw newError("not a keyword statement"); } diff --git a/src/main/java/com/jungle/scanner/Scanner.java b/src/main/java/com/jungle/scanner/Scanner.java index f61a241..4cdc9c7 100644 --- a/src/main/java/com/jungle/scanner/Scanner.java +++ b/src/main/java/com/jungle/scanner/Scanner.java @@ -17,6 +17,7 @@ public class Scanner extends AbstractScanner { public static final String KEYWORD_LOOP = "loop"; public static final String KEYWORD_PRINT = "print"; public static final String KEYWORD_MULTITASK = "multitask"; + public static final String KEYWORD_SLEEP = "sleep"; public static final String KEYWORD_AND = "and"; public static final String KEYWORD_OR = "or"; public static final String KEYWORD_NOT = "not"; @@ -35,6 +36,7 @@ public class Scanner extends AbstractScanner { KEYWORD_LOOP, KEYWORD_PRINT, KEYWORD_MULTITASK, + KEYWORD_SLEEP, KEYWORD_AND, KEYWORD_OR, KEYWORD_NOT,