diff options
| author | AidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com> | 2021-11-06 16:40:12 +0000 | 
|---|---|---|
| committer | AidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com> | 2021-11-06 16:40:12 +0000 | 
| commit | d3046e3b1481cf6d190b8fcb814985e29852b5eb (patch) | |
| tree | 0f0f966c017a09c74f032253bb6c4df400ee50df | |
| parent | 0c54d7f8cb4b17d80ed21f7a9916ad27a13e34ed (diff) | |
| download | esotericFORTRAN-d3046e3b1481cf6d190b8fcb814985e29852b5eb.tar.gz esotericFORTRAN-d3046e3b1481cf6d190b8fcb814985e29852b5eb.zip | |
Working if/else statements (very basic and unstable)
| -rw-r--r-- | src/Compiler/Parser.java | 28 | ||||
| -rw-r--r-- | src/Compiler/Statement.java | 19 | ||||
| -rw-r--r-- | src/Compiler/TokenScanner.java | 4 | ||||
| -rw-r--r-- | src/Compiler/TokenType.java | 2 | ||||
| -rw-r--r-- | src/Compiler/Translator.java | 19 | ||||
| -rw-r--r-- | src/example.txt | 6 | ||||
| -rw-r--r-- | src/main.c | 7 | ||||
| -rw-r--r-- | src/main.exe | bin | 297288 -> 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 @@ -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.exeBinary files differ index dbfd6ba..ee89ee8 100644 --- a/src/main.exe +++ b/src/main.exe | 
