Skip to content

Commit

Permalink
Add project files
Browse files Browse the repository at this point in the history
  • Loading branch information
g10ria committed Aug 19, 2022
0 parents commit dc66a53
Show file tree
Hide file tree
Showing 74 changed files with 6,159 additions and 0 deletions.
44 changes: 44 additions & 0 deletions .classpath
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" path="target/generated-sources/annotations">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="target/generated-test-sources/test-annotations">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
<attribute name="ignore_optional_problems" value="true"/>
<attribute name="m2e-apt" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.settings
.vscode
target/
23 changes: 23 additions & 0 deletions .project
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>universe</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
</projectDescription>
13 changes: 13 additions & 0 deletions README.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Project Info
A program that compiles (into MIPS Assembly) or interprets code written in a generic programming language.

Written using Maven. A tester file can be located at `src/main/java/com/pilers/tester/Tester.java`.

Steps:
1. The preprocessor handles macros (i.e. #include) and pipes the input program as a stream of bytes to the scanner.
2. Lexical analysis: the scanner scans the stream of bytes into a stream of tokens - entities that store their own type (Integer, String, or Boolean), value as a string, and line number. It transfers this stream of tokens to the parser.
3. Syntax analysis: the parser parses the stream of tokens into an abstract syntax tree (AST). It passes this tree to an environment, which acts as a manager for variable and function values. The object nature of Environments allows the creation of sub-Environments, which allows the usage of local variables inside a function that don't affect variables of the same name outside of the function. Note that the parser returns a Program object which acts as the root node ofthe AST.
4. If the program is set to interpret, see step 5. If the program is set to compile, see steps 6 and 7.
5. The program is executed using an interpreter environment, which essentially acts as a map of variable values.
6. The program is analyzed using a semantic analysis environment, which performs actions such as type checking, seeing if a variable exists when it is referenced, etc.
7. The program is compiled into MIPS Assembly code using an Emitter in a specified filepath.
Binary file added all.asm
Binary file not shown.
Binary file added demo.asm
Binary file not shown.
75 changes: 75 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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>com.pilers.app</groupId>
<artifactId>universe</artifactId>
<version>1.0-SNAPSHOT</version>

<name>universe</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- 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>
</pluginManagement>
</build>
</project>
Binary file added printSquares.asm
Binary file not shown.
1 change: 1 addition & 0 deletions public/printHello.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
writeln("Hello from the internet!");
88 changes: 88 additions & 0 deletions src/main/java/com/pilers/ast/Assignment.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package com.pilers.ast;

import com.pilers.emitter.Emitter;
import com.pilers.environment.*;
import com.pilers.errors.ErrorString;
import com.pilers.errors.InterpretException;
import com.pilers.errors.CompileException;

/**
* AST Assignment class
* Represents the assignment of a value to a variable
*
* @author Gloria Zhu
*/
public class Assignment extends Statement
{
private String var;
private Expression exp;

/**
* Constructs an Assignment object
*
* @param var the name of the variable
* @param exp an expression for the value
* @throws TypeErrorException
*/
public Assignment(String var, Expression exp)
{
this.var = var;
this.exp = exp;
}

/**
* Executes the assignment
*
* @param env the execution environment (InterpreterEnvironment)
* @throws BreakException if a break statement is executed
* @throws ContinueException if a continue statement is executed
* @throws InterpretException if there is a runtime error in assignment
* Happens if the varaible does not exist,
* or there is a type discrepancy between the
* variable and value
*/
public void exec(InterpreterEnvironment env)
throws BreakException, ContinueException, InterpretException
{
env.setVariable(var, exp.eval(env));
}

/**
* Semantic analysis for assignment
* Checks if the variable exists and the types are compatible
*
* @throws CompileException if the conditions above are broken
* @param env the current environment
*/
public void analyze(SemanticAnalysisEnvironment env) throws CompileException
{
exp.analyze(env);

String expectedType = env.getVariableType(var);

if (expectedType == null) throw new CompileException(ErrorString.unknownIdentifier(var));

if (!expectedType.equals(exp.type))
throw new CompileException(ErrorString.typeAssignment(expectedType, exp.type));
}

/**
* Compiles the assignment
* The specific depends on the type of the varaible
*
* @param e the emitter
*/
public void compile(Emitter e)
{
exp.compile(e); // most recent value is in v0

if (e.isGlobalVariable(var)) e.emit("sw $v0 "+"_data_"+var);
else
{
int index = e.getLocalVarIndex(var);
e.emit("sw $v0 " + index * 4 + "($sp)");
}

}

}
Loading

0 comments on commit dc66a53

Please sign in to comment.