From ddb1f805ed921bc5319b7f08f1e98f353cac1713 Mon Sep 17 00:00:00 2001 From: dibyendumajumdar Date: Thu, 7 Sep 2023 19:35:57 +0100 Subject: Renamed Ast to AST. --- .../java/com/seaofnodes/simple/parser/AST.java | 211 +++++++++++++++++++++ .../java/com/seaofnodes/simple/parser/Ast.java | 211 --------------------- .../java/com/seaofnodes/simple/parser/Parser.java | 74 ++++---- 3 files changed, 248 insertions(+), 248 deletions(-) create mode 100644 chapter01/src/main/java/com/seaofnodes/simple/parser/AST.java delete mode 100644 chapter01/src/main/java/com/seaofnodes/simple/parser/Ast.java (limited to 'chapter01/src/main') diff --git a/chapter01/src/main/java/com/seaofnodes/simple/parser/AST.java b/chapter01/src/main/java/com/seaofnodes/simple/parser/AST.java new file mode 100644 index 00000000..4e456416 --- /dev/null +++ b/chapter01/src/main/java/com/seaofnodes/simple/parser/AST.java @@ -0,0 +1,211 @@ +/* + * DO NOT REMOVE COPYRIGHT NOTICES OR THIS HEADER. + *

+ * Contributor(s): + *

+ * The Initial Developer of the Original Software is Dibyendu Majumdar. + *

+ * This file is part of the Sea Of Nodes Simple Programming language + * implementation. See https://github.com/SeaOfNodes/Simple + *

+ * The contents of this file are subject to the terms of the + * Apache License Version 2 (the "APL"). You may not use this + * file except in compliance with the License. A copy of the + * APL may be obtained from: + * http://www.apache.org/licenses/LICENSE-2.0 + */ +package com.seaofnodes.simple.parser; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * A simple AST definition. + */ +public class AST { + + protected AST() { + } + + + public abstract static class Expr extends AST { + public final Token op; + + protected Expr(Token op) { + this.op = op; + } + } + + /** + * A name in the language + */ + public static class Identifier extends Expr { + public final String name; + + public Identifier(Token op) { + super(op); + name = op.str; + } + + @Override + public String toString() { + return name; + } + } + + /** + * Reference to a name in the language + */ + public static class Symbol extends Expr { + public final String name; + + public Symbol(Token op) { + super(op); + name = op.str; + } + + @Override + public String toString() { + return name; + } + } + + public static class Binary extends Expr { + public final Expr expr1; + public final Expr expr2; + + public Binary(Token op, Expr expr1, Expr expr2) { + super(op); + this.expr1 = expr1; + this.expr2 = expr2; + } + + @Override + public String toString() { + return "(" + expr1 + op.toString() + expr2 + ")"; + } + } + + public static class Unary extends Expr { + public final Expr expr; + + public Unary(Token op, Expr expr) { + super(op); + this.expr = expr; + } + + @Override + public String toString() { + return "(" + op.toString() + "(" + expr + "))"; + } + } + + public static class Constant extends Expr { + public Constant(Token op) { + super(op); + } + + @Override + public String toString() { + return op.toString(); + } + } + + public abstract static class Statement extends AST { + } + + public static class IfElse extends Statement { + public final Expr expr; + public final Statement ifStmt; + public final Statement elseStmt; + + public IfElse(Expr expr, Statement ifStmt, Statement elseStmt) { + this.expr = expr; + this.ifStmt = ifStmt; + this.elseStmt = elseStmt; + } + + @Override + public String toString() { + if (elseStmt != null) + return "if(" + expr + ") " + ifStmt + " else " + elseStmt; + return "if(" + expr + ") " + ifStmt; + } + } + + public static class While extends Statement { + public final Expr expr; + public final Statement stmt; + + public While(Expr expr, Statement stmt) { + this.expr = expr; + this.stmt = stmt; + } + + @Override + public String toString() { + return "while(" + expr.toString() + ") " + stmt; + } + } + + public static class Break extends Statement { + @Override + public String toString() { + return "break;"; + } + } + + public static class Assign extends Statement { + public final Identifier identifier; + public final Expr expr; + + public Assign(Identifier identifier, Expr expr) { + this.identifier = identifier; + this.expr = expr; + } + + @Override + public String toString() { + return identifier.toString() + "=" + expr.toString() + ";"; + } + } + + public static class Type extends AST { + public final String typeId; + + public Type(String typeId) { + this.typeId = typeId; + } + + @Override + public String toString() { + return typeId; + } + } + + public static class Declare extends Statement { + public final Type type; + public final Identifier identifier; + + public Declare(Type type, Identifier identifier) { + this.type = type; + this.identifier = identifier; + } + + @Override + public String toString() { + return type.toString() + " " + identifier.toString() + ";"; + } + } + + public static class Block extends Statement { + public final List stmtList = new ArrayList<>(); + + @Override + public String toString() { + return "{" + + stmtList.stream().map(Object::toString).collect(Collectors.joining()) + "}"; + } + } +} diff --git a/chapter01/src/main/java/com/seaofnodes/simple/parser/Ast.java b/chapter01/src/main/java/com/seaofnodes/simple/parser/Ast.java deleted file mode 100644 index c271d4b6..00000000 --- a/chapter01/src/main/java/com/seaofnodes/simple/parser/Ast.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * DO NOT REMOVE COPYRIGHT NOTICES OR THIS HEADER. - *

