diff options
| author | AidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com> | 2021-12-07 23:07:23 +0000 | 
|---|---|---|
| committer | AidenRushbrooke <72034940+AidenRushbrooke@users.noreply.github.com> | 2021-12-07 23:07:23 +0000 | 
| commit | 5c4d41c63af3ef064090336a14efe91931051e7e (patch) | |
| tree | ccb7cf199040b2c7c7a57ace1692dc0046afa1e4 /src | |
| parent | 6279da9b8ede22a77161e9504d2482aba33ec2e8 (diff) | |
| download | esotericFORTRAN-5c4d41c63af3ef064090336a14efe91931051e7e.tar.gz esotericFORTRAN-5c4d41c63af3ef064090336a14efe91931051e7e.zip | |
Fixed known issues
Diffstat (limited to 'src')
| -rw-r--r-- | src/Compiler/Expression.java | 4 | ||||
| -rw-r--r-- | src/Compiler/Language.java | 7 | ||||
| -rw-r--r-- | src/Compiler/Parser.java | 29 | ||||
| -rw-r--r-- | src/Compiler/Translator.java | 10 | ||||
| -rw-r--r-- | src/examples/example.ft | 4 | 
5 files changed, 28 insertions, 26 deletions
| diff --git a/src/Compiler/Expression.java b/src/Compiler/Expression.java index 056019a..c71874b 100644 --- a/src/Compiler/Expression.java +++ b/src/Compiler/Expression.java @@ -140,11 +140,11 @@ abstract class Expression {       * Class for representing a function call       */      static class FunctionCall extends Expression{ -        FunctionCall(Token name, List<Token> arguments){ +        FunctionCall(Token name, List<Expression> arguments){              this.arguments=arguments;              this.name=name;          } -        final List<Token> arguments; +        final List<Expression> arguments;          final Token name;          @Override diff --git a/src/Compiler/Language.java b/src/Compiler/Language.java index 5013cfd..549ea29 100644 --- a/src/Compiler/Language.java +++ b/src/Compiler/Language.java @@ -134,6 +134,13 @@ public class Language {          System.out.println("An error was encountered on line: "+line);          System.out.println(message);      } + + +    static void displayError(String message){ +        hadError=true; +        System.out.println("An error was encountered"); +        System.out.println(message); +    }      /**       * Method for displaying error based on a specific token       * @param token the token the parser detected the error on diff --git a/src/Compiler/Parser.java b/src/Compiler/Parser.java index 7d46063..c7b0165 100644 --- a/src/Compiler/Parser.java +++ b/src/Compiler/Parser.java @@ -229,14 +229,12 @@ public class Parser {          //Extract the size of the array          List<Expression> dimensions = new ArrayList<>(); -        Expression dimension = expression(); -        dimensions.add(dimension);          //Extract the size of each dimension of the array -        while(matchAndAdvance(TokenType.COMMA)){ -            dimension = expression(); +        do{ +            Expression dimension = expression();              dimensions.add(dimension); -        } +        } while(matchAndAdvance(TokenType.COMMA));          matchOrError(TokenType.RIGHT_PAREN, "Expected ')'");          matchOrError(TokenType.DEFINE, ":: Required for variable definition"); @@ -519,28 +517,21 @@ public class Parser {                  if(definedVars.containsKey(name.text)){                      if(definedVars.get(name.text).equals("array")){                          List<Expression> positions = new ArrayList<>(); -                        Expression position = expression(); -                        positions.add(position);                          //Parse array positions for each dimension -                        while(matchAndAdvance(TokenType.COMMA)){ -                            position = expression(); +                        do{ +                            Expression position = expression();                              positions.add(position); -                        } +                        }while (matchAndAdvance(TokenType.COMMA));                          matchOrError(TokenType.RIGHT_PAREN,"Expected ')'");                          return new Expression.ArrayVariable(name, positions);                      }                  }                  //If not previously declared, assume function call -                List<Token> arguments = new ArrayList<>(); +                List<Expression> arguments = new ArrayList<>();                  //Parse function call arguments                  do{ -                    matchOrError(TokenType.IDENTIFIER, "Expected argument"); -                    Token argumentValue = getPreviousToken(); -                    if(definedVars.containsKey(argumentValue.text)){ -                        arguments.add(argumentValue); -                    }else{ -                        throw error(argumentValue, "Argument undefined"); -                    } +                    Expression argument = expression(); +                    arguments.add(argument);                  }while(matchAndAdvance(TokenType.COMMA));                  matchOrError(TokenType.RIGHT_PAREN, "Expected ')");                  return new Expression.FunctionCall(name, arguments); @@ -638,6 +629,4 @@ public class Parser {          Language.displayError(token ,message);          return new Error();      } - -  } diff --git a/src/Compiler/Translator.java b/src/Compiler/Translator.java index 6f5f050..5b7d52e 100644 --- a/src/Compiler/Translator.java +++ b/src/Compiler/Translator.java @@ -236,6 +236,10 @@ public class Translator{          //Write each dimension of the array          for(Expression expr:arraydec.dimensions){ +            if(expr.getExpressionType()!="literal"){ +                Language.displayError(arraydec.name, "Array sizes must be defined using constants"); +                throw new Error(); +            }              arrayString+="[";              arrayString+=evaluateExpression(expr);              arrayString+="]"; @@ -293,6 +297,8 @@ public class Translator{                  types+="%f";              } else if (exprType.equals("string")){                  types+="%s"; +            } else{ +                Language.displayError("Unknown expression type in print statement");              }              //Add the actual expression value              values+=evaluateExpression(expr); @@ -527,11 +533,11 @@ public class Translator{          boolean first=true;          //Write each argument of the function call -        for(Token arg:expr.arguments){ +        for(Expression arg:expr.arguments){              if(!first){                  functioncall+=",";              } -            functioncall+=arg.text; +            functioncall+=evaluateExpression(arg);              first=false;          }          functioncall+=")"; diff --git a/src/examples/example.ft b/src/examples/example.ft index 1d41963..571cace 100644 --- a/src/examples/example.ft +++ b/src/examples/example.ft @@ -1,8 +1,8 @@  program example  real::a  real::root -a=25 -root=sqrt(a) +a=30 +root=sqrt(25+5)  print*,"The square root of ",a," is ",root  end program example | 
