Initialize Template
This commit is contained in:
commit
2b90f84c1e
92
pom.xml
Normal file
92
pom.xml
Normal file
@ -0,0 +1,92 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>de.dhbw.horb</groupId>
|
||||
<artifactId>decaf</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<name>decaf</name>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<maven.compiler.source>19</maven.compiler.source>
|
||||
<maven.compiler.target>19</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.13.1</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.antlr</groupId>
|
||||
<artifactId>antlr4</artifactId>
|
||||
<version>4.11.1</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin> <!-- ANTLR parser generation -->
|
||||
<groupId>org.antlr</groupId>
|
||||
<artifactId>antlr4-maven-plugin</artifactId>
|
||||
<version>4.11.1</version>
|
||||
<configuration>
|
||||
<visitor>true</visitor>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>antlr</id>
|
||||
<goals>
|
||||
<goal>antlr4</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
|
||||
<plugin>
|
||||
<artifactId>maven-clean-plugin</artifactId>
|
||||
<version>3.1.0</version>
|
||||
</plugin>
|
||||
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
|
||||
<plugin>
|
||||
<artifactId>maven-resources-plugin</artifactId>
|
||||
<version>3.0.2</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.8.0</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>2.22.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>3.0.2</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-install-plugin</artifactId>
|
||||
<version>2.5.2</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-deploy-plugin</artifactId>
|
||||
<version>2.8.2</version>
|
||||
</plugin>
|
||||
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
|
||||
<plugin>
|
||||
<artifactId>maven-site-plugin</artifactId>
|
||||
<version>3.7.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-project-info-reports-plugin</artifactId>
|
||||
<version>3.0.0</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
55
src/main/antlr4/de/dhbw/horb/Decaf.g4
Normal file
55
src/main/antlr4/de/dhbw/horb/Decaf.g4
Normal file
@ -0,0 +1,55 @@
|
||||
grammar Decaf;
|
||||
|
||||
program : (var | func)*;
|
||||
|
||||
var : type id ';';
|
||||
type : INT | BOOL | VOID ;
|
||||
|
||||
func : 'def' type id '(' params? ')' block;
|
||||
params : param (',' param)*;
|
||||
param : type id;
|
||||
|
||||
block : '{' var* stmt* '}';
|
||||
|
||||
stmt : loc '=' expr ';' #Assign
|
||||
| funcCall ';' #FunctionCall
|
||||
| 'if' '(' expr ')' block ('else' block)? #If
|
||||
| 'while' '(' expr ')' block #While
|
||||
| 'return' expr ';' #Return
|
||||
| 'return' ';' #ReturnVoid
|
||||
| 'break' ';' #Break
|
||||
| 'continue' ';' #Continue
|
||||
;
|
||||
|
||||
expr : expr binaryOp expr #BinaryOperation
|
||||
| literal #Constant
|
||||
| '(' expr ')' #Expression
|
||||
| funcCall #FunCallExpression
|
||||
| loc #Location
|
||||
;
|
||||
|
||||
binaryOp : ADD | SUB | MUL;
|
||||
|
||||
loc : id ;
|
||||
|
||||
funcCall : id '(' args? ')';
|
||||
args : expr (',' expr)*;
|
||||
|
||||
literal : number | boolean;
|
||||
|
||||
boolean : 'true' | 'false' ;
|
||||
|
||||
number : Number;
|
||||
id : IDENTIFIER;
|
||||
|
||||
SUB : '-';
|
||||
ADD : '+';
|
||||
MUL : '*';
|
||||
|
||||
INT : 'int';
|
||||
BOOL : 'bool';
|
||||
VOID : 'void';
|
||||
|
||||
IDENTIFIER : [a-zA-Z]+;
|
||||
Number : [0-9]+;
|
||||
WS : [ \t\r\n] -> skip;
|
43
src/main/java/de/dhbw/horb/ASTGenerator.java
Normal file
43
src/main/java/de/dhbw/horb/ASTGenerator.java
Normal file
@ -0,0 +1,43 @@
|
||||
package de.dhbw.horb;
|
||||
|
||||
import de.dhbw.horb.ast.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ASTGenerator {
|
||||
|
||||
public static Program generateAST(DecafParser.ProgramContext parseTree){
|
||||
List<Variable> variables = new ArrayList<>();
|
||||
for(DecafParser.VarContext varCtx : parseTree.var()){
|
||||
variables.add(generateVariable(varCtx));
|
||||
}
|
||||
List<Function> funcs = new ArrayList<>();
|
||||
for(DecafParser.FuncContext fctx : parseTree.func()){
|
||||
funcs.add(generateFunc(fctx));
|
||||
}
|
||||
return new Program(variables, funcs);
|
||||
}
|
||||
|
||||
public static Variable generateVariable(DecafParser.VarContext ctx) {
|
||||
return new Variable(ctx.id().getText(), getType(ctx.type()));
|
||||
}
|
||||
|
||||
public static Variable generateVariable(DecafParser.ParamContext ctx) {
|
||||
return new Variable(ctx.id().getText(), getType(ctx.type()));
|
||||
}
|
||||
|
||||
public static Function generateFunc(DecafParser.FuncContext ctx) {
|
||||
throw new RuntimeException("TODO");
|
||||
}
|
||||
|
||||
public static Type getType(DecafParser.TypeContext ctx){
|
||||
if(ctx.INT() != null)
|
||||
return Type.INT;
|
||||
if(ctx.BOOL() != null)
|
||||
return Type.BOOL;
|
||||
if(ctx.VOID() != null)
|
||||
return Type.VOID;
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|
28
src/main/java/de/dhbw/horb/Compiler.java
Normal file
28
src/main/java/de/dhbw/horb/Compiler.java
Normal file
@ -0,0 +1,28 @@
|
||||
package de.dhbw.horb;
|
||||
|
||||
import de.dhbw.horb.ast.*;
|
||||
import org.antlr.v4.runtime.CharStream;
|
||||
import org.antlr.v4.runtime.CharStreams;
|
||||
import org.antlr.v4.runtime.CommonTokenStream;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Decaf language Compiler
|
||||
*/
|
||||
public class Compiler
|
||||
{
|
||||
|
||||
public static Program generateAST(String fromSource){
|
||||
CharStream input = CharStreams.fromString(fromSource);
|
||||
DecafLexer lexer = new DecafLexer(input);
|
||||
CommonTokenStream tokens = new CommonTokenStream(lexer);
|
||||
DecafParser parser = new DecafParser(tokens);
|
||||
DecafParser.ProgramContext tree = parser.program(); //Parsen
|
||||
return ASTGenerator.generateAST(tree);
|
||||
}
|
||||
|
||||
|
||||
}
|
55
src/main/java/de/dhbw/horb/ExpressionGenerator.java
Normal file
55
src/main/java/de/dhbw/horb/ExpressionGenerator.java
Normal file
@ -0,0 +1,55 @@
|
||||
package de.dhbw.horb;
|
||||
|
||||
import de.dhbw.horb.ast.*;
|
||||
|
||||
public class ExpressionGenerator extends DecafBaseVisitor<Expression> {
|
||||
@Override
|
||||
public Expression visitBinaryOperation(DecafParser.BinaryOperationContext ctx) {
|
||||
return generateBinary(ctx);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Expression visitFunCallExpression(DecafParser.FunCallExpressionContext ctx) {
|
||||
throw new RuntimeException("TODO");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Expression visitConstant(DecafParser.ConstantContext ctx) {
|
||||
return generateConstant(ctx.literal());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Expression visitExpression(DecafParser.ExpressionContext ctx) {
|
||||
//ParseTree for ( expr )
|
||||
//Just pass it down to the inner expr:
|
||||
return this.visit(ctx.expr());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Expression visitLocation(DecafParser.LocationContext ctx) {
|
||||
return generateLocation(ctx.loc());
|
||||
}
|
||||
|
||||
public static Expression generateConstant(DecafParser.LiteralContext ctx){
|
||||
if(ctx.number() != null)
|
||||
return new IntConstant(Integer.valueOf(ctx.number().getText()));
|
||||
if(ctx.boolean_() != null)
|
||||
return new BoolConstant(Boolean.valueOf(ctx.boolean_().getText()));
|
||||
throw new RuntimeException();
|
||||
}
|
||||
public static Operator generateOperator(DecafParser.BinaryOpContext ctx){
|
||||
if(ctx.ADD() != null)return Operator.ADD;
|
||||
if(ctx.SUB() != null)return Operator.SUB;
|
||||
if(ctx.MUL() != null)return Operator.MUL;
|
||||
throw new RuntimeException();
|
||||
}
|
||||
public static Binary generateBinary(DecafParser.BinaryOperationContext ctx){
|
||||
ExpressionGenerator eGen = new ExpressionGenerator();
|
||||
return new Binary(eGen.visit(ctx.expr().get(0)) // left side
|
||||
, generateOperator(ctx.binaryOp()) //operator
|
||||
, eGen.visit(ctx.expr().get(1))); //right side
|
||||
}
|
||||
public static Location generateLocation(DecafParser.LocContext loc) {
|
||||
return new Location(loc.id().getText());
|
||||
}
|
||||
}
|
44
src/main/java/de/dhbw/horb/StatementGenerator.java
Normal file
44
src/main/java/de/dhbw/horb/StatementGenerator.java
Normal file
@ -0,0 +1,44 @@
|
||||
package de.dhbw.horb;
|
||||
|
||||
import de.dhbw.horb.ast.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class StatementGenerator extends DecafBaseVisitor<Statement> {
|
||||
@Override
|
||||
public Statement visitAssign(DecafParser.AssignContext ctx) {
|
||||
throw new RuntimeException("TODO");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Statement visitIf(DecafParser.IfContext ctx) {
|
||||
throw new RuntimeException("TODO");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Statement visitWhile(DecafParser.WhileContext ctx) {
|
||||
throw new RuntimeException("TODO");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Statement visitReturn(DecafParser.ReturnContext ctx) {
|
||||
throw new RuntimeException("TODO");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Statement visitReturnVoid(DecafParser.ReturnVoidContext ctx) {
|
||||
throw new RuntimeException("TODO");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Statement visitBreak(DecafParser.BreakContext ctx) {
|
||||
throw new RuntimeException("TODO");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Statement visitContinue(DecafParser.ContinueContext ctx) {
|
||||
throw new RuntimeException("TODO");
|
||||
}
|
||||
|
||||
}
|
4
src/main/java/de/dhbw/horb/ast/ASTVisitor.java
Normal file
4
src/main/java/de/dhbw/horb/ast/ASTVisitor.java
Normal file
@ -0,0 +1,4 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
public class ASTVisitor<T> {
|
||||
}
|
6
src/main/java/de/dhbw/horb/ast/Assignment.java
Normal file
6
src/main/java/de/dhbw/horb/ast/Assignment.java
Normal file
@ -0,0 +1,6 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record Assignment(Location loc, Expression value) implements Statement {
|
||||
}
|
8
src/main/java/de/dhbw/horb/ast/Binary.java
Normal file
8
src/main/java/de/dhbw/horb/ast/Binary.java
Normal file
@ -0,0 +1,8 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
import de.dhbw.horb.ExpressionGenerator;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record Binary(Expression left, Operator op, Expression right) implements Expression{
|
||||
}
|
7
src/main/java/de/dhbw/horb/ast/Block.java
Normal file
7
src/main/java/de/dhbw/horb/ast/Block.java
Normal file
@ -0,0 +1,7 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public record Block(List<Variable> vars, List<Statement> stmts) implements Node {
|
||||
}
|
6
src/main/java/de/dhbw/horb/ast/BoolConstant.java
Normal file
6
src/main/java/de/dhbw/horb/ast/BoolConstant.java
Normal file
@ -0,0 +1,6 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record BoolConstant(Boolean value) implements Expression {
|
||||
}
|
6
src/main/java/de/dhbw/horb/ast/Break.java
Normal file
6
src/main/java/de/dhbw/horb/ast/Break.java
Normal file
@ -0,0 +1,6 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record Break() implements Statement {
|
||||
}
|
6
src/main/java/de/dhbw/horb/ast/Continue.java
Normal file
6
src/main/java/de/dhbw/horb/ast/Continue.java
Normal file
@ -0,0 +1,6 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record Continue() implements Statement {
|
||||
}
|
4
src/main/java/de/dhbw/horb/ast/Expression.java
Normal file
4
src/main/java/de/dhbw/horb/ast/Expression.java
Normal file
@ -0,0 +1,4 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
public sealed interface Expression extends Node permits Binary, IntConstant, BoolConstant, Location, FunctionCall {
|
||||
}
|
7
src/main/java/de/dhbw/horb/ast/Function.java
Normal file
7
src/main/java/de/dhbw/horb/ast/Function.java
Normal file
@ -0,0 +1,7 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record Function(Type type, String name, List<Variable> params,
|
||||
Block block) implements Node {
|
||||
}
|
6
src/main/java/de/dhbw/horb/ast/FunctionCall.java
Normal file
6
src/main/java/de/dhbw/horb/ast/FunctionCall.java
Normal file
@ -0,0 +1,6 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record FunctionCall(String name, List<Expression> args) implements Expression {
|
||||
}
|
6
src/main/java/de/dhbw/horb/ast/IfElse.java
Normal file
6
src/main/java/de/dhbw/horb/ast/IfElse.java
Normal file
@ -0,0 +1,6 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record IfElse(Expression cond, Block ifBlock, Block elseBlock) implements Statement {
|
||||
}
|
6
src/main/java/de/dhbw/horb/ast/IntConstant.java
Normal file
6
src/main/java/de/dhbw/horb/ast/IntConstant.java
Normal file
@ -0,0 +1,6 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record IntConstant(Integer value) implements Expression {
|
||||
}
|
6
src/main/java/de/dhbw/horb/ast/Location.java
Normal file
6
src/main/java/de/dhbw/horb/ast/Location.java
Normal file
@ -0,0 +1,6 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record Location(String name) implements Expression {
|
||||
}
|
6
src/main/java/de/dhbw/horb/ast/Node.java
Normal file
6
src/main/java/de/dhbw/horb/ast/Node.java
Normal file
@ -0,0 +1,6 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface Node {
|
||||
}
|
7
src/main/java/de/dhbw/horb/ast/Operator.java
Normal file
7
src/main/java/de/dhbw/horb/ast/Operator.java
Normal file
@ -0,0 +1,7 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
public enum Operator {
|
||||
ADD,
|
||||
SUB,
|
||||
MUL
|
||||
}
|
6
src/main/java/de/dhbw/horb/ast/Program.java
Normal file
6
src/main/java/de/dhbw/horb/ast/Program.java
Normal file
@ -0,0 +1,6 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record Program(List<Variable> variables, List<Function> methods) implements Node {
|
||||
}
|
7
src/main/java/de/dhbw/horb/ast/Return.java
Normal file
7
src/main/java/de/dhbw/horb/ast/Return.java
Normal file
@ -0,0 +1,7 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public record Return(Expression ret) implements Statement {
|
||||
}
|
6
src/main/java/de/dhbw/horb/ast/ReturnVoid.java
Normal file
6
src/main/java/de/dhbw/horb/ast/ReturnVoid.java
Normal file
@ -0,0 +1,6 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record ReturnVoid() implements Statement {
|
||||
}
|
4
src/main/java/de/dhbw/horb/ast/Statement.java
Normal file
4
src/main/java/de/dhbw/horb/ast/Statement.java
Normal file
@ -0,0 +1,4 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
public sealed interface Statement extends Node permits Assignment, VoidFunctionCall, IfElse, While, Return, ReturnVoid, Break, Continue {
|
||||
}
|
7
src/main/java/de/dhbw/horb/ast/Type.java
Normal file
7
src/main/java/de/dhbw/horb/ast/Type.java
Normal file
@ -0,0 +1,7 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
public enum Type {
|
||||
INT,
|
||||
BOOL,
|
||||
VOID
|
||||
}
|
6
src/main/java/de/dhbw/horb/ast/Variable.java
Normal file
6
src/main/java/de/dhbw/horb/ast/Variable.java
Normal file
@ -0,0 +1,6 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record Variable(String name, Type type) implements Node{
|
||||
}
|
4
src/main/java/de/dhbw/horb/ast/VoidFunctionCall.java
Normal file
4
src/main/java/de/dhbw/horb/ast/VoidFunctionCall.java
Normal file
@ -0,0 +1,4 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
public record VoidFunctionCall(FunctionCall expr) implements Statement {
|
||||
}
|
6
src/main/java/de/dhbw/horb/ast/While.java
Normal file
6
src/main/java/de/dhbw/horb/ast/While.java
Normal file
@ -0,0 +1,6 @@
|
||||
package de.dhbw.horb.ast;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public record While(Expression cond, Block block) implements Statement {
|
||||
}
|
32
src/test/java/de/dhbw/horb/CompilerTest.java
Normal file
32
src/test/java/de/dhbw/horb/CompilerTest.java
Normal file
@ -0,0 +1,32 @@
|
||||
package de.dhbw.horb;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import de.dhbw.horb.ast.Program;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* Unit test for simple App.
|
||||
*/
|
||||
public class CompilerTest
|
||||
{
|
||||
/**
|
||||
* Rigorous Test :-)
|
||||
*/
|
||||
@Test
|
||||
public void generateASTTest()
|
||||
{
|
||||
String inputString = "def int add(int x, int y)\n" +
|
||||
"{\n" +
|
||||
"return x + y;\n" +
|
||||
"}\n" +
|
||||
"def int main()\n" +
|
||||
"{\n" +
|
||||
"int a;\n" +
|
||||
"a = 3;\n" +
|
||||
"return add(a, 2);\n" +
|
||||
"}";
|
||||
Program ast = Compiler.generateAST(inputString);
|
||||
assertTrue( ast.methods().size() == 2 );
|
||||
}
|
||||
}
|
64
src/test/java/de/dhbw/horb/ExpressionGeneratorTest.java
Normal file
64
src/test/java/de/dhbw/horb/ExpressionGeneratorTest.java
Normal file
@ -0,0 +1,64 @@
|
||||
package de.dhbw.horb;
|
||||
|
||||
import de.dhbw.horb.ast.*;
|
||||
import org.antlr.v4.runtime.CharStream;
|
||||
import org.antlr.v4.runtime.CharStreams;
|
||||
import org.antlr.v4.runtime.CommonTokenStream;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
* Unit test for AST Generation of Expressions.
|
||||
*/
|
||||
public class ExpressionGeneratorTest
|
||||
{
|
||||
@Test
|
||||
public void binaryTest()
|
||||
{
|
||||
Expression binary = generateExpression("x + 3");
|
||||
assertTrue(binary instanceof Binary);
|
||||
assertTrue( ((Binary) binary).left() instanceof Location);
|
||||
assertTrue( ((Binary) binary).right() instanceof IntConstant);
|
||||
}
|
||||
@Test
|
||||
public void locationTest()
|
||||
{
|
||||
Expression location = generateExpression("x");
|
||||
assertTrue(location instanceof Location);
|
||||
assertTrue(((Location) location).name().equals("x"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void methodCallTest()
|
||||
{
|
||||
Expression mCall = generateExpression("m(x,y)");
|
||||
assertTrue(mCall instanceof FunctionCall);
|
||||
assertTrue(((FunctionCall) mCall).name().equals("m"));
|
||||
assertTrue(((FunctionCall) mCall).args().size() == 2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void intConstantTest()
|
||||
{
|
||||
Expression intCons = generateExpression("3");
|
||||
assertTrue(intCons instanceof IntConstant);
|
||||
assertTrue(((IntConstant) intCons).value() == 3);
|
||||
}
|
||||
@Test
|
||||
public void boolConstantTest()
|
||||
{
|
||||
Expression boolCons = generateExpression("true");
|
||||
assertTrue(boolCons instanceof BoolConstant);
|
||||
assertTrue(((BoolConstant) boolCons).value() == true);
|
||||
}
|
||||
|
||||
private Expression generateExpression(String from){
|
||||
String inputString = from;
|
||||
CharStream input = CharStreams.fromString(inputString);
|
||||
DecafLexer lexer = new DecafLexer(input);
|
||||
CommonTokenStream tokens = new CommonTokenStream(lexer);
|
||||
DecafParser parser = new DecafParser(tokens);
|
||||
return new ExpressionGenerator().visit(parser.expr());
|
||||
}
|
||||
}
|
32
src/test/java/de/dhbw/horb/StatementGeneratorTest.java
Normal file
32
src/test/java/de/dhbw/horb/StatementGeneratorTest.java
Normal file
@ -0,0 +1,32 @@
|
||||
package de.dhbw.horb;
|
||||
|
||||
import de.dhbw.horb.ast.*;
|
||||
import org.antlr.v4.runtime.CharStream;
|
||||
import org.antlr.v4.runtime.CharStreams;
|
||||
import org.antlr.v4.runtime.CommonTokenStream;
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
* Unit test for AST Generation of Expressions.
|
||||
*/
|
||||
public class StatementGeneratorTest
|
||||
{
|
||||
@Test
|
||||
public void whileTest()
|
||||
{
|
||||
Statement whileStmt = generateStatement("while(true){}");
|
||||
assertTrue(whileStmt instanceof While);
|
||||
assertTrue( ((While) whileStmt).block().stmts().size() == 0);
|
||||
}
|
||||
|
||||
private Statement generateStatement(String from){
|
||||
String inputString = from;
|
||||
CharStream input = CharStreams.fromString(inputString);
|
||||
DecafLexer lexer = new DecafLexer(input);
|
||||
CommonTokenStream tokens = new CommonTokenStream(lexer);
|
||||
DecafParser parser = new DecafParser(tokens);
|
||||
return new StatementGenerator().visit(parser.stmt());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user