diff --git a/README.md b/README.md new file mode 100644 index 0000000..bd1aad9 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# Compiler design homework assignment + +The goal is to create a compiler from a subset of Java (JavaLi) to 32bit Intel assembly. The structure is the following: + +* HW0: write an assembly program that reads numbers (not graded). [PDF](./docs/hw0.pdf) +* HW1: implement a code generator that translates assignment statements to IA32. [PDF](./docs/hw1/hw1.pdf) +* HW2: construct a lexer (lexical analyzer) and a parser (syntax analyzer) for the complete JavaLi programming language. [PDF](./docs/hw2/hw2.pdf) +* HW3: develop a semantic analyzer. [PDF](./docs/hw3.pdf) +* HW4: build a IA32 back-end for the compiler, a generator of IA32 for the complete JavaLi language. [PDF](./docs/hw4.pdf) +* HWB: implement as many optimizations as possible (focusing on speed and correctness). [PDF](./docs/hw5.pdf) +* HWC: review the code of other teams for HW1 and write up a report. [PDF](./docs/hwc.pdf) +* HWD: review the code of other teams for HW4 and write up a report. [PDF](./docs/hwd.pdf) + +## License + +Copyright (c) 2018 Carlos Galindo, Levin Moser, teaching group of Compiler Design (ETH Zürich). All rights reserved. diff --git a/docs/HW3-slides.pdf b/docs/HW3-slides.pdf new file mode 100644 index 0000000..a93fd2a Binary files /dev/null and b/docs/HW3-slides.pdf differ diff --git a/docs/HW4-slides.pdf b/docs/HW4-slides.pdf new file mode 100644 index 0000000..f7624f6 Binary files /dev/null and b/docs/HW4-slides.pdf differ diff --git a/docs/HW5-slides.pdf b/docs/HW5-slides.pdf new file mode 100644 index 0000000..14d1816 Binary files /dev/null and b/docs/HW5-slides.pdf differ diff --git a/docs/hw0.pdf b/docs/hw0.pdf new file mode 100644 index 0000000..2eae243 Binary files /dev/null and b/docs/hw0.pdf differ diff --git a/docs/hw1/HW1-SS18.pdf b/docs/hw1/HW1-SS18.pdf new file mode 100644 index 0000000..ccb2953 Binary files /dev/null and b/docs/hw1/HW1-SS18.pdf differ diff --git a/docs/hw1/HW1-SS18.pptx b/docs/hw1/HW1-SS18.pptx new file mode 100644 index 0000000..00db1f3 Binary files /dev/null and b/docs/hw1/HW1-SS18.pptx differ diff --git a/docs/hw1/SimpleVisitor.java b/docs/hw1/SimpleVisitor.java new file mode 100644 index 0000000..3d1f13f --- /dev/null +++ b/docs/hw1/SimpleVisitor.java @@ -0,0 +1,49 @@ +import java.lang.*; + +abstract class TreeNode { + public int key; + public TreeNode leftchild; + public TreeNode rightchild; + + public TreeNode(int k, TreeNode left, TreeNode right) { + key = k; + leftchild = left; + rightchild = right; + } +} + +class BlueNode extends TreeNode { + public BlueNode(int k, TreeNode left, TreeNode right) { super(k, left, right); } +} + +class GreenNode extends TreeNode { + public GreenNode(int k, TreeNode left, TreeNode right) { super(k, left, right); } +} + +class Visitor { + public void visit(TreeNode node) { + System.out.print(node.key + ": "); + + if (node instanceof BlueNode) + System.out.println("Blue"); + else if (node instanceof GreenNode) + System.out.println("Green"); + + if (node.leftchild != null) visit(node.leftchild); + if (node.rightchild != null) visit(node.rightchild); + } +} + +public class SimpleVisitor { + public static void main(String [] args) { + TreeNode root = new BlueNode(1, + new GreenNode(21, + new BlueNode(31, null, null), + new GreenNode(32, null, null)), + new GreenNode(22, + new BlueNode(33, null, null), + new GreenNode(34, null, null))); + Visitor v = new Visitor(); + v.visit(root); + } +} diff --git a/docs/hw1/VisitorPattern.java b/docs/hw1/VisitorPattern.java new file mode 100644 index 0000000..90ba158 --- /dev/null +++ b/docs/hw1/VisitorPattern.java @@ -0,0 +1,62 @@ +import java.lang.*; + +abstract class TreeNode { + public int key; + public TreeNode leftchild; + public TreeNode rightchild; + + public TreeNode(int k, TreeNode left, TreeNode right) { + key = k; + leftchild = left; + rightchild = right; + } + + public abstract void accept(Visitor v); +} + +class BlueNode extends TreeNode { + public BlueNode(int k, TreeNode left, TreeNode right) { super(k, left, right); } + + public void accept(Visitor v) { + v.blueNode(this); + } +} + +class GreenNode extends TreeNode { + public GreenNode(int k, TreeNode left, TreeNode right) { super(k, left, right); } + + public void accept(Visitor v) { + v.greenNode(this); + } +} + +class Visitor { + public void blueNode(BlueNode node) { + System.out.print(node.key + ": "); + System.out.println("Blue"); + + if (node.leftchild != null) node.leftchild.accept(this); + if (node.rightchild != null) node.rightchild.accept(this); + } + + public void greenNode(GreenNode node) { + System.out.print(node.key + ": "); + System.out.println("Green"); + + if (node.leftchild != null) node.leftchild.accept(this); + if (node.rightchild != null) node.rightchild.accept(this); + } +} + +public class VisitorPattern { + public static void main(String [] args) { + TreeNode root = new BlueNode(1, + new GreenNode(21, + new BlueNode(31, null, null), + new GreenNode(32, null, null)), + new GreenNode(22, + new BlueNode(33, null, null), + new GreenNode(34, null, null))); + root.accept(new Visitor()); + } +} diff --git a/docs/hw1/hw1.pdf b/docs/hw1/hw1.pdf new file mode 100644 index 0000000..53628a2 Binary files /dev/null and b/docs/hw1/hw1.pdf differ diff --git a/docs/hw2/HW2-slides.pdf b/docs/hw2/HW2-slides.pdf new file mode 100644 index 0000000..7a8754e Binary files /dev/null and b/docs/hw2/HW2-slides.pdf differ diff --git a/docs/hw2/hw2.pdf b/docs/hw2/hw2.pdf new file mode 100644 index 0000000..78f7b42 Binary files /dev/null and b/docs/hw2/hw2.pdf differ diff --git a/docs/hw3.pdf b/docs/hw3.pdf new file mode 100644 index 0000000..6249dee Binary files /dev/null and b/docs/hw3.pdf differ diff --git a/docs/hw4.pdf b/docs/hw4.pdf new file mode 100644 index 0000000..ba01be3 Binary files /dev/null and b/docs/hw4.pdf differ diff --git a/docs/hw5.pdf b/docs/hw5.pdf new file mode 100644 index 0000000..6c3df95 Binary files /dev/null and b/docs/hw5.pdf differ diff --git a/docs/hwc.pdf b/docs/hwc.pdf new file mode 100644 index 0000000..efeb740 Binary files /dev/null and b/docs/hwc.pdf differ diff --git a/docs/hwd.pdf b/docs/hwd.pdf new file mode 100644 index 0000000..a77e4f9 Binary files /dev/null and b/docs/hwd.pdf differ