summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com>2021-11-06 16:40:12 +0000
committerAidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com>2021-11-06 16:40:12 +0000
commitd3046e3b1481cf6d190b8fcb814985e29852b5eb (patch)
tree0f0f966c017a09c74f032253bb6c4df400ee50df /src
parent0c54d7f8cb4b17d80ed21f7a9916ad27a13e34ed (diff)
downloadesotericFORTRAN-d3046e3b1481cf6d190b8fcb814985e29852b5eb.tar.gz
esotericFORTRAN-d3046e3b1481cf6d190b8fcb814985e29852b5eb.zip
Working if/else statements (very basic and unstable)
Diffstat (limited to 'src')
-rw-r--r--src/Compiler/Parser.java28
-rw-r--r--src/Compiler/Statement.java19
-rw-r--r--src/Compiler/TokenScanner.java4
-rw-r--r--src/Compiler/TokenType.java2
-rw-r--r--src/Compiler/Translator.java19
-rw-r--r--src/example.txt6
-rw-r--r--src/main.c7
-rw-r--r--src/main.exebin297288 -> 297800 bytes
8 files changed, 82 insertions, 3 deletions
diff --git a/src/Compiler/Parser.java b/src/Compiler/Parser.java
index 4339fd4..412289a 100644
--- a/src/Compiler/Parser.java
+++ b/src/Compiler/Parser.java
@@ -41,11 +41,39 @@ public class Parser {
if (matchAndAdvance(TokenType.PRINT)){
Expression expression = expression();
return new Statement.PrintStatement(expression);
+ }else if (matchAndAdvance(TokenType.IF)){
+ Statement statement = ifStatement();
+ return statement;
}
return expressionStatement();
}
+ //Could be cleaned up to handle else statements better
+ private Statement ifStatement(){
+ Expression condition = expression();
+ if(matchOrError(TokenType.THEN, "then expected after if statement")){
+ List<Statement> statements = new ArrayList<>();
+ List<Statement> elseStatements = new ArrayList<>();
+ while(!matchAndAdvance(TokenType.ENDIF)&&!checkToken(TokenType.ELSE)){
+ if(matchAndAdvance(TokenType.EOF)){
+ throw error("endif missing");
+ }
+ statements.add(declaration());
+ }
+ if(matchAndAdvance(TokenType.ELSE)){
+ while(!matchAndAdvance(TokenType.ENDIF)){
+ if(matchAndAdvance(TokenType.EOF)){
+ throw error("endif missing");
+ }
+ elseStatements.add(declaration());
+ }
+ }
+ Statement ifstatement = new Statement.IfStatement(condition, statements,elseStatements);
+ return ifstatement;
+ }
+ return null;
+ }
private Statement expressionStatement(){
Expression expression = assignment();
diff --git a/src/Compiler/Statement.java b/src/Compiler/Statement.java
index 885e462..6b58878 100644
--- a/src/Compiler/Statement.java
+++ b/src/Compiler/Statement.java
@@ -1,5 +1,7 @@
package Compiler;
+import java.util.List;
+
abstract class Statement {
static class ExpressionStatement extends Statement{
@@ -16,6 +18,23 @@ abstract class Statement {
}
}
+ static class IfStatement extends Statement{
+ IfStatement(Expression condition, List<Statement> statements,List<Statement> elseStatements){
+ this.condition=condition;
+ this.statements=statements;
+ this.elseStatements=elseStatements;
+ }
+
+ final Expression condition;
+ final List<Statement> statements;
+ final List<Statement> elseStatements;
+
+ @Override
+ public String getStatmentType() {
+ return "ifStmt";
+ }
+ }
+
static class VariableDeclaration extends Statement{
VariableDeclaration(Token name){
diff --git a/src/Compiler/TokenScanner.java b/src/Compiler/TokenScanner.java
index f00f7b0..7783c01 100644
--- a/src/Compiler/TokenScanner.java
+++ b/src/Compiler/TokenScanner.java
@@ -175,5 +175,9 @@ public class TokenScanner {
keywords = new HashMap<>();
keywords.put("var", TokenType.VAR);
keywords.put("print", TokenType.PRINT);
+ keywords.put("if", TokenType.IF);
+ keywords.put("then", TokenType.THEN);
+ keywords.put("endif", TokenType.ENDIF);
+ keywords.put("else", TokenType.ELSE);
}
}
diff --git a/src/Compiler/TokenType.java b/src/Compiler/TokenType.java
index 83ce6cc..f916f1e 100644
--- a/src/Compiler/TokenType.java
+++ b/src/Compiler/TokenType.java
@@ -11,7 +11,7 @@ public enum TokenType {
NUMBER,IDENTIFIER,
- VAR,PRINT,
+ VAR,PRINT,IF,THEN,ENDIF,ELSE,
EOF
}
diff --git a/src/Compiler/Translator.java b/src/Compiler/Translator.java
index b62df63..5848389 100644
--- a/src/Compiler/Translator.java
+++ b/src/Compiler/Translator.java
@@ -43,6 +43,9 @@ public class Translator{
case "print":
evalPrintStatement((PrintStatement)statement);
break;
+ case "ifStmt":
+ evalIfStatement((IfStatement)statement);
+ break;
}
}
private void evalExpressionStatement(ExpressionStatement stmt){
@@ -58,6 +61,22 @@ public class Translator{
CCode.add("printf(\"%d\","+evaluateExpression(print.expr)+");");
}
+ private void evalIfStatement(IfStatement ifstatement){
+
+ CCode.add("if("+evaluateExpression(ifstatement.condition)+"){");
+ for(Statement s:ifstatement.statements) {
+ evaluateStatement(s);
+ }
+ if(ifstatement.elseStatements.size()>0){
+ CCode.add("}");
+ CCode.add("else {");
+ for(Statement s:ifstatement.elseStatements) {
+ evaluateStatement(s);
+ }
+ }
+ CCode.add("}");
+ }
+
private String evaluateExpression(Expression expression){
switch(expression.getExpressionType()){
case "binary":
diff --git a/src/example.txt b/src/example.txt
index a9202e5..94a8091 100644
--- a/src/example.txt
+++ b/src/example.txt
@@ -1,4 +1,8 @@
var :: a
a=5
-a=a+1
+if a<2 then
+a=a+5
+else
+a=a-3
+endif
print a
diff --git a/src/main.c b/src/main.c
index 0403b49..729227f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2,6 +2,11 @@
int main(){
int a;
a=5.0;
-a=a+1.0;
+if(a<2.0){
+a=a+5.0;
+}
+else {
+a=a-3.0;
+}
printf("%d",a);
}
diff --git a/src/main.exe b/src/main.exe
index dbfd6ba..ee89ee8 100644
--- a/src/main.exe
+++ b/src/main.exe
Binary files differ