- * Contributor(s): - *

- * The Initial Developer of the Original Software is Dibyendu Majumdar. - *

- * This file is part of the Sea Of Nodes Simple Programming language - * implementation. See https://github.com/SeaOfNodes/Simple - *

- * The contents of this file are subject to the terms of the - * Apache License Version 2 (the "APL"). You may not use this - * file except in compliance with the License. A copy of the - * APL may be obtained from: - * http://www.apache.org/licenses/LICENSE-2.0 - */ -package com.seaofnodes.simple.parser; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -/** - * A simple AST definition. - */ -public class Ast { - - protected Ast() { - } - - - public abstract static class Expr extends Ast { - public final Token op; - - protected Expr(Token op) { - this.op = op; - } - } - - /** - * A name in the language - */ - public static class Identifier extends Expr { - public final String name; - - public Identifier(Token op) { - super(op); - name = op.str; - } - - @Override - public String toString() { - return name; - } - } - - /** - * Reference to a name in the language - */ - public static class Symbol extends Expr { - public final String name; - - public Symbol(Token op) { - super(op); - name = op.str; - } - - @Override - public String toString() { - return name; - } - } - - public static class Binary extends Expr { - public final Expr expr1; - public final Expr expr2; - - public Binary(Token op, Expr expr1, Expr expr2) { - super(op); - this.expr1 = expr1; - this.expr2 = expr2; - } - - @Override - public String toString() { - return "(" + expr1 + op.toString() + expr2 + ")"; - } - } - - public static class Unary extends Expr { - public final Expr expr; - - public Unary(Token op, Expr expr) { - super(op); - this.expr = expr; - } - - @Override - public String toString() { - return "(" + op.toString() + "(" + expr + "))"; - } - } - - public static class Constant extends Expr { - public Constant(Token op) { - super(op); - } - - @Override - public String toString() { - return op.toString(); - } - } - - public abstract static class Statement extends Ast { - } - - public static class IfElse extends Statement { - public final Expr expr; - public final Statement ifStmt; - public final Statement elseStmt; - - public IfElse(Expr expr, Statement ifStmt, Statement elseStmt) { - this.expr = expr; - this.ifStmt = ifStmt; - this.elseStmt = elseStmt; - } - - @Override - public String toString() { - if (elseStmt != null) - return "if(" + expr + ") " + ifStmt + " else " + elseStmt; - return "if(" + expr + ") " + ifStmt; - } - } - - public static class While extends Statement { - public final Expr expr; - public final Statement stmt; - - public While(Expr expr, Statement stmt) { - this.expr = expr; - this.stmt = stmt; - } - - @Override - public String toString() { - return "while(" + expr.toString() + ") " + stmt; - } - } - - public static class Break extends Statement { - @Override - public String toString() { - return "break;"; - } - } - - public static class Assign extends Statement { - public final Identifier identifier; - public final Expr expr; - - public Assign(Identifier identifier, Expr expr) { - this.identifier = identifier; - this.expr = expr; - } - - @Override - public String toString() { - return identifier.toString() + "=" + expr.toString() + ";"; - } - } - - public static class Type extends Ast { - public final String typeId; - - public Type(String typeId) { - this.typeId = typeId; - } - - @Override - public String toString() { - return typeId; - } - } - - public static class Declare extends Statement { - public final Type type; - public final Identifier identifier; - - public Declare(Type type, Identifier identifier) { - this.type = type; - this.identifier = identifier; - } - - @Override - public String toString() { - return type.toString() + " " + identifier.toString() + ";"; - } - } - - public static class Block extends Statement { - public final List stmtList = new ArrayList<>(); - - @Override - public String toString() { - return "{" + - stmtList.stream().map(Object::toString).collect(Collectors.joining()) + "}"; - } - } -} diff --git a/chapter01/src/main/java/com/seaofnodes/simple/parser/Parser.java b/chapter01/src/main/java/com/seaofnodes/simple/parser/Parser.java index 7e333b71..d8f80090 100644 --- a/chapter01/src/main/java/com/seaofnodes/simple/parser/Parser.java +++ b/chapter01/src/main/java/com/seaofnodes/simple/parser/Parser.java @@ -23,9 +23,9 @@ public class Parser { * Parse and return a top level Ast * At present this is an Ast.Block * - * @see Ast.Block + * @see AST.Block */ - public Ast parse(Lexer lexer) { + public AST parse(Lexer lexer) { nextToken(lexer); return parseProgram(lexer); } @@ -66,8 +66,8 @@ public class Parser { return token.str.equals(value); } - private Ast.Statement parseProgram(Lexer lexer) { - var block = new Ast.Block(); + private AST.Statement parseProgram(Lexer lexer) { + var block = new AST.Block(); parseDeclarations(lexer, block); parseStatements(lexer, block); return block; @@ -80,15 +80,15 @@ public class Parser { isToken(tok, "float")); } - private void parseDeclarations(Lexer lexer, Ast.Block block) { + private void parseDeclarations(Lexer lexer, AST.Block block) { while (isTypeName(currentToken)) { - var type = new Ast.Type(currentToken.str); + var type = new AST.Type(currentToken.str); nextToken(lexer); var tok = currentToken; matchKind(lexer, Token.Kind.IDENT); matchPunctuation(lexer, ";"); - var identifier = new Ast.Identifier(tok); - block.stmtList.add(new Ast.Declare(type, identifier)); + var identifier = new AST.Identifier(tok); + block.stmtList.add(new AST.Declare(type, identifier)); } } @@ -100,16 +100,16 @@ public class Parser { return tok.kind == Token.Kind.PUNCT && isToken(tok, str); } - private void parseStatements(Lexer lexer, Ast.Block block) { + private void parseStatements(Lexer lexer, AST.Block block) { while (!isEOF(currentToken) && !isPunct(currentToken, "}")) { block.stmtList.add(parseStatement(lexer)); } } - private Ast.Statement parseStatement(Lexer lexer) { - Ast.Expr x; - Ast.Statement s1; - Ast.Statement s2; + private AST.Statement parseStatement(Lexer lexer) { + AST.Expr x; + AST.Statement s1; + AST.Statement s2; switch (currentToken.str) { case "if" -> { @@ -119,10 +119,10 @@ public class Parser { matchPunctuation(lexer, ")"); s1 = parseStatement(lexer); if (!isToken(currentToken, "else")) { - return new Ast.IfElse(x, s1, null); + return new AST.IfElse(x, s1, null); } s2 = parseStatement(lexer); - return new Ast.IfElse(x, s1, s2); + return new AST.IfElse(x, s1, s2); } case "while" -> { matchIdentifier(lexer, "while"); @@ -130,12 +130,12 @@ public class Parser { x = parseBool(lexer); matchPunctuation(lexer, ")"); s1 = parseStatement(lexer); - return new Ast.While(x, s1); + return new AST.While(x, s1); } case "break" -> { matchIdentifier(lexer, "break"); matchPunctuation(lexer, ";"); - return new Ast.Break(); + return new AST.Break(); } case "{" -> { return parseBlock(lexer); @@ -146,46 +146,46 @@ public class Parser { } } - private Ast.Statement parseBlock(Lexer lexer) { + private AST.Statement parseBlock(Lexer lexer) { matchPunctuation(lexer, "{"); - var block = new Ast.Block(); + var block = new AST.Block(); parseDeclarations(lexer, block); parseStatements(lexer, block); matchPunctuation(lexer, "}"); return block; } - private Ast.Statement parseAssign(Lexer lexer) { + private AST.Statement parseAssign(Lexer lexer) { Token tok = currentToken; matchKind(lexer, Token.Kind.IDENT); - Ast.Identifier identifier = new Ast.Identifier(tok); + AST.Identifier identifier = new AST.Identifier(tok); matchPunctuation(lexer, "="); - var s = new Ast.Assign(identifier, parseBool(lexer)); + var s = new AST.Assign(identifier, parseBool(lexer)); matchPunctuation(lexer, ";"); return s; } - private Ast.Expr parseBool(Lexer lexer) { + private AST.Expr parseBool(Lexer lexer) { var x = parseAnd(lexer); while (isToken(currentToken, "||")) { var tok = currentToken; nextToken(lexer); - x = new Ast.Binary(tok, x, parseAnd(lexer)); + x = new AST.Binary(tok, x, parseAnd(lexer)); } return x; } - private Ast.Expr parseAnd(Lexer lexer) { + private AST.Expr parseAnd(Lexer lexer) { var x = parseRelational(lexer); while (isToken(currentToken, "&&")) { var tok = currentToken; nextToken(lexer); - x = new Ast.Binary(tok, x, parseRelational(lexer)); + x = new AST.Binary(tok, x, parseRelational(lexer)); } return x; } - private Ast.Expr parseRelational(Lexer lexer) { + private AST.Expr parseRelational(Lexer lexer) { var x = parseAddition(lexer); while (isToken(currentToken, "==") || isToken(currentToken, "!=") || @@ -195,45 +195,45 @@ public class Parser { isToken(currentToken, ">=")) { var tok = currentToken; nextToken(lexer); - x = new Ast.Binary(tok, x, parseAddition(lexer)); + x = new AST.Binary(tok, x, parseAddition(lexer)); } return x; } - private Ast.Expr parseAddition(Lexer lexer) { + private AST.Expr parseAddition(Lexer lexer) { var x = parseMultiplication(lexer); while (isToken(currentToken, "-") || isToken(currentToken, "+")) { var tok = currentToken; nextToken(lexer); - x = new Ast.Binary(tok, x, parseMultiplication(lexer)); + x = new AST.Binary(tok, x, parseMultiplication(lexer)); } return x; } - private Ast.Expr parseMultiplication(Lexer lexer) { + private AST.Expr parseMultiplication(Lexer lexer) { var x = parseUnary(lexer); while (isToken(currentToken, "*") || isToken(currentToken, "/")) { var tok = currentToken; nextToken(lexer); - x = new Ast.Binary(tok, x, parseUnary(lexer)); + x = new AST.Binary(tok, x, parseUnary(lexer)); } return x; } - private Ast.Expr parseUnary(Lexer lexer) { + private AST.Expr parseUnary(Lexer lexer) { if (isToken(currentToken, "-") || isToken(currentToken, "!")) { var tok = currentToken; nextToken(lexer); - return new Ast.Unary(tok, parseUnary(lexer)); + return new AST.Unary(tok, parseUnary(lexer)); } else { return parsePrimary(lexer); } } - private Ast.Expr parsePrimary(Lexer lexer) { + private AST.Expr parsePrimary(Lexer lexer) { switch (currentToken.kind) { case PUNCT -> { /* Nested expression */ @@ -244,12 +244,12 @@ public class Parser { return x; } case NUM -> { - var x = new Ast.Constant(currentToken); + var x = new AST.Constant(currentToken); nextToken(lexer); return x; } case IDENT -> { - var x = new Ast.Symbol(currentToken); + var x = new AST.Symbol(currentToken); nextToken(lexer); return x; } -- cgit v1.2.3