From 0c531ffff929a6019bc02bb7bd40e55c7dec5e22 Mon Sep 17 00:00:00 2001 From: atusa17 Date: Mon, 15 Oct 2018 12:47:14 -0600 Subject: [PATCH] Initial Commit --- Corgi/Basic.java | 271 +++++ Corgi/Camera.java | 330 ++++++ Corgi/Corgi.java | 25 + Corgi/Lexer.java | 275 +++++ Corgi/MemTable.java | 75 ++ Corgi/Node.java | 223 ++++ Corgi/Parser.java | 202 ++++ Corgi/Tests/factorial | 20 + Corgi/Tests/quadroots | 23 + Corgi/Token.java | 31 + Corgi/TreeViewer.java | 78 ++ Corgi/corgiCFG.txt | 66 ++ Corgi/oldCorgi.txt | 19 + Corgi/partialNode.java | 87 ++ Corgi/quadroots | 16 + Documents/announcements | 25 + Documents/implementation.pdf | Bin 0 -> 139308 bytes Documents/implementation.tex | 757 +++++++++++++ Documents/intro.pdf | Bin 0 -> 152906 bytes Documents/intro.tex | 1945 ++++++++++++++++++++++++++++++++++ Documents/parser | 143 +++ Documents/policies.pdf | Bin 0 -> 47362 bytes Documents/policies.tex | 262 +++++ Documents/schedule.tex | 89 ++ Jive/IntPair.java | 8 + Jive/Jive.java | 948 +++++++++++++++++ Jive/README | 67 ++ Jive/StringIntPair.java | 20 + Jive/Tests/calls | 31 + Jive/Tests/factorial | 21 + Jive/Tests/factorial.doc | 44 + Jive/Tests/factorial.vpl | 29 + Jive/Tests/fizzbuzz | 27 + Jive/Tests/globs | 15 + Jive/Tests/listio | 51 + Jive/Tests/lits | 10 + Jive/Tests/pastri | 22 + Jive/Tests/pastri2 | 71 ++ Jive/Tests/sillytest | 13 + Jive/Tests/tiny | 7 + Jive/VPL.save | Bin 0 -> 6658 bytes Jive/sept17 | 77 ++ Jive/sept17.doc | 101 ++ Jive/sept17.vpl | 71 ++ Project2 | 1 + VPL/IntPair.java | 8 + VPL/VPL.java | 309 ++++++ VPL/ex1a | 17 + VPL/ex1b | 33 + VPL/ex1c | 28 + VPL/ex1d | 43 + VPL/ex2 | 23 + VPL/ex3 | 103 ++ VPL/ex4 | 32 + VPL/someUnitTests | 93 ++ 55 files changed, 7285 insertions(+) create mode 100755 Corgi/Basic.java create mode 100755 Corgi/Camera.java create mode 100755 Corgi/Corgi.java create mode 100755 Corgi/Lexer.java create mode 100755 Corgi/MemTable.java create mode 100755 Corgi/Node.java create mode 100755 Corgi/Parser.java create mode 100755 Corgi/Tests/factorial create mode 100755 Corgi/Tests/quadroots create mode 100755 Corgi/Token.java create mode 100755 Corgi/TreeViewer.java create mode 100755 Corgi/corgiCFG.txt create mode 100755 Corgi/oldCorgi.txt create mode 100755 Corgi/partialNode.java create mode 100755 Corgi/quadroots create mode 100755 Documents/announcements create mode 100755 Documents/implementation.pdf create mode 100755 Documents/implementation.tex create mode 100755 Documents/intro.pdf create mode 100755 Documents/intro.tex create mode 100755 Documents/parser create mode 100755 Documents/policies.pdf create mode 100755 Documents/policies.tex create mode 100755 Documents/schedule.tex create mode 100755 Jive/IntPair.java create mode 100755 Jive/Jive.java create mode 100755 Jive/README create mode 100755 Jive/StringIntPair.java create mode 100755 Jive/Tests/calls create mode 100755 Jive/Tests/factorial create mode 100755 Jive/Tests/factorial.doc create mode 100755 Jive/Tests/factorial.vpl create mode 100755 Jive/Tests/fizzbuzz create mode 100755 Jive/Tests/globs create mode 100755 Jive/Tests/listio create mode 100755 Jive/Tests/lits create mode 100755 Jive/Tests/pastri create mode 100755 Jive/Tests/pastri2 create mode 100755 Jive/Tests/sillytest create mode 100755 Jive/Tests/tiny create mode 100755 Jive/VPL.save create mode 100755 Jive/sept17 create mode 100755 Jive/sept17.doc create mode 100755 Jive/sept17.vpl create mode 100755 Project2 create mode 100755 VPL/IntPair.java create mode 100755 VPL/VPL.java create mode 100755 VPL/ex1a create mode 100755 VPL/ex1b create mode 100755 VPL/ex1c create mode 100755 VPL/ex1d create mode 100755 VPL/ex2 create mode 100755 VPL/ex3 create mode 100755 VPL/ex4 create mode 100755 VPL/someUnitTests diff --git a/Corgi/Basic.java b/Corgi/Basic.java new file mode 100755 index 0000000..6ce2d6d --- /dev/null +++ b/Corgi/Basic.java @@ -0,0 +1,271 @@ +/* basic application to be extended +*/ + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.util.ArrayList; + +public class Basic extends JFrame implements Runnable, KeyListener, + MouseListener, + MouseMotionListener, + WindowListener +{ + protected static int FPS = 50; // desired frames per second + + private int stepNumber; + + // part of the basic framework + private Thread theThread; //to control the animation + + private boolean waiting; + + protected int pixelWidth, pixelHeight; // dimensions of window in pixels + private int ulcX, ulcY; // location of upper left corner of window on screen + + private Color backgroundColor; // background color of entire window + + private double mouseX, mouseY; // maintain correct mouse location + private int whichCamera; // maintain which camera's pixel grid region mouse is in + + private Graphics dbg; + private Image dbImage = null; + + protected ArrayList cameras; + + public Basic( String title, int ulx, int uly, int pw, int ph ) + { + super( title ); // call JFrame + + ulcX = ulx; ulcY = uly; + pixelWidth = pw; pixelHeight = ph; + + setBounds(ulcX, ulcY, pixelWidth, pixelHeight ); + setResizable( false ); + + addKeyListener(this); + // setFocusable(true); +// requestFocus(); + addMouseListener(this); + addMouseMotionListener(this); + addWindowListener(this); + + cameras = new ArrayList(); + + stepNumber = 0; + + // force mouse to be in center of window at start + mouseX = pixelWidth/2; + mouseY = pixelHeight/2; + + } + + public void start() + { + setVisible(true); + + // physically draw the mouse cursor where we want it + try{ + Robot rob = new Robot(); + rob.mouseMove( ulcX+pixelWidth/2, ulcY+pixelHeight/2 ); + }catch(Exception e){} + + if (theThread == null) + theThread = new Thread(this); + theThread.start(); + } + + public void run() + { + while (true) + { + stepNumber++; + + long startTime = System.nanoTime(); + + render(); + paintScreen(); + + long stopTime = System.nanoTime(); + + double elapsed = (stopTime-startTime)/1000000.0; // milliseconds + + int waitTime = 1000/FPS - (int) Math.round( elapsed ); + if( waitTime < 1 ) + waitTime = 1; + + try { + Thread.sleep(waitTime); + } + catch (InterruptedException ie) + {System.err.println("OOPS");} + } + } + + private void render() + { + if( dbImage == null ) + {// create the buffer + dbImage = createImage( pixelWidth, pixelHeight ); + if( dbImage == null ) + { + System.out.println("dbImage is null???"); + return; + } + else + {// dbg is created, tell Camera + dbg = dbImage.getGraphics(); + Camera.setGraphicsContext( dbg ); + } + } + + // clear the background of entire window + dbg.setColor( backgroundColor ); + dbg.fillRect(0,0,pixelWidth,pixelHeight); + + // give app a chance to update its instance variables + // and then draw stuff to dbg + + step(); + } + + private void paintScreen() + { + Graphics gr; + try{ + gr = this.getGraphics(); + if( gr != null && dbImage != null ) + gr.drawImage(dbImage,0,0,null); + Toolkit.getDefaultToolkit().sync(); // maybe not needed? + gr.dispose(); + } + catch(Exception e) + { + System.out.println("graphics context error" + e ); + System.exit(1); + } + } + + // override this method with code to display stuff + // and update app instance variables + public void step() + { + System.out.println("Step number: " + getStepNumber() ); + } + + public int getStepNumber() + { + return stepNumber; + } + + // implement KeyListener: + // ****************************************************************** + public void keyPressed(KeyEvent e){} + public void keyReleased(KeyEvent e){} + public void keyTyped(KeyEvent e){} + + // implement MouseListener: + // ****************************************************************** + public void mouseClicked(MouseEvent e) + { + updateMouse(e); + } + public void mouseEntered(MouseEvent e) + { + updateMouse(e); + } + public void mouseExited(MouseEvent e) + { + updateMouse(e); + } + public void mousePressed(MouseEvent e) + { + updateMouse(e); + } + public void mouseReleased(MouseEvent e) + { + updateMouse(e); + } + + // implement MouseMotionListener: + // ****************************************************************** + public void mouseDragged(MouseEvent e) + { + updateMouse(e); + } + public void mouseMoved(MouseEvent e) + { + updateMouse(e); + } + + private void updateMouse( MouseEvent e ) + { + int ix = e.getX(), iy = e.getY(); + + // determine which camera this mouse event hits + // and compute mouseX, mouseY in that camera's graph paper coords + + whichCamera = -1; + Camera ac=null, temp; + + for( int k=0; k + Node root = parser.parseProgram(); + + // display parse tree for debugging/testing: + TreeViewer viewer = new TreeViewer("Parse Tree", 0, 0, 800, 500, root ); + + // execute the parse tree +// root.execute(); + + }// main + +} diff --git a/Corgi/Lexer.java b/Corgi/Lexer.java new file mode 100755 index 0000000..94f4840 --- /dev/null +++ b/Corgi/Lexer.java @@ -0,0 +1,275 @@ +import java.io.BufferedReader; +import java.io.FileReader; +import java.util.Scanner; +import java.util.Stack; +public class Lexer { + + public static String margin = ""; + + // holds any number of tokens that have been put back + private Stack stack; + + // the source of physical symbols + // (use BufferedReader instead of Scanner because it can + // read a single physical symbol) + private BufferedReader input; + + // one lookahead physical symbol + private int lookahead; + + // construct a Lexer ready to produce tokens from a file + public Lexer( String fileName ) { + try { + input = new BufferedReader( new FileReader( fileName ) ); + } + catch(Exception e) { + error("Problem opening file named [" + fileName + "]" ); + } + stack = new Stack(); + lookahead = 0; // indicates no lookahead symbol present + }// constructor + + // produce the next token + private Token getNext() { + if( ! stack.empty() ) { + // produce the most recently putback token + Token token = stack.pop(); + return token; + } + else { + // produce a token from the input source + + int state = 1; // state of FA + String data = ""; // specific info for the token + boolean done = false; + int sym; // holds current symbol + + do { + sym = getNextSymbol(); + +// System.out.println("current symbol: " + sym + " state = " + state ); + + if ( state == 1 ) { + if ( sym == 9 || sym == 10 || sym == 13 || + sym == 32 ) {// whitespace + state = 1; + } + else if ( 'a'<=sym && sym<='z' ) {// lowercase + data += (char) sym; + state = 2; + } + else if ( digit( sym ) ) { + data += (char) sym; + state = 3; + } + else if ( sym == '.' ) { + data += (char) sym; + state = 5; + } + else if ( sym == '\"' ) { + state = 6; + } + else if ( sym == '+' || sym == '-' || sym == '*' || + sym == '/' || sym == '(' || sym == ')' || + sym == ',' || sym == '=' + ) { + data += (char) sym; + state = 8; + done = true; + } + else if ( sym == -1 ) {// end of file + state = 9; + done = true; + } + else { + error("Error in lexical analysis phase with symbol " + + sym + " in state " + state ); + } + } + + else if ( state == 2 ) { + if ( letter(sym) || digit(sym) ) { + data += (char) sym; + state = 2; + } + else {// done with variable token + putBackSymbol( sym ); + done = true; + } + } + + else if ( state == 3 ) { + if ( digit(sym) ) { + data += (char) sym; + state = 3; + } + else if ( sym == '.' ) { + data += (char) sym; + state = 4; + } + else {// done with number token + putBackSymbol( sym ); + done = true; + } + + } + + else if ( state == 4 ) { + if ( digit(sym) ) { + data += (char) sym; + state = 4; + } + else {// done with number token + putBackSymbol( sym ); + done = true; + } + } + + else if ( state == 5 ) { + if ( digit(sym) ) { + data += (char) sym; + state = 4; + } + else { + error("Error in lexical analysis phase with symbol " + + sym + " in state " + state ); + } + } + + else if ( state == 6 ) { + if ( (' '<=sym && sym<='~') && sym != '\"' ) { + data += (char) sym; + state = 6; + } + else if ( sym == '\"' ) { + state = 7; + done = true; + } + } + + // note: states 7, 8, and 9 are accepting states with + // no arcs out of them, so they are handled + // in the arc going into them + }while( !done ); + + // generate token depending on stopping state + Token token; + + if ( state == 2 ) { + // see if data matches any special words + if ( data.equals("input") ) { + return new Token( "bif0", data ); + } + else if ( data.equals("sqrt") || data.equals("cos") || + data.equals("sin") || data.equals("atan") + ) { + return new Token( "bif1", data ); + } + else if ( data.equals("pow") ) { + return new Token( "bif2", data ); + } + else if ( data.equals("print") ) { + return new Token( "print", "" ); + } + else if ( data.equals("newline") ) { + return new Token( "newline", "" ); + } + else {// is just a variable + return new Token( "var", data ); + } + } + else if ( state == 3 || state == 4 ) { + return new Token( "num", data ); + } + else if ( state == 7 ) { + return new Token( "string", data ); + } + else if ( state == 8 ) { + return new Token( "single", data ); + } + else if ( state == 9 ) { + return new Token( "eof", data ); + } + + else {// Lexer error + error("somehow Lexer FA halted in bad state " + state ); + return null; + } + + }// else generate token from input + + }// getNext + + public Token getNextToken() { + Token token = getNext(); + System.out.println(" got token: " + token ); + return token; + } + + public void putBackToken( Token token ) + { + System.out.println( margin + "put back token " + token.toString() ); + stack.push( token ); + } + + // next physical symbol is the lookahead symbol if there is one, + // otherwise is next symbol from file + private int getNextSymbol() { + int result = -1; + + if( lookahead == 0 ) {// is no lookahead, use input + try{ result = input.read(); } + catch(Exception e){} + } + else {// use the lookahead and consume it + result = lookahead; + lookahead = 0; + } + return result; + } + + private void putBackSymbol( int sym ) { + if( lookahead == 0 ) {// sensible to put one back + lookahead = sym; + } + else { + System.out.println("Oops, already have a lookahead " + lookahead + + " when trying to put back symbol " + sym ); + System.exit(1); + } + }// putBackSymbol + + private boolean letter( int code ) { + return 'a'<=code && code<='z' || + 'A'<=code && code<='Z'; + } + + private boolean digit( int code ) { + return '0'<=code && code<='9'; + } + + private boolean printable( int code ) { + return ' '<=code && code<='~'; + } + + private static void error( String message ) { + System.out.println( message ); + System.exit(1); + } + + public static void main(String[] args) { + System.out.print("Enter file name: "); + Scanner keys = new Scanner( System.in ); + String name = keys.nextLine(); + + Lexer lex = new Lexer( name ); + Token token; + + do{ + token = lex.getNext(); + System.out.println( token.toString() ); + }while( ! token.getKind().equals( "eof" ) ); + + } + +} diff --git a/Corgi/MemTable.java b/Corgi/MemTable.java new file mode 100755 index 0000000..5837e15 --- /dev/null +++ b/Corgi/MemTable.java @@ -0,0 +1,75 @@ +/* + store variable names with stored value +*/ + +import java.util.ArrayList; + +public class MemTable { + + private ArrayList names; + private ArrayList values; + + public MemTable() { + names = new ArrayList(); + values = new ArrayList(); + } + + public String toString() { + String s = "----\n"; + for( int k=0; k= 0 ) {// add new pair + return values.get( loc ); + } + else { + System.out.println("variable [" + name + "] not found"); + System.exit(1); + return 0; + } + + }// retrieve + + // return index of name in names, or -1 if + // not found + private int findName( String name ) { + // locate name + int loc = -1; + for (int k=0; k"; + } + + public String nice( Node node ) { + if ( node == null ) { + return ""; + } + else { + return "" + node.id; + } + } + + // produce array with the non-null children + // in order + private Node[] getChildren() { + int count = 0; + if( first != null ) count++; + if( second != null ) count++; + if( third != null ) count++; + Node[] children = new Node[count]; + int k=0; + if( first != null ) { children[k] = first; k++; } + if( second != null ) { children[k] = second; k++; } + if( third != null ) { children[k] = third; k++; } + + return children; + } + + //****************************************************** + // graphical display of this node and its subtree + // in given camera, with specified location (x,y) of this + // node, and specified distances horizontally and vertically + // to children + public void draw( Camera cam, double x, double y, double h, double v ) { + +System.out.println("draw node " + id ); + + // set drawing color + cam.setColor( Color.black ); + + String text = kind; + if( ! info.equals("") ) text += "(" + info + ")"; + cam.drawHorizCenteredText( text, x, y ); + + // positioning of children depends on how many + // in a nice, uniform manner + Node[] children = getChildren(); + int number = children.length; +System.out.println("has " + number + " children"); + + double top = y - 0.75*v; + + if( number == 0 ) { + return; + } + else if( number == 1 ) { + children[0].draw( cam, x, y-v, h/2, v ); cam.drawLine( x, y, x, top ); + } + else if( number == 2 ) { + children[0].draw( cam, x-h/2, y-v, h/2, v ); cam.drawLine( x, y, x-h/2, top ); + children[1].draw( cam, x+h/2, y-v, h/2, v ); cam.drawLine( x, y, x+h/2, top ); + } + else if( number == 3 ) { + children[0].draw( cam, x-h, y-v, h/2, v ); cam.drawLine( x, y, x-h, top ); + children[1].draw( cam, x, y-v, h/2, v ); cam.drawLine( x, y, x, top ); + children[2].draw( cam, x+h, y-v, h/2, v ); cam.drawLine( x, y, x+h, top ); + } + else { + System.out.println("no Node kind has more than 3 children???"); + System.exit(1); + } + + }// draw + + public static void error( String message ) { + System.out.println( message ); + System.exit(1); + } + + // ask this node to execute itself + // (for nodes that don't return a value) + public void execute() { + + if ( kind.equals("stmts") ) { + // insert code here for Exercise 15 + } + + else if ( kind.equals("prtstr") ) { + System.out.print( info ); + } + + else if ( kind.equals("prtexp") ) { + // insert code here for Exercise 15 + } + + else if ( kind.equals("nl") ) { + System.out.print( "\n" ); + } + + else if ( kind.equals("sto") ) { + // insert code here for Exercise 15 + } + + else { + error("Unknown kind of node [" + kind + "]"); + } + + }// execute + + // compute and return value produced by this node + public double evaluate() { + + if ( kind.equals("num") ) { + return Double.parseDouble( info ); + } + + else if ( kind.equals("var") ) { + // insert code here for Exercise 15 + } + + else if ( kind.equals("+") || kind.equals("-") ) { + // insert code here for Exercise 15 + } + + else if ( kind.equals("*") || kind.equals("/") ) { + // insert code here for Exercise 15 + } + + else if ( kind.equals("input") ) { + return keys.nextDouble(); + } + + else if ( kind.equals("sqrt") || kind.equals("cos") || + kind.equals("sin") || kind.equals("atan") + ) { + double value = first.evaluate(); + + if ( kind.equals("sqrt") ) + return Math.sqrt(value); + else if ( kind.equals("cos") ) + return Math.cos( Math.toRadians( value ) ); + else if ( kind.equals("sin") ) + return Math.sin( Math.toRadians( value ) ); + else if ( kind.equals("atan") ) + return Math.toDegrees( Math.atan( value ) ); + else { + error("unknown function name [" + kind + "]"); + return 0; + } + + } + + else if ( kind.equals("pow") ) { + // insert code here for Exercise 15 + } + + else if ( kind.equals("opp") ) { + // insert code here for Exercise 15 + } + + else { + error("Unknown node kind [" + kind + "]"); + return 0; + } + + }// evaluate + +}// Node diff --git a/Corgi/Parser.java b/Corgi/Parser.java new file mode 100755 index 0000000..73935d4 --- /dev/null +++ b/Corgi/Parser.java @@ -0,0 +1,202 @@ +/* + This class provides a recursive descent parser + for Corgi (a simple calculator language), + creating a parse tree which can be interpreted + to simulate execution of a Corgi program +*/ + +public class Parser { + + private Lexer lex; + + public Parser( Lexer lexer ) { + lex = lexer; + } + + public Node parseProgram() { + return parseStatements(); + } + + private Node parseStatements() { + System.out.println("-----> parsing :"); + + Node first = parseStatement(); + + // look ahead to see if there are more statement's + Token token = lex.getNextToken(); + + if ( token.isKind("eof") ) { + return new Node( "stmts", first, null, null ); + } + else { + lex.putBackToken( token ); + Node second = parseStatements(); + return new Node( "stmts", first, second, null ); + } + }// + + private Node parseStatement() { + System.out.println("-----> parsing :"); + + Token token = lex.getNextToken(); + + // ---------------->>> print or print + if ( token.isKind("print") ) { + token = lex.getNextToken(); + + if ( token.isKind("string") ) {// print + return new Node( "prtstr", token.getDetails(), + null, null, null ); + } + else {// must be first token in + // put back the token we looked ahead at + lex.putBackToken( token ); + Node first = parseExpr(); + return new Node( "prtexp", first, null, null ); + } + // ---------------->>> newline + } + else if ( token.isKind("newline") ) { + return new Node( "nl", null, null, null ); + } + // --------------->>> = + else if ( token.isKind("var") ) { + String varName = token.getDetails(); + token = lex.getNextToken(); + errorCheck( token, "single", "=" ); + Node first = parseExpr(); + return new Node( "sto", varName, first, null, null ); + } + else { + System.out.println("Token " + token + + " can't begin a statement"); + System.exit(1); + return null; + } + + }// + + private Node parseExpr() { + System.out.println("-----> parsing "); + + Node first = parseTerm(); + + // look ahead to see if there's an addop + Token token = lex.getNextToken(); + + if ( token.matches("single", "+") || + token.matches("single", "-") + ) { + Node second = parseExpr(); + return new Node( token.getDetails(), first, second, null ); + } + else {// is just one term + lex.putBackToken( token ); + return first; + } + + }// + + private Node parseTerm() { + System.out.println("-----> parsing "); + + Node first = parseFactor(); + + // look ahead to see if there's a multop + Token token = lex.getNextToken(); + + if ( token.matches("single", "*") || + token.matches("single", "/") + ) { + Node second = parseTerm(); + return new Node( token.getDetails(), first, second, null ); + } + else {// is just one factor + lex.putBackToken( token ); + return first; + } + + }// + + private Node parseFactor() { + System.out.println("-----> parsing "); + + Token token = lex.getNextToken(); + + if ( token.isKind("num") ) { + return new Node("num", token.getDetails(), null, null, null ); + } + else if ( token.isKind("var") ) { + return new Node("var", token.getDetails(), null, null, null ); + } + else if ( token.matches("single","(") ) { + Node first = parseExpr(); + token = lex.getNextToken(); + errorCheck( token, "single", ")" ); + return first; + } + else if ( token.isKind("bif0") ) { + String bifName = token.getDetails(); + token = lex.getNextToken(); + errorCheck( token, "single", "(" ); + token = lex.getNextToken(); + errorCheck( token, "single", ")" ); + + return new Node( bifName, null, null, null ); + } + else if ( token.isKind("bif1") ) { + String bifName = token.getDetails(); + token = lex.getNextToken(); + errorCheck( token, "single", "(" ); + Node first = parseExpr(); + token = lex.getNextToken(); + errorCheck( token, "single", ")" ); + + return new Node( bifName, first, null, null ); + } + else if ( token.isKind("bif2") ) { + String bifName = token.getDetails(); + token = lex.getNextToken(); + errorCheck( token, "single", "(" ); + Node first = parseExpr(); + token = lex.getNextToken(); + errorCheck( token, "single", "," ); + Node second = parseExpr(); + token = lex.getNextToken(); + errorCheck( token, "single", ")" ); + + return new Node( bifName, first, second, null ); + } + else if ( token.matches("single","-") ) { + Node first = parseFactor(); + return new Node("opp", first, null, null ); + } + else { + System.out.println("Can't have factor starting with " + token ); + System.exit(1); + return null; + } + + }// + + // check whether token is correct kind + private void errorCheck( Token token, String kind ) { + if( ! token.isKind( kind ) ) { + System.out.println("Error: expected " + token + + " to be of kind " + kind ); + System.exit(1); + } + } + + // check whether token is correct kind and details + private void errorCheck( Token token, String kind, String details ) { + if( ! token.isKind( kind ) || + ! token.getDetails().equals( details ) ) { + System.out.println("Error: expected " + token + + " to be kind=" + kind + + " and details=" + details ); + System.exit(1); + } + } + +} diff --git a/Corgi/Tests/factorial b/Corgi/Tests/factorial new file mode 100755 index 0000000..e9a70bb --- /dev/null +++ b/Corgi/Tests/factorial @@ -0,0 +1,20 @@ +main() + +def fact( n ) + + if lt(n 1) + return 1 + else + temp = fact( n-1 ) + return n * temp + end + +end + +def main() + + "enter n: " + n = input() + print( fact(n) ) + +end diff --git a/Corgi/Tests/quadroots b/Corgi/Tests/quadroots new file mode 100755 index 0000000..66c1d32 --- /dev/null +++ b/Corgi/Tests/quadroots @@ -0,0 +1,23 @@ +main() + +def main() + + "enter a:" + + a = input() + + "enter b:" + b = input() + + "enter c:" + c = input() + + disc = pow(b,2) - 4*a*c + + x1 = (-b - sqrt(disc) ) / (2*a) + x2 = (-b + sqrt(disc) ) / (2*a) + + "x1: " print(x1) "\n" + "x2: " print(x2 ) "\n" + +end diff --git a/Corgi/Token.java b/Corgi/Token.java new file mode 100755 index 0000000..6a8c813 --- /dev/null +++ b/Corgi/Token.java @@ -0,0 +1,31 @@ +public class Token +{ + private String kind; + private String details; + + public Token( String k, String d ) + { + kind = k; details = d; + } + + public boolean isKind( String s ) + { + return kind.equals( s ); + } + + public String getKind() + { return kind; } + + public String getDetails() + { return details; } + + public boolean matches( String k, String d ) { + return kind.equals(k) && details.equals(d); + } + + public String toString() + { + return "[" + kind + "," + details + "]"; + } + +} diff --git a/Corgi/TreeViewer.java b/Corgi/TreeViewer.java new file mode 100755 index 0000000..d92058e --- /dev/null +++ b/Corgi/TreeViewer.java @@ -0,0 +1,78 @@ +/* this class allows interactive + viewing of a tree built from + Node instances +*/ + +import java.awt.*; +import java.awt.event.KeyEvent; + +public class TreeViewer extends Basic +{ + // instance variables for the application: + // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv + + private Node root; // root of tree to be viewed + + private String keyInput; + private double horizGap = 2, vertGap = .5; + + // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + public TreeViewer( String title, int ulx, int uly, int pw, int ph, + Node tree ) + { + super(title,ulx,uly,pw,ph); + + setBackgroundColor( new Color( 128, 128, 200 ) ); + + // tree display + cameras.add( new Camera( 25, 45, pw-55, ph-75, + 0, 10, 0, 5, + new Color( 200, 200, 200 ) ) ); + + root = tree; + + super.start(); + } + + public void step() + { + // tree display + Camera cam = cameras.get(0); + cam.activate(); + cam.setColor( Color.black ); + + root.draw( cam, 5.0, 4.0, horizGap, vertGap ); + + }// step + + public void keyTyped( KeyEvent e ) { + char key = e.getKeyChar(); + + if( key == 'w' ){ + horizGap *= 1.2; + } + else if( key == 'n' ){ + horizGap /= 1.2; + } + + }// keyTyped + + public void keyPressed( KeyEvent e ) { + int code = e.getKeyCode(); + + if( code == KeyEvent.VK_LEFT ){ + cameras.get(0).shiftRegion( -0.25, 0 ); + } + else if( code == KeyEvent.VK_RIGHT ){ + cameras.get(0).shiftRegion( 0.25, 0 ); + } + else if( code == KeyEvent.VK_UP ){ + cameras.get(0).shiftRegion( 0, 0.25 ); + } + else if( code == KeyEvent.VK_DOWN ){ + cameras.get(0).shiftRegion( 0, -0.25 ); + } + }// keyPressed + +}// TreeViewer diff --git a/Corgi/corgiCFG.txt b/Corgi/corgiCFG.txt new file mode 100755 index 0000000..3fe78b1 --- /dev/null +++ b/Corgi/corgiCFG.txt @@ -0,0 +1,66 @@ +Note: this is the draft grammar, with notes and some thoughts, + for the Project 2 version of Corgi +------------------ + + -> + + -> | + + -> def ( ) end | + def ( ) end | + def ( ) end + def ( ) end + + -> + + -> | + + -> | + + + -> ( ) | + ( ) + + -> | + + -> | + = | + | + if else end | + if else end | + if else end | + if else end | + return + + -> | + | - + -> | * | / + + -> | | + ( ) | + - | + + + +Notes: + + slightly bizarre but cool: in Corgi you can just type a string anywhere + as a statement and it gets sent to the console (still have to use + print( ) to send a number) + + no boolean type---use "non-zero is true, 0 is false" + + there's only the if-else---always have to use it + + no loop statements---use recursion! + + the built-in functions fit the grammar just like user-defined functions--- + will execute differently + + change the Lexer to remove /* ..... */ type of comments---no tokens + produced + + change Lexer to allow \n inside a string---put \\ in the Java string + + +Need to agree on names for all the many BIF's---see upcoming document + diff --git a/Corgi/oldCorgi.txt b/Corgi/oldCorgi.txt new file mode 100755 index 0000000..e89fceb --- /dev/null +++ b/Corgi/oldCorgi.txt @@ -0,0 +1,19 @@ + -> + + -> | + + + -> print | + print | + newline | + = + + -> | + -> | + + -> | | + ( ) | + () | + ( ) | + ( , ) | + - diff --git a/Corgi/partialNode.java b/Corgi/partialNode.java new file mode 100755 index 0000000..e40b782 --- /dev/null +++ b/Corgi/partialNode.java @@ -0,0 +1,87 @@ + // ask this node to execute itself + // (for nodes that don't return a value) + public void execute() { + + if ( kind.equals("stmts") ) { + // insert code here for Exercise 15 + } + + else if ( kind.equals("prtstr") ) { + System.out.print( info ); + } + + else if ( kind.equals("prtexp") ) { + // insert code here for Exercise 15 + } + + else if ( kind.equals("nl") ) { + System.out.print( "\n" ); + } + + else if ( kind.equals("sto") ) { + // insert code here for Exercise 15 + } + + else { + error("Unknown kind of node [" + kind + "]"); + } + + }// execute + + // compute and return value produced by this node + public double evaluate() { + + if ( kind.equals("num") ) { + return Double.parseDouble( info ); + } + + else if ( kind.equals("var") ) { + // insert code here for Exercise 15 + } + + else if ( kind.equals("+") || kind.equals("-") ) { + // insert code here for Exercise 15 + } + + else if ( kind.equals("*") || kind.equals("/") ) { + // insert code here for Exercise 15 + } + + else if ( kind.equals("input") ) { + return keys.nextDouble(); + } + + else if ( kind.equals("sqrt") || kind.equals("cos") || + kind.equals("sin") || kind.equals("atan") + ) { + double value = first.evaluate(); + + if ( kind.equals("sqrt") ) + return Math.sqrt(value); + else if ( kind.equals("cos") ) + return Math.cos( Math.toRadians( value ) ); + else if ( kind.equals("sin") ) + return Math.sin( Math.toRadians( value ) ); + else if ( kind.equals("atan") ) + return Math.toDegrees( Math.atan( value ) ); + else { + error("unknown function name [" + kind + "]"); + return 0; + } + + } + + else if ( kind.equals("pow") ) { + // insert code here for Exercise 15 + } + + else if ( kind.equals("opp") ) { + // insert code here for Exercise 15 + } + + else { + error("Unknown node kind [" + kind + "]"); + return 0; + } + + }// evaluate diff --git a/Corgi/quadroots b/Corgi/quadroots new file mode 100755 index 0000000..3a11018 --- /dev/null +++ b/Corgi/quadroots @@ -0,0 +1,16 @@ +print "enter a:" + +a = input() + +print "enter b:" +b = input() +print "enter c:" +c = input() + +disc = pow(b,2) - 4*a*c + +x1 = (-b - sqrt(disc) ) / (2*a) +x2 = (-b + sqrt(disc) ) / (2*a) + +print "x1: " print x1 newline +print "x2: " print x2 newline diff --git a/Documents/announcements b/Documents/announcements new file mode 100755 index 0000000..52b038b --- /dev/null +++ b/Documents/announcements @@ -0,0 +1,25 @@ +Announcements + (I'll try to keep this file current with any due dates, corrections to + the course notes, corrections to + Exercises and Projects, and so on) +======================================= + +Exercise 2: + + The command (occurring two places): + + 2 1001 1 + + is misleading, because the "1" is a conceptual error + (in an earlier version of VPL, I though the call had + to speciy how many arguments had been passed, but now + we just say that the command 3's have to immediately + precede the command 2) + but I didn't notice this issue because the loader + sees opcode 2, reads one further argument (1001), and + tosses the rest of the line---it's just as if the "1" + is a comment. +--------------------------------------- + +Project 1 is due September 10 (target) + diff --git a/Documents/implementation.pdf b/Documents/implementation.pdf new file mode 100755 index 0000000000000000000000000000000000000000..c895e477b431ba3b6b211f4c5cf5a3ccdfb36f74 GIT binary patch literal 139308 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

LR)!$kM!E7`e(PcjW#>Gbj&3Bcq2>TAeE2 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 Lh>214)j9qTYunT| literal 0 HcmV?d00001 diff --git a/Documents/implementation.tex b/Documents/implementation.tex new file mode 100755 index 0000000..a4e5500 --- /dev/null +++ b/Documents/implementation.tex @@ -0,0 +1,757 @@ +\input pictex +\input /Users/Shared/TeX/defs + +\advance \hoffset 0.25 true in + +\def\inclassexercise{\item{$\Rightarrow$\quad\quad} {\bf In-Class Exercise:}\quad} +\def\borderline{\medskip\hrule\bigskip} + +\startDoc{CS 3210 Fall 2018}{25}{Implementing a Programming Language} + +{\bigboldfont A Brief Look at More Serious Language Implementation} +\bigskip + +We have already played some with language design and implementation---you were asked in Project 1 +to implement VPL, and I suffered greatly implementing Jive. But, those languages have relatively simple +structure and can be described just +using finite automata. Now we want to learn a little about implementing a language that is described using +a {\it context free grammar}. It turns out that if a language is described using a finite automaton to describe +its meaningful chunks, and a context free grammar of the right form to describe its main structure, +then we can implement the language using {\it recursive descent parsing}. +\bigskip + +\Indent{.5} + Not that long ago, + probably every computer science program had a rather nasty required course known as + ``the compiler course.'' As this technology became more well-known and accepted, this + course gradually disappeared from the curriculum, but scraps of it remain in this course. + \medskip + + We will make our work much easier by mostly + ignoring issues of {\it efficiency}, both in space and time. + For example, a real compiler tries to recover from errors and go on to report other errors, but + we will be happy to detect one error and stop. And, a real compiler tries to generate code that + uses as little memory as is reasonable, and runs as quickly as is reasonable. + We won't be crazy about it in our upcoming work, but we will compromise efficiency whenever it saves us + work. + \medskip + \Outdent + +{\bigboldfont Language Specification} +\bigskip + +To specify a programming language, we have to specify its {\it grammar}---what sequences of symbols +(or diagrammatic elements, if it's a non-textual language) form a syntactically legal program, and its +{\it semantics}---the meaning of those sequences of symbols. +\medskip + +To precisely specify the grammar of our language, we need to do some fairly abstract work (all of which overlaps the +CS 3240 course, but with a more practical focus). +\medskip + +We have already seen a little of both finite automata and context free grammars, but the following will be +more detailed and organized. +\medskip + +As we do the abstract stuff, we will have in mind two languages. The first will be a +simple calculator language. The second will be the language that you will be asked to +implement in Project 2. Both of these languages will be designed and specified in the +upcoming work. The implementation of the simple calculator language through +a lexical phase and +recursive descent parsing will be worked out fully as an example, leaving you to do +the same things on Project 2. +\border + +{\bf Definition of a Language} +\medskip + +Given a finite set, which is known as an {\it alphabet} (and can be thought of as some set +of ordinary symbols), we define a {\it string\/} +to be any finite sequence of members of the alphabet, and we define a {\it language\/} to +be any set of strings over the alphabet. +\medskip + +\In + For this course, we are interested in situations where a single string is a program in some + programming language, and the language is the set of all syntactically legal programs. +\medskip +\Out +\border + +{\bf Finite Automata} +\medskip + +We already introduced finite automata, so let's do some examples that will +be used in the simple calculator language. +\border + +{\bf Exercise 9} +\medskip + +Working in your small group, draw a finite automaton for each of the following languages: +\medskip + +\Indent{1} +\item{a.} all strings that start with a lowercase letter, followed by zero or more letters or digits +\medskip + +\item{b.} all strings that represent a real number in the way usually +used by humans (no scientific notation allowed), say in a math class. + +\border +\Outdent + +{\bf The Concept of Lexical Analysis as Just a First Step in Parsing} +\medskip + +It turns out that the FA technique is not expressive enough to describe the syntax we want +to have for a typical programming language. +\medskip + +\In + Here's a proof of this fact: we clearly want to have, in a typical + imperative language, the ability to write expressions + such as $((((((a))))))$, where the number of extra parentheses is unlimited. Our parser needs + to be able to check whether there are as many left parentheses as right. But, the FA technique + can't say this. Suppose to the contrary that we have an FA that accepts all strings that + have $n$ left parentheses followed by {\tt a} followed by $n$ right parentheses. Imagine that + you are looking at this wonderful diagram. Since it is a {\it finite\/} state automaton, it has a + finite number of states, say $M$. Now, feed this machine a string that has more than $M$ + left parentheses, followed by an {\tt a}, followed by the same number of right parentheses. + Since there are only $M$ states, in processing the left parentheses, we will visit some state + twice, and there will be a loop in the machine that processes just one or more left parentheses. + Clearly this loop means that the machine will accept strings that it shouldn't accept. +\medskip +\Out + +Since the FA technique can't describe all the syntactic features we want in a programming +language, we will be forced to develop a more powerful approach. But, the FA technique +is still useful, because we will use it for the first phase of parsing, known as {\it lexical analysis}. +This is a very simple idea: we take the stream of physical symbols and use an FA to +process them, producing either an error message or a stream of {\it tokens}. A token is simply +a higher-level symbol that is composed of one or more physical symbols. Then the +remaining parsing takes place on the sequence of tokens. This is done purely as a +matter of convenience and efficiency, because the technique we will develop to do the parsing +is fully capable of doing the tokenizing part as well. +\border + +\vfil\eject + +{\bigboldfont Formal Grammars and Parsing} +\medskip + +We will now learn a technique for specifying the syntax of a language that is more powerful +than the FA approach. One limited version of this approach will let us specify most of the +syntax of a typical programming language. +\bigskip + +A {\it formal grammar\/} consists of a set of {\it non-terminal symbols}, a set of {\it terminal symbols}, +and a set of {\it production rules}. One non-terminal symbol is designated as the {\it start symbol}. +\medskip + +\Indent{1} + As we saw in my specification of Jive, we will often use symbols written between angle brackets, + like {\tt }, to represent + non-terminal symbols. + Terminal symbols will be tokens produced by the lexical analysis phase. + \medskip + + For our early example we will tend to use uppercase letters for non-terminal symbols and + lowercase letters for terminal symbols. +\Outdent + +A production rule has one or more symbols (both terminal and non-terminal allowed) known +as the ``left hand side,'' followed +by a right arrow, followed by one or more symbols known as the ``right hand side.'' +\medskip + +A {\it derivation\/} starts with the start symbol and proceeds by replacing any substring of +the current string that occurs as the left hand side of a rule by the right hand side of that rule, +continuing until a string is reached that has only terminal symbols in it. At this point, that +string of terminal symbols has been proven to be in the language accepted by the grammar. +\medskip + +{\bf A Simple Example} +\medskip + +Here is a simple grammar, where the non-terminals are $S$, $A$, and $B$, and the +$S$ is the start symbol, +and the terminal symbols are $a$, $b$, $c$, and $d$. +\medskip + +$ S \rightarrow AB $ + +$ A \rightarrow a A b $ + +$ A \rightarrow c $ + +$ B \rightarrow d $ + +$ B \rightarrow d B $ +\medskip + +Here is a sample derivation of a string from this grammar, where each line +involves one substitution: +\medskip + +$S$ + +$AB$ + +$ a A b B$ + +$ a a A b b B$ + +$ a a c b b B $ + +$ a a c b b d B $ + +$ a a c b b d d B $ + +$ a a c b b d d d $ + +\medskip + +This derivation shows that {\tt aacbbddd} is in the language accepted by this grammar. +\medskip + +\doit Determine the language accepted by this grammar. Note that it +has parts that could have been accomplished by the FA technique, and parts that +could not. +\border + +{\bf Context Free Grammars} +\medskip + +This formal grammar technique +is a very general tool, but we will focus on a special version known as a +{\it context free grammar} where the left hand side of a rule can only be a single non-terminal +symbol. +\medskip + +Context free grammars are nice because on each step of a derivation, the only question is, +which non-terminal symbol in the current string should we replace by using a rule where +it occurs as the left hand side. +\medskip + +We can now think of what we really mean by parsing. For a context free grammar, the +challenge is to take a given string---an alleged program---and try to find a derivation. +\medskip + +Context free grammars are used because they are powerful enough to specify most of +what we want in the syntax of a language, but are still amenable to being parsed {\it efficiently}. +\medskip + +It is also important to note that for the languages people tend to use, apparently, the +semantics (meaning) of a program are closely related to the syntactic structure. +\medskip + +\Indent{1} +Here is a feature of a typical programming language that isn't captured, typically, by the +context free grammar that specifies the syntax of the language: local variables in Java +have to be defined before they are used. Typically the context free grammar +says that the body of a method consists of a sequence of one or more statements, and +statements are things like {\tt int x;} and {\tt x = 3;}, but the grammar doesn't specify that +one has to occur before the other. Those rules of the language have to be handled in +some other way. +\medskip +\Outdent + +For context free grammars, we can improve on the notation of a derivation a lot by +the {\it parse tree\/} concept. Instead of recopying the current string on each step, we +show the replacement of a left hand side non-terminal symbol by writing a child in the +tree for each symbol in the right hand side. Here is a parse tree for the first example +given: +\medskip + +$$ +\beginpicture +\setcoordinatesystem units <1true pt,1true pt> + \put {S} at 150.0 120.0 + \put {A} at 60.0 90.0 + \put {B} at 210.0 90.0 + \put {a} at 0.0 60.0 + \put {A} at 60.0 60.0 + \put {b} at 120.0 60.0 + \put {d} at 180.0 60.0 + \put {B} at 270.0 60.0 + \put {a} at 30.0 30.0 + \put {A} at 60.0 30.0 + \put {b} at 90.0 30.0 + \put {d} at 240.0 30.0 + \put {B} at 300.0 30.0 + \put {c} at 60.0 0.0 + \put {d} at 300.0 0.0 +% Edge from 1 to 2: + \plot 141.0 117.0 68.0 92.0 / + \put {} at 141.0 117.0 +% Edge from 1 to 3: + \plot 158.0 115.0 201.0 94.0 / + \put {} at 158.0 115.0 +% Edge from 2 to 4: + \plot 51.0 85.0 8.0 64.0 / + \put {} at 51.0 85.0 +% Edge from 2 to 5: + \plot 60.0 81.0 60.0 69.0 / + \put {} at 60.0 81.0 +% Edge from 2 to 6: + \plot 68.0 85.0 111.0 64.0 / + \put {} at 68.0 85.0 +% Edge from 3 to 7: + \plot 203.0 83.0 186.0 66.0 / + \put {} at 203.0 83.0 +% Edge from 3 to 8: + \plot 218.0 85.0 261.0 64.0 / + \put {} at 218.0 85.0 +% Edge from 5 to 9: + \plot 53.0 53.0 36.0 36.0 / + \put {} at 53.0 53.0 +% Edge from 5 to 10: + \plot 60.0 51.0 60.0 39.0 / + \put {} at 60.0 51.0 +% Edge from 5 to 11: + \plot 66.0 53.0 83.0 36.0 / + \put {} at 66.0 53.0 +% Edge from 8 to 12: + \plot 263.0 53.0 246.0 36.0 / + \put {} at 263.0 53.0 +% Edge from 8 to 13: + \plot 276.0 53.0 293.0 36.0 / + \put {} at 276.0 53.0 +% Edge from 10 to 14: + \plot 60.0 21.0 60.0 9.0 / + \put {} at 60.0 21.0 +% Edge from 13 to 15: + \plot 300.0 21.0 300.0 9.0 / + \put {} at 300.0 21.0 +\endpicture +$$ +\border + +\vfil\eject + +{\bf A Bad Way to Try to Express Expressions} +\medskip + +Consider the following grammar, where $E$ is the start symbol, and +$V$ and $N$ are viewed as terminal symbols namely tokens representing +variables and numeric literals, and other symbols that are not uppercase letters +are viewed as tokens. +\medskip + +$ E \rightarrow N$ + +$ E \rightarrow V$ + +$ E \rightarrow E + E $ + +$ E \rightarrow E * E $ + +$ E \rightarrow (E)$ +\medskip + +This grammar seems reasonable, but it turns out to be a rather poor way to specify +a language consisting of all mathematical expressions using variables, numeric literals, +addition, multiplication, and parentheses. For one thing, the grammar is ambiguous---there +are strings that have significantly different parse trees. For another, the grammar has no +concept of operator precedence. +\medskip + +\doit Come up with some expressions and produce parse trees for them. +Verify the complaints just made. +\border + +{\bf A Classic Example of a Context Free Grammar} +\medskip + +Now consider this grammar for the language of simple expressions, +where $E$ is the start symbol, and +$V$ and $N$ are viewed as terminal symbols, namely tokens representing +variables and numeric literals, and other symbols that are not uppercase letters +are viewed as tokens. +\medskip + +$E \rightarrow T$ + +$E \rightarrow T+E$ + +$T \rightarrow F$ + +$ T \rightarrow F * T$ + +$F \rightarrow V$ + +$F \rightarrow N$ + +$F \rightarrow (E)$ +\medskip + +\doit This grammar captures the syntax of an {\it expression} involving two +binary operators with different precedence. Produce parse trees for some expressions and +note that the grammar is not ambiguous and enforces operator precedence. +\border + +{\bf Parse Trees as Code} +\medskip + +The previous example suggests a powerful idea: if someone gives you a parse tree for an +expression, and values for all the variables occurring, you can easily compute the value +of the expression---and you can easily write code that interprets the parse tree. +\medskip + +Thus, in a very real sense, the tree structure is a better programming language than +the language described by the context free grammar, except for one big catch: it's hard to +read and write parse trees, compared to reading and writing strings. +\border + +{\bf Exercise 10} +\medskip + +Working in your small group, produce a parse tree for the following expression, using the good +expression grammar. +Then, assuming that $a=12$, $b=7$, and $c=2$, show how the parse tree can be used to +compute the value of the expression---note how the value of each node in the parse tree +is obtained from the values of its children. +\medskip + +Use this expression: + +$$ 7*a + (c*a*c+4*a)*b $$ +\border + +{\bf Designing and Specifying the Simple Calculator Language} +\medskip + +Now we want to design (and then implement) a language that allows the user to +perform a sequence of computations such as a person could do on a calculator. +But, we want the language to allow use of expressions and assignment statements. +\medskip + +\doit As a whole group, invent a name for this language, and write some example programs +so everyone will see the sorts of things we want to allow, and the sorts of things we don't want +to allow. +\border + +{\bf Exercise 11} +\medskip + +Working in your small group, specify the simple calculator language by determining its +tokens (categories of conceptual symbols, such as probably {\tt } for variable), +drawing an FA for each kind of token, and writing a context free grammar for the +language. +\medskip + +Use {\tt } for the start variable, which should produce any possible program in the +language. +\border + +\doit Working back together as a whole group, write down the final specification +for the simple calculator language. +\border + +{\bf Implementing the Lexical Phase} +\medskip + +\doit As a whole group, produce a Java class named {\tt Lexer} that +will take a file containing a program in the simple calculator language as input and produce a sequence of tokens. +In addition to producing this stream of tokens, {\tt Lexer} should have the ability to ``put back'' a token, for convenience +in the recursive descent parsing phase. The point is that we will produce a grammar that will allow us to +look ahead at the next token, thinking it will be part of the entity we are producing, and then realize from that next token +that we are done with the entity we were producing, so it is convenient to put back the look ahead token. + +\vfil\eject +%\bye + +{\bf Implementing The Simple Calculator Language} +\medskip + +\doit + Working as a whole group, + finish the draft design of the simple calculator language, +and write down a context free grammar to specify it. +\medskip + +\Indent{1} +As we do this, we want to try to write the rules so that they process symbols on the +left, leaving the recursive parts on the right. +For example, if we want to say ``1 or more {\tt a}'s'' we could either use the +rules +$$ A \rightarrow Aa \; \vert \; a $$ +or we could say +$$ A \rightarrow aA \; \vert \; a $$ + +with the same result from a theoretical perspective. +But, because we want to use the {\it recursive descent parsing\/} technique (there are other +parsing techniques that we will not study that like grammars in different forms), +we will want to use the second approach. +\medskip +\Outdent + +\border + +\doit Working as a whole group, begin work on a class {\tt Parser} that will take +a {\tt Lexer} as a source of tokens and produce a {\it parse tree\/} that represents a simple calculator +language program in a way that it can be directly executed. +\medskip + +\Indent{1} +As a practical matter, to save some time +we will begin with some old code that I produced for a different language and modify it massively +to do the job for our new language. +\medskip + +Note that along with the {\tt Lexer} and {\tt Parser} classes, this old code includes {\tt Token} and +{\tt Node} classes that will be used extensively in our work. +\medskip + +The classes {\tt Basic}, {\tt Camera}, and {\tt TreeViewer} support visualizing a parse tree for +debugging and testing purposes. +\medskip +\Outdent + +As we will see, the recursive descent parsing technique involves writing a method for every non-terminal +symbol in the grammar. Each of these methods will consume a sequence of tokens and produce a +node that is the root of a tree that is the translation of the corresponding chunk of code. +\medskip + +Also, these methods will return {\tt null} if they realize that the next few tokens don't fit what they are +expecting to see. +\medskip + +We will not take the time to be very careful about detecting and reporting errors in the source code. +We will basically assume that the source code is correct. But, when it makes sense to do so, we will +notice errors and halt the parsing process with some error message to the programmer. +\border + +\vfil\eject + +{\bf Final (?) Finite Automata for Lexer for Corgi} +\bigskip + +\epsfbox{../Secret/Corgi/Figures/corgiFA.1} +\border + +\doit Instructor will briefly discuss {\tt Lexer} and {\tt Parser} in preparation for Exercises 12 and 13. +\border + +{\bf Exercise 12} +Working in your small group, write the code for state 3, 4, and 5 in the {\tt Lexer.java} file for Corgi. +To help you understand {\tt Lexer} and do this Exercise effectively, a number of trees have been +killed to provide you with a printout of the existing code on the next pages. +\vfil\eject + +\count255 1 +\numberedListing{../Corgi/Lexer.java}{\tt} +\border + +{\bf Exercise 13} +Working in your small group, write the code for {\tt parseFactor} in +the class {\tt Parser}, listed on the next few pages. +\bigskip + +Here is the draft context free grammar for Corgi (note some changes from our earlier version): +\medskip + +{\baselineskip 0.95 \baselineskip +\listing{../Corgi/corgiCFG.txt} + +\border} + +\count255 1 +\numberedListing{../Corgi/Parser.java}{\tt} + +\vfil\eject + +\doit Instructor will discuss the minor changes to {\tt Parser} (listed in its entirety below) +and draw a parse tree for +a Corgi program. +\border + +{\bf Exercise 14} +Working in your small groups, construct the parse tree for {\tt quadroots} following the final (I hope!) +version of {\tt Parser}. +\border + +{\baselineskip 0.75\baselineskip +\count255 1 +\font \smalltt cmtt10 scaled 800 +\numberedListing{../Corgi/Parser.java}{\smalltt} +\border +} + +{\bf Exercise 15} +Below you will find a partial listing of the {\tt Node} class, namely the partially completed +{\tt execute} and {\tt evaluate} methods. +Working in your small groups, +write the missing code. +\medskip + +Note that nodes have instance variables {\tt kind}, {\tt info} (both strings), and +{\tt first} and {\tt second} (both nodes). +\medskip + +Also, there is a {\tt MemTable} class that has public methods + + {\tt void store( String name, double value)} + +and + +{\tt double retrieve( String name)} +\medskip + +If you need further details about any of the classes in the {\tt Corgi} project +(namely {\tt Corgi}, {\tt Token}, {\tt Lexer}, {\tt Parser}, {\tt Node}, and {\tt MemTable}, +you should look at them online (assuming someone in your group has a computer in class). + +\vfil\eject + +\count255 136 +\numberedListing{../Corgi/partialNode.java}{\tt} + +\vfil\eject + +{\bigboldfont Designing Project 2} +\medskip + +To keep Project 2 manageable (a first serious submission for Project 2 must be submitted by the time of Test 2---October 29), +I have decided to make this project be to simply (we hope!) add some +features to Corgi as follows. +\medskip + +\Indent{1} +First, we want to give the Corgi programmer the ability to define functions, and of course to call them. +\medskip + +Second, we want to add branching to Corgi. +\medskip +\Outdent + +\doit Working as a whole group, design the finite automata for the Corgi {\tt Lexer}, and the +context free grammar for the Corgi {\tt Parser}. +Discuss the features we are not adding to Corgi, and perhaps decide to add some of them. +As part of this design process, write some sample Corgi programs (these will also provide a +starting point for testing your Project 2 work). +\medskip + +\doit Once the syntax of the language is specified, try to specify the {\it semantics\/} of the language, +and think about how execution/evaluation of the parse tree will be done. +\bigskip + +{\bf Note:} after we have made decisions about the new and improved Corgi, +henceforth to be known as ``Corgi,'' I will document them. +But, you should be able to start working on Project 2 right away, based on the informal +documentation recorded during this class session. +\border + +{\bigboldfont Project 2} [10 points] [first serious submission absolutely due by October 29] +\medskip + +Implement the extended Corgi language as specified in class and in upcoming documents. +Be alert for corrections to the Corgi specification that may need to be made as work proceeds. +\medskip + +Be sure to test your implementation thoroughly. +\medskip + +Email me your group's submission with a single {\tt zip} or {\tt jar} file attached, named either +{\tt corgi.jar} or {\tt corgi.zip}. This single file must contain all the source code files. +Be sure to CC all group members on the email that submits your work. +\medskip + +I must be able to extract all the Java source files from your submitted file into a folder, and then simply +type at the command prompt: +\medskip + +{\tt javac Corgi.java} + +{\tt java Corgi test3} +\medskip + +in order to run the Corgi program in the file named {\tt test3}. +\border + +\vfil\eject + +\bye + +{\bf Designing Project 2} +\medskip + +\doit Discuss possibilities for Project 2 and decide what it should be. +% Then, we'll apply CYK and/or recursive descent to it +\vfil\eject + +{\bigboldfont Course Policy Change} +\medskip +Test 2 is canceled, due to the facts that we haven't covered enough material suitable for fair assessment, +and we have just barely gotten to the main topics of language implementation. +\medskip + +The test scheduled for April 13 will cover the material we have been and are still working on, along +with some functional programming topics, about equally weighted. The test at the time of the final exam +will cover Clojure and Prolog topics. +\medskip + +Your course grade will be figured with the 68\% for Tests divided either into 3 or 4, with the next test counting +as two tests or one, and taking the maximum of the two calculations. +\border + +{\bigboldfont Otter} +\medskip + +I had been thinking Project 2 would be to finish implementing Otter, but now I'm thinking Project 2 will be +to implement the ``simple example'' we started on February 28th. We will spend a few more class periods +working through implementation of Otter together (with me, unfortunately, doing most of the work outside of +class). +\border + +{\bigboldfont Project 2} +\medskip + +Implement the simple calculator language (let's call it ``CalcLang'') designed in class, with that design +documented (including the finite automaton for the lexical part of the language, the context free grammar, +and an informal description of the language semantics) in the folder {\tt Project2} at the course web stie. +\medskip + +When you are done, you will have an application consisting of several Java classes. You must submit your +work to me as follows: +\medskip + +\In + Make sure that the main class---the one that contains the {\tt main} method at which execution starts---is + named exactly {\tt CalcLang}. + \medskip + + Clean up your source files for submission by removing all non-portable {\tt package} statements and + all extraneous output. + \medskip + + Put all your source files in a folder, named {\tt Project2}. + Create a {\tt jar} file from the command line by moving into the folder that contains the folder {\tt Project2} + and entering + \smallskip + {\tt jar cvfM proj2.jar Project2} + \medskip + + Test your work by making a temporary folder somewhere, copying {\tt proj2.jar} into it, moving into it, + and entering + \smallskip + {\tt jar xf proj2.jar} + \smallskip + This should make a folder {\tt Project2} that contains all your source code. Move into it and compile and + run your application. + \medskip + + Email me your submission with {\tt proj2.jar} attached at {\tt shultzj@msudenver.edu} + \bigskip + + If you are somehow incapable of doing the previous work, you may as a slightly irritating (to me) alternative + make a {\tt zip} file of the folder containing your source code instead of a {\tt jar} file. +\medskip +\Out + + + +\vfil\eject +\bye + diff --git a/Documents/intro.pdf b/Documents/intro.pdf new file mode 100755 index 0000000000000000000000000000000000000000..7ebb4e89d14016f45d1b9435e08e112464db4669 GIT binary patch literal 152906 zcma&tQ*$psgP`%)wr$(ViESq*`UfYrZQHhO+qP}nPWGLt-MyKcx#{le575>9d#cG5 zMaAiv8CYS+N3UWFVAzS6h-?ilVEFhLWld~Moy>?h{qt4`jn={$O%uD(DGGuqb#Z^LzP#JmVwyHTY;I;ZL^f&L z_U>N44+Ncfe3txlZC)p9M!jxMX6pvcP1)?G=wtG>YEE0&j=#Sw$IxdmQe**Zid!QI7;N840CRB7@8+$>U+qH{WK+ZcAaMxiW zhfMfxAjc*Ro@1mSH&eX!xt3pff#rf-!@Dxt1@+u+yBY-b)1+vCLmygxy82oW5EM#* zixLF^ny98b!oEFbm2CmxFAF5#Wa-eMtrqqRaXY(1^X)_|rlyQOueH~(SCCmp$$sp6<=EE% zMo)0qKmo40IU6MuY}nIh8Y^OyzCMdORN2r-0Bn|j$hH6xb5ZgbuqR-TXb;SH2qJ~K z7(9Ew^Q2S}W@Tdv{1i%I`z17c&d!SGhN;IpaBwiiV5Zg;<(LvrP&0>xfgbTSh@QTQ zjX)C}W1u|%m8({6Ji*2uA7Ncb7}9`FIFpGpOoIS?XmTag{!o14dXx!oH4=~&qk^M% zB`BWMk^<+=%j38Dw#a)*z7Cg;=yHs~zvEqkaOb7F#_yulh8$5tVFq-9aoPYuWLXyY zi>G0vqgM#wthnkOjT$iwY`dc}L26{D2;^kHI?Yob%#qhK7ET7k3Sj4NTpz-rfJpzT z>7o!}r(d127tm2BLuAp(%K>?Z_n?W20o$aExEA^@Ltmx}+`?ogzS3KF8@%gQA;Opd|S`9D`!@W89IG!&I=g1UKf+<5I*NQaa2k9KS3UT$wY1z%0DO_q=>>o2Pcq6AlF`b^lZq@ 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 literal 0 HcmV?d00001 diff --git a/Documents/intro.tex b/Documents/intro.tex new file mode 100755 index 0000000..b018979 --- /dev/null +++ b/Documents/intro.tex @@ -0,0 +1,1945 @@ +\input pictex +\input /Users/Shared/TeX/defs + +\advance \hoffset 0.25 true in + +\startDoc{CS 3210 Fall 2018}{1}{Introduction} + +{\bigboldfont Introduction to the Course} +\medskip + +This course will cover four main themes: +techniques for specifying programming languages, +implementation of programming languages, +exposure to alternative programming language paradigms, and +issues in the design of programming languages. +\medskip + +{\bf Note:} frequently in these course notes you will find this symbol: $\Rightarrow$ in the +margin. Wherever this occurs, we will do this work during a mini-lecture, +recording our results either in a snapshot of the board or a text file. +\bigskip + +{\bf Some Introductory Questions} +\medskip + +\doit What is a programming language? +\medskip + +\doit +In the Web search for {\tt programming paradigms} and note the main four that +we will study. +\medskip + +\doit +In the Web, search for {\tt history of programming languages} and specifically look for +a timeline, and ponder the list, including noting the paradigm(s) some of them belong to. +\medskip + +\doit Go to {\tt www.tiobe.com/tiobe-index} and observe the popularity of various +programming languages at this moment in time. +\border + +{\bigboldfont A Very Primitive Language} +\medskip + +For the rest of our introduction to the course (including in-depth study of a number of important +issues relating to designing and implementing imperative programming languages), we will +study a toy language known as VPL (for ``very primitive language''). +\medskip + +To begin, we will specify the syntax and semantics of VPL, and then +you will have a project to implement VPL (which will turn out to be fairly easy). +\medskip + +The main requirement for this language is that it be very easy to specify and implement. +One major consequence of this requirement is that we will only work with integer values, +and input/output operations and other utility functions that could easily be provided are +kept to a minimum. +\medskip + +This work provides a first example of specification of +a programming language, +begins our study of implementation of programming languages, +will be used later as the platform for discussing all sorts of imperative language +implementation issues, and will provide a very gentle introduction to language design +issues. +\medskip + +In a sense, all procedural + languages are just spiffed up versions of a language such +as this. +\medskip + +The following description of VPL +mostly only makes sense in the context of the implementation we +have in mind, so implementation suggestions will be integrated with +the language description. This makes sense, since we are sort of +creating a virtual processor as we describe the language. + +\vfil\eject + +{\bf The VPL Memory Model} +\medskip + +The memory model consists of a rather large one-dimensional array, +named {\tt mem} in the following discussion, together with a number +of individual variables, including ones named {\tt ip}, {\tt sp}, {\tt bp}, {\tt rv}, +{\tt hp}, and {\tt gp} that are referred to as {\it registers}. +\medskip + +Each location in this +array is known as a memory cell, or just cell. +This array holds the stored program, starting in cell 0 and continuing as +needed. The global memory area begins where +the stored program ends. The system stack begins where the global memory area ends. +The area for dynamic memory, known as the ``heap,'' +begins at the upper end of the array and continues downward. +\medskip + +While the program is executing, the instruction pointer register {\tt ip} +will hold the index of the cell containing the operation code for the +instruction that is currently executing. +\medskip + +The ``global pointer'' register {\tt gp} holds the first index after the stored +program. +\medskip + +At all times the base pointer register {\tt bp} will hold the index of the +smallest cell in the region of memory used for the currently active +subprogram, which is known as the ``stack frame,'' +and the stack pointer register {\tt sp} will hold the index +of the first cell above the stack frame. +\medskip + +The heap pointer register {\tt hp} will point to the first cell of the +most recently allocated chunk of memory, so that the region with +indices smaller than {\tt hp} will be available for allocation. +\medskip + +The return value register {\tt rv} is used to hold the single +value being returned by a subprogram. +\medskip + +Here is a picture of the memory layout: +\medskip + +\beginpicture +\setcoordinatesystem units <1 true cm,1true cm> +\putrectangle corners at 0 0 and 16 1 +\put {\tinytt MEM} [b] at 16.2 1.2 +\putrule from 5 0 to 5 1 +\put {\tt code} at 2.5 0.5 +\putrule from 7 0 to 7 1 +\put {\tt globals} at 6 0.5 +\put {\tt stack} at 8.5 0.5 +\put {$\rightarrow$} at 10 0.5 +\put {$\cdots$} at 12 0.5 +\put {$\leftarrow$} at 13.5 0.5 +\put {\tt heap} at 15 0.5 +\put {\tinytt 0} at 0.2 1.2 +\put {\tinytt ip} at 3 1.2 +\put {\tinytt gp} at 5.2 1.2 +\put {\tinytt bp} at 8.5 1.2 +\put {\tinytt sp} at 9.2 1.2 +\put {\tinytt hp} at 14 1.2 +\endpicture + +\bigskip + +{\bf The Instructions and Execution Semantics} +\medskip + +We will now see our first example of specifying a programming language---we will +specify the {\it syntax}---the rules for what sequences of symbols constitute a legal +program in VPL---and the {\it semantics}---the meaning of a VPL program. +For this very simple language, we will be able to specify these things quite easily. +In fact, the previous ``memory model'' discussion has begun the description of the +semantics of VPL. +\bigskip + +Execution starts with {\tt ip} set to 0. Note that all the registers +need to be properly initialized. +After each instruction has executed, {\tt ip} has either been moved +to a different value, or it moves to the sequentially next instruction. +\medskip + +When input arguments are passed, a subprogram is called, +or a subprogram is returned from, we will need to manage the +details of the stack frame to make recursion possible. +In particular, in addition to allocating space in a stack frame +for the input arguments and local variables, we will need to have +space for storing the values of any registers that need to be +restored when you return from a subprogram. However we do this +we want to set things up so that all ``variables'' in a subprogram, +including arguments and locals, will be named 0, 1, 2, and so on, with +the input arguments being 0, 1, 2, and so on. +\medskip + +We will assume that arguments are always passed immediately before +calling a subprogram. +\medskip + +Here are the draft details of the operations. +In this description, the syntax of each instruction is given +implicitly through an abstract example. In the abstract +examples, every symbol represents an integer, +but as an aid to understanding the semantics, +integer literals are operation codes, {\tt n} represents +an integer literal, +{\tt a}, {\tt b}, and {\tt c} represent offsets in the current +stack from {\tt bp} (and ``cell a'' actually means the +array location with index {\tt bp+2+a}), +and +{\tt L} represents a label. +\medskip + +\halign{\tabskip 0.25true in +{\tt #}\hfil& #\hfil& \vtop{\hsize 3.5true in \baselineskip 0.8\baselineskip #}\hfil\cr +\noalign{\smallskip\hrule\smallskip} +Instruction& Mnemonic& Semantic Description\cr +\noalign{\smallskip\hrule\smallskip} +0& no op& Do nothing.\cr +\noalign{\medskip} +1 L& label& During program loading this instruction disappears, and all + occurrences of {\tt L} are replaced by the actual index in {\tt mem} + where the opcode {\tt 1} would have been stored.\cr +\noalign{\medskip} +2 L& call& Do all the steps necessary to set up for execution of the subprogram + that begins at label {\tt L}.\cr +\noalign{\medskip} +3 a& pass& Push the contents of cell {\tt a} on the stack.\cr +\noalign{\medskip} +4 n& locals& Increase {\tt sp} by {\tt n} to make space for local variables in + the current stack frame.\cr +\noalign{\medskip} +5 a& return& Do all the steps necessary to return from the current subprogram, + including putting the value stored in cell {\tt a} in {\tt rv}.\cr +\noalign{\medskip} +6 a& get retval& Copy the value stored in {\tt rv} into cell {\tt a}.\cr +\noalign{\medskip} +7 L& jump& Change {\tt ip} to {\tt L}.\cr +\noalign{\medskip} +8 L a& cond& If the value stored in cell {\tt a} is non-zero, change {\tt ip} to {\tt L} + (otherwise, move {\tt ip} to the next instruction).\cr +\noalign{\medskip} +9 a b c& add& Add the values in cell {\tt b} and cell {\tt c} and store the result + in cell {\tt a}.\cr +\noalign{\medskip} +10 a b c& subtract& Same as 9, but do cell {\tt b} $-$ cell {\tt c}.\cr +\noalign{\medskip} +11 a b c& multiply& Same as 9, but do cell {\tt b} $*$ cell {\tt c}.\cr +\noalign{\medskip} +12 a b c& divide& Same as 9, but do cell {\tt b} $/$ cell {\tt c}.\cr +\noalign{\medskip} +13 a b c& remainder& Same as 9, but do cell {\tt b} \% cell {\tt c}.\cr +\noalign{\medskip} +14 a b c& equal& Same as 9, but do cell {\tt b} {\tt ==} cell {\tt c}.\cr +\noalign{\medskip} +15 a b c& not equal& Same as 9, but do cell {\tt b} {\tt !=} cell {\tt c}.\cr +\noalign{\medskip} +16 a b c& less than& Same as 9, but do cell {\tt b} {\tt <} cell {\tt c}.\cr +\noalign{\medskip} +17 a b c& less than or equal& Same as 9, but do cell {\tt b} {\tt <=} cell {\tt c}.\cr +\noalign{\medskip} +18 a b c& and& Same as 9, but do cell {\tt b} $\&\&$ cell {\tt c}.\cr +\noalign{\medskip} +19 a b c& or& Same as 9, but do cell {\tt b} {\tt ||} cell {\tt c}.\cr +\noalign{\medskip} +20 a b& not& If cell {\tt b} holds zero, put 1 in cell {\tt a}, + otherwise put 0 in cell {\tt a}.\cr +\noalign{\medskip} +21 a b& opposite& Put the opposite of the contents of cell {\tt b} in cell {\tt a}.\cr +\noalign{\medskip} +22 a n& literal& Put {\tt n} in cell {\tt a}.\cr +\noalign{\medskip} +23 a b& copy& Copy the value in cell {\tt b} into cell {\tt a}.\cr +\noalign{\medskip} +24 a b c& get& Get the value stored in the heap at the index obtained by adding + the value of cell {\tt b} and the value of cell {\tt c} and copy + it into cell {\tt a}.\cr +\noalign{\medskip} +25 a b c& put& Take the value from cell {\tt c} and store it in the heap at the + location with index computed as the value in cell {\tt a} plus + the value in cell {\tt b}.\cr +\noalign{\medskip} +26& halt& Halt execution.\cr +\noalign{\medskip} +27 a& input& Print a {\tt ?} and a space in the console and wait for an + integer value to be typed by the user, and then store it in cell + {\tt a}.\cr +\noalign{\medskip} +28 a& output& Display the value stored in cell {\tt a} in the console.\cr +\noalign{\medskip} +29& newline& Move the console cursor to the beginning of the next line\cr +\noalign{\medskip} +30 a& symbol& If the value stored in cell {\tt a} is between 32 and 126, display + the corresponding symbol at the console cursor, otherwise + do nothing.\cr +\noalign{\medskip} + 31 a b& new& Let the value stored in cell {\tt b} be denoted by $m$. + Decrease {\tt hp} by $m$ and put the new value of {\tt hp} + in cell {\tt a}.\cr +\noalign{\medskip} +32 n& allocate global space& This instruction must occur first in any program that +uses it. It simply sets the initial value of {\tt sp} to {\tt n} cells beyond the end of stored +program memory, and sets {\tt gp} to the end of stored program memory.\cr +\noalign{\medskip} +33 n a& Copy to global& Copy the contents of cell {\tt a} to the global memory area at index {\tt gp+n}.\cr +\noalign{\medskip} +34 a n& Copy from global& Copy the contents of the global memory cell at index {\tt gp+n} into cell {\tt a}.\cr +\noalign{\smallskip\hrule\smallskip} +} +\medskip + +The C strategy of ``non-zero is true, zero is false'' is used where appropriate. +C style psuedo-code is used to describe the various operations 9--19. +\medskip +\hrule +\bigskip + +\vfil\eject + +{\bf Exercise 1} +\medskip + +Working in whiteboard groups (ideally 4 or 5 people), write the following simple programs in VPL. +\medskip + +\item{a.} Create a single global variable and store 17 in it. +Display a question mark in the console, get input from the keyboard, and store it in a local cell. +Add that input value to the global variable value and display the result in the console. +\medskip + +\item{b.} Create a VPL program that asks the user for an input value and +displays 1 if that input is an odd number, and 2 if it is an even number. +\medskip + +\item{c.} Create a VPL program that asks the user for a value of {\tt number} and then +displays on-screen (in the console) the values 1, 2, $\ldots$, {\tt number}, one per line. +\medskip + +\item{d.} Create a VPL program that gets an input value, say $x$, and repeatedly +divides $x$ by 2 if $x$ is even or multiplies $x$ by 3 and adds 1, until $x$ reaches $1$. +\border + +{\bf The Stack Frame Model} +\medskip + +In order to implement subprograms in the usual way (later we will discuss +simpler memory models) we need to give each subprogram call its own memory area, +known as a {\it stack frame} (or ``activation record''). +\medskip + +Here is a picture of the layout of a {\it stack frame} the way we will do it +in VPL. This layout, combined with commands 2--6, +allows the VPL programmer to use {\it modularity}---to be able to use subprograms. +\bigskip + +\beginpicture +\setcoordinatesystem units <1.25 true cm,1true cm> +\putrule from 0 0 to 11 0 +\putrule from 0 1 to 11 1 +\putrule from 1 0 to 1 1 +\putrule from 2 -0.5 to 2 1.5 \put {\tinytt bp} [b] at 2.5 1.2 +\putrule from 3 0 to 3 1 \put {\tinytt return} at 2.5 0.66 \put {\tinytt ip} at 2.5 0.33 +\putrule from 4 0 to 4 1 \put {\tinytt return} at 3.5 0.66 \put {\tinytt bp} at 3.5 0.33 +\putrule from 5 0 to 5 1 \put {\tinytt 0} [t] at 4.5 -0.2 +\putrule from 6 0 to 6 1 \put {\tinytt 1} [t] at 5.5 -0.2 +\putrule from 7 0 to 7 1 \put {\tinytt 2} [t] at 6.5 -0.2 +\put {$\cdots$} at 8 0.5 + \put {\tinytt sp} [b] at 9.5 1.2 +\putrule from 10 0 to 10 1 +\linethickness 2true pt +\putrule from 2 -0.5 to 2 1.5 +\putrule from 9 -0.5 to 9 1.5 \endpicture +\bigskip + +With this model, a {\it stack frame\/} consists of all the memory cells from index {\tt bp} up to +but not including index {\tt sp}. +\medskip + +To call a subprogram, first we have to use command 3 once for each value that we want to +pass over to the next stack frame. +Then we use command 2 to call the desired subprogram. +This command stores the correct values of the current base pointer and instruction pointer in the +first two cells of the new stack frame. +Note that the arguments passed by command 3 sit just to the right of those two cells. +\medskip + +And, command 2 has to change the instruction pointer to the starting point in the code segment +of the subprogram being called. +\medskip + +The first command in the subprogram must be command 4, which simply moves the stack pointer +to the right to make space for the local variables in the stack frame. +So, if for example we passed two arguments, then the cells conceptually labeled (underneath) 0 and +1 will hold the values of those parameters (to use Java terminology), while cells conceptually +labeled 2, 3, and so on, will be local variables for the subprogram. +\medskip + +When command 5 executes, it puts the value to be returned in the return value register, and +then restores the base pointer, the stack pointer, and the instruction pointer, thus returning both in +code and in the stack to the stack frame from which the call was made. +\medskip + +Then in the calling stack frame, command 6 moves the returned value into a local cell. +\border + +{\bf Exercise 2} +\medskip + +Here is a VPL program (a very bad one in the sense that it has no comments!): +\medskip + +\verbatim +4 3 +27 0 +3 0 +2 1001 +6 1 +28 1 +29 +26 + +1 1001 +4 6 +22 2 2 +22 1 1 +16 6 0 2 +8 2001 6 +10 3 0 1 +3 3 +2 1001 +6 4 +11 5 0 4 +5 5 +1 2001 +5 1 +|endverbatim +\medskip +\bigskip + +Trace the execution of this program. +Your group will need to draw a bunch of memory cells. +Since you have a narrow piece of whiteboard, break the long strip of +cells into convenient horizontal pieces, say using 10 cells per piece. +\medskip + +As you write the numbers for the code in the code section, be sure to +remove the label commands and to change all the ``jump'' commands to +use the index where the label command would be. +\medskip + +As you trace the commands, keep track of the {\tt ip}, {\tt bp}, and {\tt sp} +by writing them in above the correct memory cells and erasing the previous +values. +\medskip + +And, of course, trace what is written in the console. +\vfil\eject + +{\bf Wrap-Up Exercise 1} +\medskip + +My solutions to Exercise 1 are in the VPL folder. +Make sure that you finish Exercise 1 on your own time, +as needed, with these to help. +\medskip + +Also, use these programs as some of your test cases for Project 1. +\border + +{\bf Exercise 3} +\medskip + +Working in whiteboard groups (ideally 4 or 5 people), +write this program, which includes two useful subprograms: +\medskip + +\Indent{.5} +Write a subprogram, starting with label 100000, + that takes as its single input argument a positive integer $n$, and then + allocates $n+1$ cells in the heap, stores $n$ in the first of these + cells, and then asks the user for $n$ numbers, storing them in the remaining $n$ cells, + and returns the address in memory where the list begins. + \medskip + + Write a subprogram, starting with label 200000, + that takes as its single input argument the index in memory of the + starting point of a list, stored as for subprogram 100000, + and then displays the list on a single line, with items separated by spaces. + \medskip + +Then write a main program that will call the list input subprogram and then call the +list display subprogram. +\medskip + +Someone in your group should record your final work in a computer file and email it +to everyone in the group, because you will want to use this program as a test case +for your Project 1 work. +\border +\Outdent + +\vfil\eject + +{\bf Exercise 4} +\medskip + +Trace the execution of the code shown below. +Draw on the whiteboard memory cells from 70 on, and trace +all the operations, assuming the user inputs 4 and then 2. +\medskip + +\beginpicture +\setcoordinatesystem units <0.4true in, 0.3true in> +\putrectangle corners at 0.0 15.75 and 1.0 16.75 +\put {$\scriptstyle 27$} at 0.5 16.25 +\put {$\scriptstyle 0$} [b] at 0.5 16.83 +\put {\tt ip} [b] at 0.5 17.15 +\putrectangle corners at 1.0 15.75 and 2.0 16.75 +\put {$\scriptstyle 0$} at 1.5 16.25 +\put {$\scriptstyle 1$} [b] at 1.5 16.83 +\putrectangle corners at 2.0 15.75 and 3.0 16.75 +\put {$\scriptstyle 27$} at 2.5 16.25 +\put {$\scriptstyle 2$} [b] at 2.5 16.83 +\putrectangle corners at 3.0 15.75 and 4.0 16.75 +\put {$\scriptstyle 1$} at 3.5 16.25 +\put {$\scriptstyle 3$} [b] at 3.5 16.83 +\putrectangle corners at 4.0 15.75 and 5.0 16.75 +\put {$\scriptstyle 3$} at 4.5 16.25 +\put {$\scriptstyle 4$} [b] at 4.5 16.83 +\putrectangle corners at 5.0 15.75 and 6.0 16.75 +\put {$\scriptstyle 0$} at 5.5 16.25 +\put {$\scriptstyle 5$} [b] at 5.5 16.83 +\putrectangle corners at 6.0 15.75 and 7.0 16.75 +\put {$\scriptstyle 3$} at 6.5 16.25 +\put {$\scriptstyle 6$} [b] at 6.5 16.83 +\putrectangle corners at 7.0 15.75 and 8.0 16.75 +\put {$\scriptstyle 1$} at 7.5 16.25 +\put {$\scriptstyle 7$} [b] at 7.5 16.83 +\putrectangle corners at 8.0 15.75 and 9.0 16.75 +\put {$\scriptstyle 2$} at 8.5 16.25 +\put {$\scriptstyle 8$} [b] at 8.5 16.83 +\putrectangle corners at 9.0 15.75 and 10.0 16.75 +\put {$\scriptstyle 16$} at 9.5 16.25 +\put {$\scriptstyle 9$} [b] at 9.5 16.83 +\putrectangle corners at 0.0 13.5 and 1.0 14.5 +\put {$\scriptstyle 6$} at 0.5 14.0 +\put {$\scriptstyle 10$} [b] at 0.5 14.58 +\putrectangle corners at 1.0 13.5 and 2.0 14.5 +\put {$\scriptstyle 2$} at 1.5 14.0 +\put {$\scriptstyle 11$} [b] at 1.5 14.58 +\putrectangle corners at 2.0 13.5 and 3.0 14.5 +\put {$\scriptstyle 28$} at 2.5 14.0 +\put {$\scriptstyle 12$} [b] at 2.5 14.58 +\putrectangle corners at 3.0 13.5 and 4.0 14.5 +\put {$\scriptstyle 2$} at 3.5 14.0 +\put {$\scriptstyle 13$} [b] at 3.5 14.58 +\putrectangle corners at 4.0 13.5 and 5.0 14.5 +\put {$\scriptstyle 29$} at 4.5 14.0 +\put {$\scriptstyle 14$} [b] at 4.5 14.58 +\putrectangle corners at 5.0 13.5 and 6.0 14.5 +\put {$\scriptstyle 26$} at 5.5 14.0 +\put {$\scriptstyle 15$} [b] at 5.5 14.58 +\putrectangle corners at 6.0 13.5 and 7.0 14.5 +\put {$\scriptstyle 4$} at 6.5 14.0 +\put {$\scriptstyle 16$} [b] at 6.5 14.58 +\putrectangle corners at 7.0 13.5 and 8.0 14.5 +\put {$\scriptstyle 5$} at 7.5 14.0 +\put {$\scriptstyle 17$} [b] at 7.5 14.58 +\putrectangle corners at 8.0 13.5 and 9.0 14.5 +\put {$\scriptstyle 22$} at 8.5 14.0 +\put {$\scriptstyle 18$} [b] at 8.5 14.58 +\putrectangle corners at 9.0 13.5 and 10.0 14.5 +\put {$\scriptstyle 2$} at 9.5 14.0 +\put {$\scriptstyle 19$} [b] at 9.5 14.58 +\putrectangle corners at 0.0 11.25 and 1.0 12.25 +\put {$\scriptstyle 1$} at 0.5 11.75 +\put {$\scriptstyle 20$} [b] at 0.5 12.33 +\putrectangle corners at 1.0 11.25 and 2.0 12.25 +\put {$\scriptstyle 22$} at 1.5 11.75 +\put {$\scriptstyle 21$} [b] at 1.5 12.33 +\putrectangle corners at 2.0 11.25 and 3.0 12.25 +\put {$\scriptstyle 5$} at 2.5 11.75 +\put {$\scriptstyle 22$} [b] at 2.5 12.33 +\putrectangle corners at 3.0 11.25 and 4.0 12.25 +\put {$\scriptstyle 0$} at 3.5 11.75 +\put {$\scriptstyle 23$} [b] at 3.5 12.33 +\putrectangle corners at 4.0 11.25 and 5.0 12.25 +\put {$\scriptstyle 14$} at 4.5 11.75 +\put {$\scriptstyle 24$} [b] at 4.5 12.33 +\putrectangle corners at 5.0 11.25 and 6.0 12.25 +\put {$\scriptstyle 6$} at 5.5 11.75 +\put {$\scriptstyle 25$} [b] at 5.5 12.33 +\putrectangle corners at 6.0 11.25 and 7.0 12.25 +\put {$\scriptstyle 1$} at 6.5 11.75 +\put {$\scriptstyle 26$} [b] at 6.5 12.33 +\putrectangle corners at 7.0 11.25 and 8.0 12.25 +\put {$\scriptstyle 5$} at 7.5 11.75 +\put {$\scriptstyle 27$} [b] at 7.5 12.33 +\putrectangle corners at 8.0 11.25 and 9.0 12.25 +\put {$\scriptstyle 8$} at 8.5 11.75 +\put {$\scriptstyle 28$} [b] at 8.5 12.33 +\putrectangle corners at 9.0 11.25 and 10.0 12.25 +\put {$\scriptstyle 68$} at 9.5 11.75 +\put {$\scriptstyle 29$} [b] at 9.5 12.33 +\putrectangle corners at 0.0 9.0 and 1.0 10.0 +\put {$\scriptstyle 6$} at 0.5 9.5 +\put {$\scriptstyle 30$} [b] at 0.5 10.08 +\putrectangle corners at 1.0 9.0 and 2.0 10.0 +\put {$\scriptstyle 14$} at 1.5 9.5 +\put {$\scriptstyle 31$} [b] at 1.5 10.08 +\putrectangle corners at 2.0 9.0 and 3.0 10.0 +\put {$\scriptstyle 6$} at 2.5 9.5 +\put {$\scriptstyle 32$} [b] at 2.5 10.08 +\putrectangle corners at 3.0 9.0 and 4.0 10.0 +\put {$\scriptstyle 1$} at 3.5 9.5 +\put {$\scriptstyle 33$} [b] at 3.5 10.08 +\putrectangle corners at 4.0 9.0 and 5.0 10.0 +\put {$\scriptstyle 0$} at 4.5 9.5 +\put {$\scriptstyle 34$} [b] at 4.5 10.08 +\putrectangle corners at 5.0 9.0 and 6.0 10.0 +\put {$\scriptstyle 8$} at 5.5 9.5 +\put {$\scriptstyle 35$} [b] at 5.5 10.08 +\putrectangle corners at 6.0 9.0 and 7.0 10.0 +\put {$\scriptstyle 68$} at 6.5 9.5 +\put {$\scriptstyle 36$} [b] at 6.5 10.08 +\putrectangle corners at 7.0 9.0 and 8.0 10.0 +\put {$\scriptstyle 6$} at 7.5 9.5 +\put {$\scriptstyle 37$} [b] at 7.5 10.08 +\putrectangle corners at 8.0 9.0 and 9.0 10.0 +\put {$\scriptstyle 10$} at 8.5 9.5 +\put {$\scriptstyle 38$} [b] at 8.5 10.08 +\putrectangle corners at 9.0 9.0 and 10.0 10.0 +\put {$\scriptstyle 3$} at 9.5 9.5 +\put {$\scriptstyle 39$} [b] at 9.5 10.08 +\putrectangle corners at 0.0 6.75 and 1.0 7.75 +\put {$\scriptstyle 0$} at 0.5 7.25 +\put {$\scriptstyle 40$} [b] at 0.5 7.83 +\putrectangle corners at 1.0 6.75 and 2.0 7.75 +\put {$\scriptstyle 2$} at 1.5 7.25 +\put {$\scriptstyle 41$} [b] at 1.5 7.83 +\putrectangle corners at 2.0 6.75 and 3.0 7.75 +\put {$\scriptstyle 10$} at 2.5 7.25 +\put {$\scriptstyle 42$} [b] at 2.5 7.83 +\putrectangle corners at 3.0 6.75 and 4.0 7.75 +\put {$\scriptstyle 4$} at 3.5 7.25 +\put {$\scriptstyle 43$} [b] at 3.5 7.83 +\putrectangle corners at 4.0 6.75 and 5.0 7.75 +\put {$\scriptstyle 1$} at 4.5 7.25 +\put {$\scriptstyle 44$} [b] at 4.5 7.83 +\putrectangle corners at 5.0 6.75 and 6.0 7.75 +\put {$\scriptstyle 2$} at 5.5 7.25 +\put {$\scriptstyle 45$} [b] at 5.5 7.83 +\putrectangle corners at 6.0 6.75 and 7.0 7.75 +\put {$\scriptstyle 3$} at 6.5 7.25 +\put {$\scriptstyle 46$} [b] at 6.5 7.83 +\putrectangle corners at 7.0 6.75 and 8.0 7.75 +\put {$\scriptstyle 3$} at 7.5 7.25 +\put {$\scriptstyle 47$} [b] at 7.5 7.83 +\putrectangle corners at 8.0 6.75 and 9.0 7.75 +\put {$\scriptstyle 3$} at 8.5 7.25 +\put {$\scriptstyle 48$} [b] at 8.5 7.83 +\putrectangle corners at 9.0 6.75 and 10.0 7.75 +\put {$\scriptstyle 4$} at 9.5 7.25 +\put {$\scriptstyle 49$} [b] at 9.5 7.83 +\putrectangle corners at 0.0 4.5 and 1.0 5.5 +\put {$\scriptstyle 2$} at 0.5 5.0 +\put {$\scriptstyle 50$} [b] at 0.5 5.58 +\putrectangle corners at 1.0 4.5 and 2.0 5.5 +\put {$\scriptstyle 16$} at 1.5 5.0 +\put {$\scriptstyle 51$} [b] at 1.5 5.58 +\putrectangle corners at 2.0 4.5 and 3.0 5.5 +\put {$\scriptstyle 6$} at 2.5 5.0 +\put {$\scriptstyle 52$} [b] at 2.5 5.58 +\putrectangle corners at 3.0 4.5 and 4.0 5.5 +\put {$\scriptstyle 6$} at 3.5 5.0 +\put {$\scriptstyle 53$} [b] at 3.5 5.58 +\putrectangle corners at 4.0 4.5 and 5.0 5.5 +\put {$\scriptstyle 3$} at 4.5 5.0 +\put {$\scriptstyle 54$} [b] at 4.5 5.58 +\putrectangle corners at 5.0 4.5 and 6.0 5.5 +\put {$\scriptstyle 3$} at 5.5 5.0 +\put {$\scriptstyle 55$} [b] at 5.5 5.58 +\putrectangle corners at 6.0 4.5 and 7.0 5.5 +\put {$\scriptstyle 3$} at 6.5 5.0 +\put {$\scriptstyle 56$} [b] at 6.5 5.58 +\putrectangle corners at 7.0 4.5 and 8.0 5.5 +\put {$\scriptstyle 1$} at 7.5 5.0 +\put {$\scriptstyle 57$} [b] at 7.5 5.58 +\putrectangle corners at 8.0 4.5 and 9.0 5.5 +\put {$\scriptstyle 2$} at 8.5 5.0 +\put {$\scriptstyle 58$} [b] at 8.5 5.58 +\putrectangle corners at 9.0 4.5 and 10.0 5.5 +\put {$\scriptstyle 16$} at 9.5 5.0 +\put {$\scriptstyle 59$} [b] at 9.5 5.58 +\putrectangle corners at 0.0 2.25 and 1.0 3.25 +\put {$\scriptstyle 6$} at 0.5 2.75 +\put {$\scriptstyle 60$} [b] at 0.5 3.33 +\putrectangle corners at 1.0 2.25 and 2.0 3.25 +\put {$\scriptstyle 7$} at 1.5 2.75 +\put {$\scriptstyle 61$} [b] at 1.5 3.33 +\putrectangle corners at 2.0 2.25 and 3.0 3.25 +\put {$\scriptstyle 9$} at 2.5 2.75 +\put {$\scriptstyle 62$} [b] at 2.5 3.33 +\putrectangle corners at 3.0 2.25 and 4.0 3.25 +\put {$\scriptstyle 6$} at 3.5 2.75 +\put {$\scriptstyle 63$} [b] at 3.5 3.33 +\putrectangle corners at 4.0 2.25 and 5.0 3.25 +\put {$\scriptstyle 6$} at 4.5 2.75 +\put {$\scriptstyle 64$} [b] at 4.5 3.33 +\putrectangle corners at 5.0 2.25 and 6.0 3.25 +\put {$\scriptstyle 7$} at 5.5 2.75 +\put {$\scriptstyle 65$} [b] at 5.5 3.33 +\putrectangle corners at 6.0 2.25 and 7.0 3.25 +\put {$\scriptstyle 5$} at 6.5 2.75 +\put {$\scriptstyle 66$} [b] at 6.5 3.33 +\putrectangle corners at 7.0 2.25 and 8.0 3.25 +\put {$\scriptstyle 6$} at 7.5 2.75 +\put {$\scriptstyle 67$} [b] at 7.5 3.33 +\putrectangle corners at 8.0 2.25 and 9.0 3.25 +\put {$\scriptstyle 5$} at 8.5 2.75 +\put {$\scriptstyle 68$} [b] at 8.5 3.33 +\putrectangle corners at 9.0 2.25 and 10.0 3.25 +\put {$\scriptstyle 2$} at 9.5 2.75 +\put {$\scriptstyle 69$} [b] at 9.5 3.33 +\endpicture +\border + +\vfil\eject + +{\bigboldfont Project 1} [first serious submission due by Monday, September 10] +\medskip + +Implement VPL by starting from the given file {\tt VPL.java} found in the {\tt VPL} folder at the course web site + (supported by the little class {\tt IntPair.java}), +which (along with some other useful stuff) does the irritating task of replacing +symbolic labels by memory indices. +\medskip + +To begin, download {\tt VPL.java} and {\tt IntPair.java} to your working folder. +\medskip + +The given code assumes you are calling it from the command line. If you aren't, you'll need to +change the code in obvious ways. +\medskip + +Put in code to implement all the operations. The +Be sure to test your program thoroughly. + At a minimum, run it on all the programs given in the {\tt VPL} folder, + plus your program from Exercise 3. The file {\tt someUnitTests} + does a sequence of simple tests of some commands, and you should be able to easily + determine the output it should produce to compare to what your program actually does produce. + If you submit your work when it is not working as desired on these VPL programs, + you should also explain which ones have problems and describe what you are planning to + do next to fix your program. + \medskip + +As you're working on this project, remember that this work will directly help you to +prepare for Test 1, +which will ask you to read, write, and execute VPL code, as well as to +add new features to the VPL language. +\medskip + +When you are ready to submit your work (and recall that a serious first submission must be done by the due date or +you will never be allowed to submit it) +email\hfil\break + {\tt shultzj@msudenver.edu} with your file {\tt VPL.java} as an attachment. +And, yes, you must do this program in Java, purely for my and your convenience. If there is +any feature of the program that you find difficult to do in Java, then you are probably +doing things wrong! In other words, implementing a language this primitive should only +require very primitive features of Java. +\border + +\vfil\eject + +% mini-lecture --- introduce idea of higher level language that will translate to VPL + +{\bf An Assembler for VPL?} +\medskip + +\doit Let's discuss for a while what is so horribly wrong with VPL (even assuming we only want to +be able to work with integer values). +\medskip + +Your next Project, following some background work and Exercises to get ready, will be to implement, in Java, a +translator that will take a program written in a language that is nicer to use than VPL and +translate it to a VPL program. +\medskip + +To keep things from getting out of hand at this point, we will make the following crucial language design +decision: +\medskip + +{\advance \leftskip .5true in + \it The new language should translate line-by-line to a VPL program, where each line of the + new language can be translated to some VPL code as we go. +\border +} + +{\bf Exercise 5} +\medskip + +Working in groups, ideally of size four or five, {\it design\/} this new language. +After you work on this a while, we will have a whole group discussion and come up with +the draft (we might decide something which turns out later to be bad) design for our +joint language. +\medskip + +Note that part of the design is the {\it name\/} of the language. +\border + +{\bigboldfont The First Step in Language Implementation: Lexical Analysis} +\bigskip + +Because the new language is simple enough, the only interesting issue in its implementation +will be turning sequences of physical symbols---actual single symbols---into conceptual symbols known as +{\it tokens\/} or {\it lexemes}. +\medskip + +To do this, we will first study some ides in what is known as {\it lexical analysis}. +\border + +{\bf Finite Automata} +\medskip + + A {\it finite automaton} (FA) consists of a directed graph, where the vertices +are known as {\it states\/} +and are typically drawn as circles, and each edge of the graph is labeled with a list of one or more +symbols belonging to the alphabet. +Each symbol in the alphabet can only occur on at most one edge leading out of any state. +One state is marked by an arrow out of nowhere pointing to it as the {\it start state}, and one or +more states are marked, typically by ``double circling,'' as {\it accepting states}. +\medskip + +For example, here is an FA using the alphabet $\{ a, b\}$: +\medskip + +$$ +\beginpicture +\setcoordinatesystem units <1true pt,1true pt> +% epsilon + \circulararc 360 degrees from 9.0 80.0 center at 0.0 80.0 + \put {1} at 0.0 80.0 +% b + \circulararc 360 degrees from 89.0 80.0 center at 80.0 80.0 + \put {2} at 80.0 80.0 +% bb + \circulararc 360 degrees from 169.0 80.0 center at 160.0 80.0 + \put {3} at 160.0 80.0 + \circulararc 360 degrees from 168.0 80.0 center at 160.0 80.0 +% ba + \circulararc 360 degrees from 89.0 0.0 center at 80.0 0.0 + \put {4} at 80.0 0.0 + \circulararc 360 degrees from 88.0 0.0 center at 80.0 0.0 +% Arrow from epsilon to b: + \arrow <0.1in> [0.2,0.67] from 9.0 80.0 to 71.0 80.0 + \put {b} at 40.0 86.0 +% Arrow from b to bb: + \arrow <0.1in> [0.2,0.67] from 89.0 80.0 to 151.0 80.0 + \put {b} at 120.0 86.0 +% Arrow from ba to epsilon: + \arrow <0.1in> [0.2,0.67] from 73.0 6.0 to 6.0 73.0 + \put {a} at 40.0 34.0 +% Arrow from bb to ba: + \arrow <0.1in> [0.2,0.67] from 153.0 73.0 to 86.0 6.0 + \put {a} at 120.0 34.0 +% Arrow from b to ba: + \arrow <0.1in> [0.2,0.67] from 75.0 71.0 to 75.0 9.0 + \put {a} at 69.0 40.0 +% Arrow from ba to b: + \arrow <0.1in> [0.2,0.67] from 85.0 9.0 to 85.0 71.0 + \put {b} at 91.0 40.0 +% Loop about epsilon: + \circulararc 298.0 degrees from 3.0 88.0 center at 0.0 93.0 + \put {a} at 0.0 105.0 +% Loop about bb: + \circulararc 298.0 degrees from 163.0 88.0 center at 160.0 93.0 + \put {b} at 160.0 105.0 +% start arrow: +\arrow <0.1in> [0.2,0.67] from -29 80 to -9 80 +\endpicture +$$ +\bigskip + +Here is how an FA is used to decide whether a given string is legal: +\medskip +\In +starting from the start state, process each symbol of the input string in turn, until +you reach the end of the string, or detect an error. To process a symbol, look at the +edges leading out of the current state. If the symbol is listed on one of them, follow that +edge to the state on the other end and make that the current state. If the symbol is not +listed on any edge, then the string is rejected. Finally, if all the symbols of the +input string are successfully processed, then check the state that you end up in---if it +is an accepting state, then the input string is accepted as legal, otherwise it is rejected. +\bigskip +\Out + +For example, in the FA given above, the string {\tt ababbba} is accepted, moving from +1 to 1 to 2 to 4 to 2 to 3 to 3 to 4, and state 4 is an accepting state. On the other hand, +the string {\tt bbbab} is not accepted, because it moves from 1 to 2 to 3 to 3 to 4 to 2, +and state 2 is not an accepting state. And, the string {\tt abc} is rejected because it moves +from 1 to 1 to 2 and then detects no edge out of state 2 that processes a {\tt c}. +\bigskip + +\doit Create an FA for the language of legal identifiers in our new language. +\border + +{\bf Exercise 6} +\medskip + +Working in your small group, create an FA for the language of integer literals. +\medskip + +Then look at the new language design and see all the different kinds of tokens. +Make sure that you can create an FA for each kind of token. +\border + +\vfil\eject + +{\bigboldfont Announcement} +\medskip + +The Learning Assistants (Peter and Jimmy) have settled on {\bf Office Hours} from +2--3:50 on Tuesday and Thursday, in AES 237 (check the board if they aren't there to see if +they moved to another room for more quiet). +Barring emergencies, one or the other of them will be available during these times +to talk with you about the +course material, Exercises, and Projects. +\medskip + +They provide another resource, which is + not at all to say that I won't be happy to talk with you. +\border + +{\bf Practice Problems for Test 1} +\medskip + +Test 1 will cover, among other things, +our VPL-based introduction to the study of programming languages. +You should be able to execute given VPL code by hand, write short chunks of VPL code to +do certain things, and write Java code to add commands to the language. +\medskip + +The practice problems below are not intended to cover all issues. For example, any +translation of Java-like code to VPL is ``fair game.'' +\border + +\item{$\bullet$} +Here is a fairly simple VPL program, shown (with no documentation and labels +replaced by actual array indices) after the code has loaded. Trace execution of the program, +beginning with {\tt ip} at 0, +writing in the correct values in all the memory cells until the program halts. +When a value is replaced by another value, draw a line through the first value and write +the second value in the cell. You will need to track the values of the registers yourself, +but you do not need to show them formally. +\medskip + +You should draw boundaries between the code segment, global +segment, and stack segment, and between the various stack frames. +\medskip + +Also, show what will be displayed on screen. + +\vfil\eject + +\vbox{ +\beginpicture +\setcoordinatesystem units <0.4true in, 0.35true in> +\putrectangle corners at 0.0 11.25 and 1.0 12.25 +\put {$32$} at 0.5 11.75 +\put {$0$} [b] at 0.5 12.33 +\put {\tt ip} [b] at 0.5 12.65 +\putrectangle corners at 1.0 11.25 and 2.0 12.25 +\put {$1$} at 1.5 11.75 +\put {$1$} [b] at 1.5 12.33 +\putrectangle corners at 2.0 11.25 and 3.0 12.25 +\put {$4$} at 2.5 11.75 +\put {$2$} [b] at 2.5 12.33 +\putrectangle corners at 3.0 11.25 and 4.0 12.25 +\put {$3$} at 3.5 11.75 +\put {$3$} [b] at 3.5 12.33 +\putrectangle corners at 4.0 11.25 and 5.0 12.25 +\put {$22$} at 4.5 11.75 +\put {$4$} [b] at 4.5 12.33 +\putrectangle corners at 5.0 11.25 and 6.0 12.25 +\put {$0$} at 5.5 11.75 +\put {$5$} [b] at 5.5 12.33 +\putrectangle corners at 6.0 11.25 and 7.0 12.25 +\put {$17$} at 6.5 11.75 +\put {$6$} [b] at 6.5 12.33 +\putrectangle corners at 7.0 11.25 and 8.0 12.25 +\put {$22$} at 7.5 11.75 +\put {$7$} [b] at 7.5 12.33 +\putrectangle corners at 8.0 11.25 and 9.0 12.25 +\put {$1$} at 8.5 11.75 +\put {$8$} [b] at 8.5 12.33 +\putrectangle corners at 9.0 11.25 and 10.0 12.25 +\put {$3$} at 9.5 11.75 +\put {$9$} [b] at 9.5 12.33 +\putrectangle corners at 0.0 9.0 and 1.0 10.0 +\put {$3$} at 0.5 9.5 +\put {$10$} [b] at 0.5 10.08 +\putrectangle corners at 1.0 9.0 and 2.0 10.0 +\put {$1$} at 1.5 9.5 +\put {$11$} [b] at 1.5 10.08 +\putrectangle corners at 2.0 9.0 and 3.0 10.0 +\put {$3$} at 2.5 9.5 +\put {$12$} [b] at 2.5 10.08 +\putrectangle corners at 3.0 9.0 and 4.0 10.0 +\put {$0$} at 3.5 9.5 +\put {$13$} [b] at 3.5 10.08 +\putrectangle corners at 4.0 9.0 and 5.0 10.0 +\put {$2$} at 4.5 9.5 +\put {$14$} [b] at 4.5 10.08 +\putrectangle corners at 5.0 9.0 and 6.0 10.0 +\put {$24$} at 5.5 9.5 +\put {$15$} [b] at 5.5 10.08 +\putrectangle corners at 6.0 9.0 and 7.0 10.0 +\put {$6$} at 6.5 9.5 +\put {$16$} [b] at 6.5 10.08 +\putrectangle corners at 7.0 9.0 and 8.0 10.0 +\put {$2$} at 7.5 9.5 +\put {$17$} [b] at 7.5 10.08 +\putrectangle corners at 8.0 9.0 and 9.0 10.0 +\put {$28$} at 8.5 9.5 +\put {$18$} [b] at 8.5 10.08 +\putrectangle corners at 9.0 9.0 and 10.0 10.0 +\put {$2$} at 9.5 9.5 +\put {$19$} [b] at 9.5 10.08 +\putrectangle corners at 0.0 6.75 and 1.0 7.75 +\put {$33$} at 0.5 7.25 +\put {$20$} [b] at 0.5 7.83 +\putrectangle corners at 1.0 6.75 and 2.0 7.75 +\put {$0$} at 1.5 7.25 +\put {$21$} [b] at 1.5 7.83 +\putrectangle corners at 2.0 6.75 and 3.0 7.75 +\put {$2$} at 2.5 7.25 +\put {$22$} [b] at 2.5 7.83 +\putrectangle corners at 3.0 6.75 and 4.0 7.75 +\put {$26$} at 3.5 7.25 +\put {$23$} [b] at 3.5 7.83 +\putrectangle corners at 4.0 6.75 and 5.0 7.75 +\put {$4$} at 4.5 7.25 +\put {$24$} [b] at 4.5 7.83 +\putrectangle corners at 5.0 6.75 and 6.0 7.75 +\put {$1$} at 5.5 7.25 +\put {$25$} [b] at 5.5 7.83 +\putrectangle corners at 6.0 6.75 and 7.0 7.75 +\put {$9$} at 6.5 7.25 +\put {$26$} [b] at 6.5 7.83 +\putrectangle corners at 7.0 6.75 and 8.0 7.75 +\put {$2$} at 7.5 7.25 +\put {$27$} [b] at 7.5 7.83 +\putrectangle corners at 8.0 6.75 and 9.0 7.75 +\put {$0$} at 8.5 7.25 +\put {$28$} [b] at 8.5 7.83 +\putrectangle corners at 9.0 6.75 and 10.0 7.75 +\put {$1$} at 9.5 7.25 +\put {$29$} [b] at 9.5 7.83 +\putrectangle corners at 0.0 4.5 and 1.0 5.5 +\put {$5$} at 0.5 5.0 +\put {$30$} [b] at 0.5 5.58 +\putrectangle corners at 1.0 4.5 and 2.0 5.5 +\put {$2$} at 1.5 5.0 +\put {$31$} [b] at 1.5 5.58 +\putrectangle corners at 2.0 4.5 and 3.0 5.5 +%\put {$0$} at 2.5 5.0 +\put {$32$} [b] at 2.5 5.58 +%\put {\tt bp} [b] at 2.5 5.9 +\putrectangle corners at 3.0 4.5 and 4.0 5.5 +%\put {$0$} at 3.5 5.0 +\put {$33$} [b] at 3.5 5.58 +\putrectangle corners at 4.0 4.5 and 5.0 5.5 +\put {$34$} [b] at 4.5 5.58 +%\put {\tt sp} [b] at 4.5 5.9 +\putrectangle corners at 5.0 4.5 and 6.0 5.5 +\put {$35$} [b] at 5.5 5.58 +\putrectangle corners at 6.0 4.5 and 7.0 5.5 +\put {$36$} [b] at 6.5 5.58 +\putrectangle corners at 7.0 4.5 and 8.0 5.5 +\put {$37$} [b] at 7.5 5.58 +\putrectangle corners at 8.0 4.5 and 9.0 5.5 +\put {$38$} [b] at 8.5 5.58 +\putrectangle corners at 9.0 4.5 and 10.0 5.5 +\put {$39$} [b] at 9.5 5.58 +\putrectangle corners at 0.0 2.25 and 1.0 3.25 +\put {$40$} [b] at 0.5 3.33 +\putrectangle corners at 1.0 2.25 and 2.0 3.25 +\put {$41$} [b] at 1.5 3.33 +\putrectangle corners at 2.0 2.25 and 3.0 3.25 +\put {$42$} [b] at 2.5 3.33 +\putrectangle corners at 3.0 2.25 and 4.0 3.25 +\put {$43$} [b] at 3.5 3.33 +\putrectangle corners at 4.0 2.25 and 5.0 3.25 +\put {$44$} [b] at 4.5 3.33 +\putrectangle corners at 5.0 2.25 and 6.0 3.25 +\put {$45$} [b] at 5.5 3.33 +\putrectangle corners at 6.0 2.25 and 7.0 3.25 +\put {$46$} [b] at 6.5 3.33 +\putrectangle corners at 7.0 2.25 and 8.0 3.25 +\put {$47$} [b] at 7.5 3.33 +\putrectangle corners at 8.0 2.25 and 9.0 3.25 +\put {$48$} [b] at 8.5 3.33 +\putrectangle corners at 9.0 2.25 and 10.0 3.25 +\put {$49$} [b] at 9.5 3.33 +\putrectangle corners at 0.0 0.0 and 1.0 1.0 +\put {$50$} [b] at 0.5 1.08 +\putrectangle corners at 1.0 0.0 and 2.0 1.0 +\put {$51$} [b] at 1.5 1.08 +\putrectangle corners at 2.0 0.0 and 3.0 1.0 +\put {$52$} [b] at 2.5 1.08 +\putrectangle corners at 3.0 0.0 and 4.0 1.0 +\put {$53$} [b] at 3.5 1.08 +\endpicture} + +\vfil\eject + +\item{$\bullet$} +Here is a snapshot of VPL memory at a point of execution where {\tt bp}, {\tt sp}, +and +{\tt ip} are as shown. Demonstrate your +understanding of VPL by explaining this snapshot as follows. +Figure out where the code segment ends and draw a clearly visible vertical line +between the last cell of the VPL program and the first cell of the stack segment (there is +no global segment in this program). +Draw clearly visible boundary lines showing the various stack frames existing at +this moment. Finally, fill in memory cells as you +execution for another function call---start with +{\tt ip} at 10---and continue up to but not including the next function call after that. +\medskip + +\beginpicture +\setcoordinatesystem units <0.4true in, 0.4true in> +\putrectangle corners at 0.0 15.75 and 1.0 16.75 +\put {$4$} at 0.5 16.25 +\put {$0$} [b] at 0.5 16.83 +\putrectangle corners at 1.0 15.75 and 2.0 16.75 +\put {$1$} at 1.5 16.25 +\put {$1$} [b] at 1.5 16.83 +\putrectangle corners at 2.0 15.75 and 3.0 16.75 +\put {$22$} at 2.5 16.25 +\put {$2$} [b] at 2.5 16.83 +\putrectangle corners at 3.0 15.75 and 4.0 16.75 +\put {$0$} at 3.5 16.25 +\put {$3$} [b] at 3.5 16.83 +\putrectangle corners at 4.0 15.75 and 5.0 16.75 +\put {$1$} at 4.5 16.25 +\put {$4$} [b] at 4.5 16.83 +\putrectangle corners at 5.0 15.75 and 6.0 16.75 +\put {$3$} at 5.5 16.25 +\put {$5$} [b] at 5.5 16.83 +\putrectangle corners at 6.0 15.75 and 7.0 16.75 +\put {$0$} at 6.5 16.25 +\put {$6$} [b] at 6.5 16.83 +\putrectangle corners at 7.0 15.75 and 8.0 16.75 +\put {$2$} at 7.5 16.25 +\put {$7$} [b] at 7.5 16.83 +\putrectangle corners at 8.0 15.75 and 9.0 16.75 +\put {$10$} at 8.5 16.25 +\put {$8$} [b] at 8.5 16.83 +\putrectangle corners at 9.0 15.75 and 10.0 16.75 +\put {$26$} at 9.5 16.25 +\put {$9$} [b] at 9.5 16.83 +\putrectangle corners at 0.0 13.5 and 1.0 14.5 +\put {$4$} at 0.5 14.0 +\put {$10$} [b] at 0.5 14.58 +\put {\tt ip} [b] at .5 14.88 +\putrectangle corners at 1.0 13.5 and 2.0 14.5 +\put {$3$} at 1.5 14.0 +\put {$11$} [b] at 1.5 14.58 +\putrectangle corners at 2.0 13.5 and 3.0 14.5 +\put {$28$} at 2.5 14.0 +\put {$12$} [b] at 2.5 14.58 +\putrectangle corners at 3.0 13.5 and 4.0 14.5 +\put {$0$} at 3.5 14.0 +\put {$13$} [b] at 3.5 14.58 +\putrectangle corners at 4.0 13.5 and 5.0 14.5 +\put {$29$} at 4.5 14.0 +\put {$14$} [b] at 4.5 14.58 +\putrectangle corners at 5.0 13.5 and 6.0 14.5 +\put {$22$} at 5.5 14.0 +\put {$15$} [b] at 5.5 14.58 +\putrectangle corners at 6.0 13.5 and 7.0 14.5 +\put {$3$} at 6.5 14.0 +\put {$16$} [b] at 6.5 14.58 +\putrectangle corners at 7.0 13.5 and 8.0 14.5 +\put {$2$} at 7.5 14.0 +\put {$17$} [b] at 7.5 14.58 +\putrectangle corners at 8.0 13.5 and 9.0 14.5 +\put {$11$} at 8.5 14.0 +\put {$18$} [b] at 8.5 14.58 +\putrectangle corners at 9.0 13.5 and 10.0 14.5 +\put {$1$} at 9.5 14.0 +\put {$19$} [b] at 9.5 14.58 +\putrectangle corners at 0.0 11.25 and 1.0 12.25 +\put {$3$} at 0.5 11.75 +\put {$20$} [b] at 0.5 12.33 +\putrectangle corners at 1.0 11.25 and 2.0 12.25 +\put {$0$} at 1.5 11.75 +\put {$21$} [b] at 1.5 12.33 +\putrectangle corners at 2.0 11.25 and 3.0 12.25 +\put {$3$} at 2.5 11.75 +\put {$22$} [b] at 2.5 12.33 +\putrectangle corners at 3.0 11.25 and 4.0 12.25 +\put {$1$} at 3.5 11.75 +\put {$23$} [b] at 3.5 12.33 +\putrectangle corners at 4.0 11.25 and 5.0 12.25 +\put {$2$} at 4.5 11.75 +\put {$24$} [b] at 4.5 12.33 +\putrectangle corners at 5.0 11.25 and 6.0 12.25 +\put {$10$} at 5.5 11.75 +\put {$25$} [b] at 5.5 12.33 +\putrectangle corners at 6.0 11.25 and 7.0 12.25 +\put {$6$} at 6.5 11.75 +\put {$26$} [b] at 6.5 12.33 +%\put {\tt ip} [b] at 6.5 12.65 +\putrectangle corners at 7.0 11.25 and 8.0 12.25 +\put {$2$} at 7.5 11.75 +\put {$27$} [b] at 7.5 12.33 +\putrectangle corners at 8.0 11.25 and 9.0 12.25 +\put {$5$} at 8.5 11.75 +\put {$28$} [b] at 8.5 12.33 +\putrectangle corners at 9.0 11.25 and 10.0 12.25 +\put {$2$} at 9.5 11.75 +\put {$29$} [b] at 9.5 12.33 +\putrectangle corners at 0.0 9.0 and 1.0 10.0 +\put {$0$} at 0.5 9.5 +\put {$30$} [b] at 0.5 10.08 +\putrectangle corners at 1.0 9.0 and 2.0 10.0 +\put {$0$} at 1.5 9.5 +\put {$31$} [b] at 1.5 10.08 +\putrectangle corners at 2.0 9.0 and 3.0 10.0 +\put {$1$} at 2.5 9.5 +\put {$32$} [b] at 2.5 10.08 +\putrectangle corners at 3.0 9.0 and 4.0 10.0 +\put {$30$} at 3.5 9.5 +\put {$33$} [b] at 3.5 10.08 +\putrectangle corners at 4.0 9.0 and 5.0 10.0 +\put {$9$} at 4.5 9.5 +\put {$34$} [b] at 4.5 10.08 +\putrectangle corners at 5.0 9.0 and 6.0 10.0 +\put {$1$} at 5.5 9.5 +\put {$35$} [b] at 5.5 10.08 +\putrectangle corners at 6.0 9.0 and 7.0 10.0 +\put {$2$} at 6.5 9.5 +\put {$36$} [b] at 6.5 10.08 +\putrectangle corners at 7.0 9.0 and 8.0 10.0 +\put {$0$} at 7.5 9.5 +\put {$37$} [b] at 7.5 10.08 +\putrectangle corners at 8.0 9.0 and 9.0 10.0 +\put {$2$} at 8.5 9.5 +\put {$38$} [b] at 8.5 10.08 +\putrectangle corners at 9.0 9.0 and 10.0 10.0 +\put {$33$} at 9.5 9.5 +\put {$39$} [b] at 9.5 10.08 +\putrectangle corners at 0.0 6.75 and 1.0 7.75 +\put {$26$} at 0.5 7.25 +\put {$40$} [b] at 0.5 7.83 +\putrectangle corners at 1.0 6.75 and 2.0 7.75 +\put {$2$} at 1.5 7.25 +\put {$41$} [b] at 1.5 7.83 +\putrectangle corners at 2.0 6.75 and 3.0 7.75 +\put {$4$} at 2.5 7.25 +\put {$42$} [b] at 2.5 7.83 +\putrectangle corners at 3.0 6.75 and 4.0 7.75 +\put {$0$} at 3.5 7.25 +\put {$43$} [b] at 3.5 7.83 +\putrectangle corners at 4.0 6.75 and 5.0 7.75 +\put {$2$} at 4.5 7.25 +\put {$44$} [b] at 4.5 7.83 +\putrectangle corners at 5.0 6.75 and 6.0 7.75 +\put {$39$} at 5.5 7.25 +\put {$45$} [b] at 5.5 7.83 +\putrectangle corners at 6.0 6.75 and 7.0 7.75 +\put {$26$} at 6.5 7.25 +\put {$46$} [b] at 6.5 7.83 +\putrectangle corners at 7.0 6.75 and 8.0 7.75 +\put {$4$} at 7.5 7.25 +\put {$47$} [b] at 7.5 7.83 +\putrectangle corners at 8.0 6.75 and 9.0 7.75 +\put {$8$} at 8.5 7.25 +\put {$48$} [b] at 8.5 7.83 +\putrectangle corners at 9.0 6.75 and 10.0 7.75 +\put {$0$} at 9.5 7.25 +\put {$49$} [b] at 9.5 7.83 +\putrectangle corners at 0.0 4.5 and 1.0 5.5 +\put {$2$} at 0.5 5.0 +\put {$50$} [b] at 0.5 5.58 +\putrectangle corners at 1.0 4.5 and 2.0 5.5 +\put {$45$} at 1.5 5.0 +\put {$51$} [b] at 1.5 5.58 +\putrectangle corners at 2.0 4.5 and 3.0 5.5 +\put {$26$} at 2.5 5.0 +\put {$52$} [b] at 2.5 5.58 +\putrectangle corners at 3.0 4.5 and 4.0 5.5 +\put {$8$} at 3.5 5.0 +\put {$53$} [b] at 3.5 5.58 +\putrectangle corners at 4.0 4.5 and 5.0 5.5 +\put {$16$} at 4.5 5.0 +\put {$54$} [b] at 4.5 5.58 +\putrectangle corners at 5.0 4.5 and 6.0 5.5 +\put {$0$} at 5.5 5.0 +\put {$55$} [b] at 5.5 5.58 +\putrectangle corners at 6.0 4.5 and 7.0 5.5 +\put {$2$} at 6.5 5.0 +\put {$56$} [b] at 6.5 5.58 +\putrectangle corners at 7.0 4.5 and 8.0 5.5 +\put {$51$} at 7.5 5.0 +\put {$57$} [b] at 7.5 5.58 +\putrectangle corners at 8.0 4.5 and 9.0 5.5 +\put {$26$} at 8.5 5.0 +\put {$58$} [b] at 8.5 5.58 +\putrectangle corners at 9.0 4.5 and 10.0 5.5 +\put {$16$} at 9.5 5.0 +\put {$59$} [b] at 9.5 5.58 +\putrectangle corners at 0.0 2.25 and 1.0 3.25 +\put {$32$} at 0.5 2.75 +\put {$60$} [b] at 0.5 3.33 +\putrectangle corners at 1.0 2.25 and 2.0 3.25 +\put {$0$} at 1.5 2.75 +\put {$61$} [b] at 1.5 3.33 +\putrectangle corners at 2.0 2.25 and 3.0 3.25 +\put {$2$} at 2.5 2.75 +\put {$62$} [b] at 2.5 3.33 +\putrectangle corners at 3.0 2.25 and 4.0 3.25 +\put {$57$} at 3.5 2.75 +\put {$63$} [b] at 3.5 3.33 +\put {\tt bp} [b] at 3.5 3.65 +\putrectangle corners at 4.0 2.25 and 5.0 3.25 +\put {$26$} at 4.5 2.75 +\put {$64$} [b] at 4.5 3.33 +\putrectangle corners at 5.0 2.25 and 6.0 3.25 +\put {$32$} at 5.5 2.75 +\put {$65$} [b] at 5.5 3.33 +\putrectangle corners at 6.0 2.25 and 7.0 3.25 +\put {$64$} at 6.5 2.75 +\put {$66$} [b] at 6.5 3.33 +\putrectangle corners at 7.0 2.25 and 8.0 3.25 +\put {$0$} at 7.5 2.75 +\put {$67$} [b] at 7.5 3.33 +\putrectangle corners at 8.0 2.25 and 9.0 3.25 +\put {$2$} at 8.5 2.75 +\put {$68$} [b] at 8.5 3.33 +\putrectangle corners at 9.0 2.25 and 10.0 3.25 +\put {$69$} [b] at 9.5 3.33 +\put {\tt sp} [b] at 9.5 3.65 +\putrectangle corners at 0.0 0.0 and 1.0 1.0 +\put {$70$} [b] at 0.5 1.08 +\putrectangle corners at 1.0 0.0 and 2.0 1.0 +\put {$71$} [b] at 1.5 1.08 +\putrectangle corners at 2.0 0.0 and 3.0 1.0 +\put {$72$} [b] at 2.5 1.08 +\putrectangle corners at 3.0 0.0 and 4.0 1.0 +\put {$73$} [b] at 3.5 1.08 +\putrectangle corners at 4.0 0.0 and 5.0 1.0 +\put {$74$} [b] at 4.5 1.08 +\putrectangle corners at 5.0 0.0 and 6.0 1.0 +\put {$75$} [b] at 5.5 1.08 +\putrectangle corners at 6.0 0.0 and 7.0 1.0 +\put {$76$} [b] at 6.5 1.08 +\putrectangle corners at 7.0 0.0 and 8.0 1.0 +\put {$77$} [b] at 7.5 1.08 +\putrectangle corners at 8.0 0.0 and 9.0 1.0 +\put {$78$} [b] at 8.5 1.08 +\endpicture + +\vfil\eject + +\item{$\bullet$} +Write a fragment of VPL code that is a reasonable translation of each fragment +of Java-like code shown below. Assume that {\tt A} and {\tt B} are sequences of 0 or +more statements in the Java-like language, and denote the translation of a sequence of 0 or more +statements {\tt A} to VPL by the function call {\tt v(A)}---so {\tt v(A)} is +the sequence of VPL statements that {\tt A} translates to. +Also assume that the variable {\tt x} translates to local cell 7 in the +function where this fragment occurs, and that +the variable {\tt y} translates to global cell 3. +If you need any additional memory cells, assume that you can freely +use local cells +10, 11, and so on, as needed. +Use labels starting with 1000 in the code you generate. +\bigskip + +\verbatim +if( x < y ) +{ + A +} +else +{ + B +} +|endverbatim + +\vfil + +\verbatim +for( x=1; x<10; x++ ){ + A +} +|endverbatim + +\vfil\eject + +\item{$\bullet$} +Suppose we want to add a command to VPL that will allow us to +get the physical address---the index in the memory array---of a local cell +in the currently active stack frame +and store it in some local cell. +This would be useful, for example, if we wanted to implement pass-by-reference. +\medskip + +Specifically, +suppose we want to add a command with this specification: + +\halign{\tabskip 0.25true in +{\tt #}\hfil& #\hfil& \vtop{\hsize 3.5true in \baselineskip 0.8\baselineskip #}\hfil\cr +\noalign{\smallskip\hrule\smallskip} +Instruction& Mnemonic& Semantic Description\cr +\noalign{\smallskip\hrule\smallskip} +42 a b& get address& Get the index in the memory array of local cell {\tt b} and store it +in local cell {\tt a}.\cr +\noalign{\smallskip\hrule\smallskip} +} +\medskip + +Your job is to write code that will implement this new command. +Your code must fit in with the fragments of code shown. Specifically, assume that +{\tt op} holds the current operation number, which is stored in +{\tt mem[ip]}, and the variables {\tt a}, {\tt b}, and {\tt c} +hold the arguments to the command, from cells {\tt mem[ip+1]}, {\tt mem[ip+2]}, and +{\tt mem[ip+3]}. +\medskip + +Note that you have to write code that will cause the desired behavior {\it and\/} +correctly update {\tt ip}. +\medskip + +{\baselineskip 0.8\baselineskip + +\verbatim + do{ + op = mem[ ip ]; ip++; + // code to extract op and the args into a, b, c + // for convenience omitted + ... (lots of code omitted) .... + else if( op == 22 ) // literal + { + mem[ bp+2+a ] = b; + ip += 3; + } + else if( op == 23 ) // copy + { + mem[ bp+2+a ] = mem[ bp+2+b ]; + ip += 3; + } + else if( op == 24 ) // add + { + mem[ bp+2+a ] = mem[ mem[ bp+2+b] + mem[ bp+2+c ] ]; + ip += 4; + } + ... (lots more code omitted )... + // write your code to implement command 42 here: +|endverbatim +\vfil +\verbatim + else + { + System.out.println("Fatal error: unknown opcode [" + op + "]" ); + System.exit(1); + } + + }while( !done ); +|endverbatim +\par +} +\eject + + +{\bigboldfont A Survey of Memory Issues in Some Early Imperative Languages} +\medskip + +We will now look at a number of memory models used in early imperative languages that differ from +VPL. +\medskip + +\Indent{1} + The VPL memory model is actually closest to the non-object-oriented parts of Java, + which is pretty much the same as C, except C had powerful features---discussed later---that + were eliminated from Java. +\medskip +\Outdent + +In this discussion we will refer to various memory +models by the language that more or +less follows that model, but we don't care about the details, +just the main ideas. +\medskip + +In all this work, we will imagine that a Java program, with its own +vast memory, is used to translate the source code into VPL-like +language, using whatever memory resources and data structures it +needs, but then at run-time the program is executed using just the +single memory array, together with a fixed set of Java variables +acting as ``registers.'' This is identical to how we implemented VPL. +\medskip + +We will only look at features of these languages that correspond to +VPL abilities, namely working with integers only. +\medskip + + {\bf Some Terminology} + \medskip + + People talking about programming languages (including us in the following material) often use terms related to + the {\it semantics\/} of a language, including: + \medskip + + \Indent{1} + {\it scope (also known as ``visibility''):} the region of code in which a particular variable has the same meaning, + in the sense that it refers to the same cell in memory + \medskip + + {\it binding time:} the time in the entire process when the meaning of an entity (usually a variable, sometimes + other things) in the + code is ``bound'' to its meaning (memory cell for a variable). + Some things (e.g. {\tt int} literals in Java) are bound at {\it language design time}. + Other things (e.g. {\tt final static} variables in Java) are bound at compile time + + \Indent{1} + (probably---as the assembly language code is produced from the Java code, every occurrence of + such a variable might be replaced by its value). + \medskip + \Outdent + Other things (e.g. the location of a local variable in a method in Java, which will be somewhere on the + stack which is unknowable until the code is executed) are bound at {\it run time}. + \bigskip + \Outdent + + We will tend in the following to be more precise, as we present memory models for the various languages + at a level like we have done for VPL. + \medskip + + Language implementations fall into two main categories, namely {\it translated\/} (old timey word for this + was ``compiled'') or {\it interpreted}. This distinction actually only refers to the typical + approach for + a given + language---any language can in principle be translated---have the entire + source code for some program in the language translated to code in + some other language which can then somehow be executed---or interpreted---have individual statements + be processed and executed---but it might be more common or convenient to do one or the other. + \medskip + + Java is typically translated---from Java source code for a class to Java virtual machine language code + for that same class---with the Java ``byte code''---the {\tt .class} files---being interpreted. + But, there are Java compilers that translate from Java source code to assembly language code for a + particular platform (CPU and operating system). + \border + +{\bigboldfont The Basic Model} +\medskip + +By ``Basic' here we mean the old-time programming language ``Beginner's +All-Purpose Symbolic Instruction Code.'' +\medskip + +Here are the core features of this memory model: +\medskip + + \In + + \item{$\bullet$} The language is best thought of as interpreted. + \medskip + + \item{$\bullet$} All variables have global scope---they +can be accessed anywhere in the program, with the same +meaning. As each identifier (for a ``variable'') + is encountered for the first time during execution of the +code, it is assigned to a memory cell. Later occurrences of the same identifier +mean the same memory cell. + \medskip + + \item{$\bullet$} Support for subprograms is minimal---just + the {\tt gosub} and {\tt return} + commands, with no named subprograms, no + parameters, and no local variables. + \medskip + + \item{$\bullet$} No dynamic memory features, except sort of for + arrays. + \medskip + + \item{$\bullet$} Arrays are created in the global memory space, + and are allowed to have the size of an array only known at + run-time. Arrays are created by the {\tt dim} command, + such as {\tt dim a(6)} meaning to create an array named {\tt a} + that has 6 memory cells allocated. + \medskip +\Out + +\doit Develop a scheme for memory usage for this model, +in the spirit of the memory pictures we drew for VPL. +\medskip + +\doit Is recursion supported by this model? +\medskip + +\doit Could Basic really be implemented by translation in the sense +of scanning the code and mapping variables to memory cells before +actually executing the translated code? +\border + +{\bigboldfont The Pre-90 Fortran Model} +\medskip + +Note: the following is discussing Fortran as it was in the early days (Fortran 77, maybe?). Apparently modern +Fortran (Fortran 90 and up) has lots of further features, including recursion and objects. +This reminds me of the old joke: ``what will the language of the future be like?'' +``I don't know, but it will be called `Fortran' .'' +\medskip + + \In + \item{$\bullet$} All variables have local scope---they can only be accessed in the + subprogram where they occur. + \medskip + + \item{$\bullet$} Parameter passing is done by ``pass by reference.'' This means that + the address of an argument is passed to the subprogram, and the compiler translates + all occurrences of parameters to use the memory location with the address stored + in the parameter. + \medskip + + \item{$\bullet$} No dynamic memory. Array declarations must have a size that can + be determined statically---that is, at compile time. + \medskip + + \item{$\bullet$} No recursion. + \medskip +\Out + +\doit Develop a scheme for memory usage for +this model, in the spirit of the + memory pictures we drew for VPL. Think about how a translator for this language would + deal with variables. Note that with this model, values of local variables can have a lifetime + that is the lifetime of the program execution. +\medskip + +\doit Be careful to understand exactly how pass-by-reference works. +\medskip + +\doit Why is recursion not allowed? Why must arrays have +their size known at compile-time? +\border + +{\bigboldfont The Pascal Model} +\medskip + + \In + + \item{$\bullet$} Parameter passing is done by pass by value or pass by reference, depending + on whether the parameter has a special key word ({\tt var}, in case you care) occurring in its + declaration to specify pass by reference. + \medskip + + \item{$\bullet$} Dynamic memory is allowed, through the ability to + allocate any number of bytes on the heap during execution. + \medskip + + \item{$\bullet$} Scoping of variables is very complicated, because {\it nested subprograms\/} + are allowed. In other words, subprograms are declared within subprogram bodies, much like + local variables. + \medskip + + \doit Consider why this seems like a good idea. Programming language experts + speak of the idea of ``orthogonality'' in programming language design. The following discussion + will indicate why this is not such a good idea, maybe---is the additional complexity worth it? + \medskip + + \item{$\bullet$} In fact, there are two different ideas for scoping in such a language, known + as static (or lexical) scoping and dynamic scoping. Pascal actually uses static scoping, but we will + ponder both approaches here. + \medskip + + \item{$\bullet$} To deal with the semantics of nested subprograms, we will use the + following execution model: + \medskip + \In + Instead of stack frames on a linear strip of memory like we have been doing, + we will use a 2D picture. A rectangle is drawn to represent the local variables and + subprograms for a subprogram. Each such rectangle is labeled in its upper right + corner by the name of the subprogram. + In the upper left corner of each + rectangle we write all the identifiers---variables and subprogram names---that are + declared within the subprogram. + \medskip + + Start with a large box representing the entire program, and + start executing the body of the program in this context. When a subprogram is called, + draw a box for it either inside the active box (that's dynamic scoping) or immediately + inside the box where the subprogram name is declared (that's static scoping). + \medskip + + The meaning of an identifier---both variables and subprograms---is determined + by first looking at the upper left corner of + the current box, and then scanning {\it outward\/} until the identifier is first located. + \medskip + + \item{$\Rightarrow$\quad} Find or write some Pascal code and execute it according to these + rules. Execute the same code with both scoping models. + \medskip + + \item{$\Rightarrow$\quad} Draw a possible memory picture for this model, in the spirit of the + memory pictures we drew for VPL. Note that the boxes we draw are essentially + stack frames, + and try to figure out how a stack frame could hold the + information necessary to implement each scoping model. + \border + \Out + +{\bigboldfont The C Model} +\medskip + + C was invented in an era when + Pascal-like languages (actually as we read online the first day, Niiklaus Wirth + invented Pascal as a simpler language reacting to the complexity of Algol 68) + were dominant and represented a step toward + simplicity. + \medskip + + \item{$\bullet$} C has variables and functions similar to Java's {\tt static} fields and + methods. Variables declared outside any function are visible to any function (there are + lots of details about occurrence within files, but we don't care much). + \medskip + + \item{$\bullet$} C only implements pass-by-value, but it has operators + * (with {\tt int * x} meaning {\tt x} holds an address, and {\tt *x} used in an + expression meaning the cell(s) that {\tt x}'s address points to), and + \& (the ``address of'' operator) + \medskip + + \item{$\bullet$} Dynamic memory is allowed. + \medskip + + \item{$\bullet$} C only has functions. Earlier languages (notably Fortran and Pascal) had both + functions (subprograms that return a value) and subroutines/procedures (subprograms that + don't return a value). + \medskip + \item{$\Rightarrow$\quad} Draw a possible memory picture for the C model, in the spirit of the + memory pictures we drew for VPL. Be sure to include the fact that C allows arbitrarily + large arrays and {\tt struct} variables to be local variables. + \medskip + \Out + +\vfil\eject + +{\bigboldfont Official Announcement of Policy Change} +\medskip + +Some people have asked to work in groups of size larger than three on the Projects, so I +am somewhat reluctantly changing the course policy to allow groups of up to five students submitting +Projects together. If you want to have six people in a group, you must ask for permission. +Larger groups will not be allowed. +\border + +{\bigboldfont Follow-up to Exercise 5 and 6} +\medskip + +After the whole group discussion during +class session 5, Jimmy and I (Peter was flooded out), but I'll take most of the blame, designed +the new language to be named {\tt Jive}. +\medskip + +I then proceeded over the weekend to begin implementing a Jive to VPL translator, as a sanity check before +assigning the same work as Project 2. To avoid burying the lede (yes, that's not the word ``lead'' as +I thought my whole life until recently), I'm not going to assign this work for Project 2, because it seemed +too much. Instead, you will be responsible (on Test 1) +for the concepts of this work: being able to hand-execute +a given Jive program, being able to write a Jive program to perform a specified task, and, most importantly, +being able to translate a given Jive program into VPL. +\medskip + +You can find the code I'm writing in the {\tt Jive} folder at the course web site. I hope to finish it by 9/11/2018. +\medskip + +\doit I will present the draft design for Jive, driven by the draft finite automata hand-written on the next page. +Feedback will be considered (but I've done a fair amount of the implementation work, so I won't +be too open to changes other than correcting problems. +\medskip + +\doit Write a Jive program that will get a positive integer $n$ from the user and will then compute and +report $n!$. +\medskip + +\doit Hand-translate this program to VPL, demonstrating the ideas of my partially-completed code. +\border + +{\bigboldfont Exercise 7} +\medskip + +Working in your small group, write the following Jive programs, and translate each into VPL: +\medskip + +\Indent{1} +\item{$\bullet$} The same goal as Exercise 1, part c. +\medskip + +\item{$\bullet$} The same goal as Exercise 1, part d. +\medskip + +\item{$\bullet$} The same goal as Exercise 3. + +\medskip +\Outdent + +\vfil\eject + +{\bigboldfont Exercise 8} +\medskip + +Note: do this before Exercise 7! +\medskip + +I've been working as time allows on the Jive implementation (current version available at the course web site). +You can help me debug it! +\medskip + +Here is the {\tt factorial.jive} program next to the translated VPL version: +\bigskip\bigskip + +\hbox to \hsize{% +\hfil% +\vbox{\hsize 2.5true in +\listing{../Jive/Tests/factorial}{\tt} +} +\hfil +\vbox{\hsize 1.5true in +\listing{../Jive/Tests/factorial.vpl}{\tt} +}% +\hfil} + +\vfil\eject + +{\bigboldfont The Jive Manual} +\bigskip + +In the following, quantities in angle brackets, like {\tt }, represent single +non-terminal symbols in the given grammar (we'll talk more carefully about context free grammars later). +Other symbols represent physical symbols that can be typed in a Jive program file. +\medskip + +A context free grammar is basically a collection of rules that say the quantity on the left can be +replaced by the quantities on the right of the arrow (the arrow used in CFG's is +different from the two physical symbols {\tt ->} that appear in Jive code). +\medskip + +Note that I'm using a CFG to specify Jive, instead of a finite automaton like I gave you earlier, + because it is easier to type grammar rules than to typeset diagrams. + \medskip + + Quantities that appear in square brackets, like {\tt [ ]}, are optional. + \medskip + +Here are the {\it syntax\/} rules ( with some English mixed in to the rules, purely +for convenience). +\medskip + +{\baselineskip 1.5 \baselineskip + +{\tt } $\rightarrow$ {\tt [ ]

[ ] } + +{\tt } $\rightarrow$ {\tt Globs [ ] .} + +{\tt } $\rightarrow$ zero or more {\tt } + +{\tt } $\rightarrow$ zero or more {\tt } + +{\tt
} $\rightarrow$ zero or more {\tt } + +{\tt } $\rightarrow$ zero or more {\tt } + +{\tt } $\rightarrow$ {\tt Def [ ] . } +\bigskip + +{\tt } $\rightarrow$ {\tt /* } any words that are not */ {\tt */} + +{\tt } $\rightarrow$ {\tt Halt} + +{\tt } $\rightarrow$ {\tt NL} + +{\tt } $\rightarrow$ {\tt <&D}_TaN# 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 literal 0 HcmV?d00001 diff --git a/Documents/policies.tex b/Documents/policies.tex new file mode 100755 index 0000000..46d59ab --- /dev/null +++ b/Documents/policies.tex @@ -0,0 +1,262 @@ +\input /Users/Shared/TeX/defs +\input pictex +\input /Users/Shared/TeX/ruled + +%\advance \voffset by 1true in + +\pageno -1 +\parindent 0true in + +\datestartup{CS 3210 Fall 2018}{-1} % crucial for all later handouts + +\line{\bf CS 3210 Principles of Programming Languages \hfil Fall 2018} +\medskip +\hrule +\bigskip +Instructor: Jerry Shultz +\medskip +\hrule +\medskip +\line{Office: {AES Building, Room 200Z}\hfil Phone: {\bf 303 615 1161}} +\medskip +\line{Email: {\bf shultzj@msudenver.edu}\hfil Website: {\bf rowdysites.msudenver.edu/$\sim$shultzj}} +\medskip +\hrule +\medskip + +\input schedule +\medskip +\hrule +\medskip + +The times listed as ``Office Hours'' are times that I will be sitting in my office waiting to help you when you call or come by (barring emergencies and +quick trips away and back, and travel time from and to classes). +\medskip + You are +welcome to stop by any time on the chance that I'll be there and will be able to meet with you. +Finally, if those times are not convenient for you, we can arrange a mutually convenient time +to meet. +\bigskip + +\vfil\eject + +\line{\bf Text:\hfil} + +Written materials provided by instructor and online resources + +\medskip + +\line{\bf Prerequisites\hfil} +CS 2050, CS 2400, CS 3250, and MTH 3170, all with a grade of C or better, or permission of instructor +\medskip + +%\line{\bf Official Syllabus\hfil} + +%You can find the official syllabus for this course at {\tt https://mcs.msudenver.edu/syllabi} +%\medskip + + +{\bf Withdrawal dates} for FULL-TERM courses are: +\medskip + +\ruledtable +100\% refund: | Sunday, August 26 \nr +50\% refund: | Wednesday, September 5 \nr +Last Day for W: | Wednesday, November 2 +\endruledtable +\medskip + +{\advance \leftskip .5true in +For all full-term and part-term courses, you can confirm withdrawal dates on your + +$\underline{\hbox{Student Detail Schedule}}$ +\medskip +} + +{\bf Holiday information:} + +Labor Day: September 3 (campus closed) + +Fall Break: November 19--25 (no classes, campus open except on 11/22 and 11/23) +\medskip + + {\bf University Policies} +\medskip + +Students are responsible for full knowledge of the provisions and regulations pertaining +to all aspects of their attendance at MSU Denver, and should familiarize themselves with +the following policies: + +{\advance \leftskip .5true in +\item{1.} GENERAL UNIVERSITY POLICIES + +\item{2.} GRADES AND NOTATIONS including WITHDRAWAL FROM A COURSE,\hfil\break ADMINISTRATIVE +WITHDRAWAL, and INCOMPLETE POLICY + +\item{} Students should be aware that any kind of withdrawal can have a negative impact on some +types of financial aid, including scholarships. + +\item{3.} ACADEMIC INTEGRITY + +\item{4.} POLICY STATEMENTS ON SEXUAL MISCONDUCT + +\item{5.} ACCOMMODATIONS TO ASSIST INDIVIDUALS WITH DISABILITIES + +\item{6.} CLASS ATTENDANCE + +\item{7.} ELECTRONIC COMMUNICATION (STUDENT EMAIL) POLICY +\medskip +} + +For a complete description of these policies go to + {\tt msudenver.edu/math/policies} + +\border + + {\bf Additional Policies for this Course} +\medskip + +If you must miss a class session, it is your +responsibility to find out what you missed and make up work if possible. +If you miss a test due to an appropriate cause (illness, unavoidable family or work conflicts, +religious holiday, etc.), you +are responsible for arranging with me a time to take a make-up exam. +\border + +\vfil\eject + +\font \smallerfont cmr10 scaled 800 +\font \smallertt cmtt10 scaled 800 + +\line{\bf Course Organization and Rules\hfil} +\medskip + +In a typical class session I will present some new material---Mini-Lectures---with that material written up + in the +course notes. Then students will work on Exercises giving hands-on work with the new material. +Some Exercises will involve hand-written solutions and should be done, ideally, working in groups of +four or five using a section of whiteboard. Other Exercises will involve writing code on a computer and +should be done, ideally, working in groups of two or three with at least one laptop computer brought in +by a student. +As students work on these Exercises, the instructor and two Learning Assistants will be available to +discuss issues that come up. +\medskip + +Note that these Exercises are designed to provide a more effective alternative to listening to lectures all +the time. The Exercises are not graded, but if you do not complete them during class time (especially if +you are not in class) you should complete them outside of class. If you are unable to do the Exercises, +you will probably not do well on the corresponding questions on the Tests. +It is strongly encouraged that you work in groups, because for most people this is helpful, but it is not +required. +\medskip + +At times we will discuss Exercises as a whole group after students have had time to work on them separately. +\medskip + +I will post all course materials, including the written ``course notes'' corresponding to the +mini-lectures, and any summaries of whole group discussions of Exercises, +at\hfil\break +{\tt rowdysites.msudenver.edu/$\sim$shultzj} +\bigskip + +Your ``homework'' for this course will be to go over the new material and corresponding Exercises as needed, +and to complete a number of programming Projects. +\medskip + +You are encouraged to discuss the course +material, the Exercises, and even the Projects +with other students, me, the Learning Assistants, or whomever you wish, +but you may not receive any help from anyone on the Tests. +Also, while you are encouraged to discuss the Projects +with others, you may not directly copy the work of +others---any work that you submit should, at a minimum, +be ``written in your own words.'' +\medskip + +It is okay, even encouraged, to do the Projects as a group effort with at most three people participating fully. +If your work on a Project is part of a group effort, the group must turn in one submission, +with the two or three group members clearly identified. If you do this, be sure that it is an +actual meaningful collaboration, not just giving the work of one person to the others. And, +when one group member emails me the group submission, be sure to ``CC'' the other +one or two group members so they also receive the feedback email from me. +\medskip + +Each project will be worth some number of project points, varying somewhat from project to project to +reflect the work involved in each one. +If your project does not fully meet the specifications, you will be given feedback and will have the +opportunity, with no penalty, to fix the problems and resubmit your work. +Only very limited partial credit will be given for work that is not correct and complete, and this will +happen only when you do not resubmit your work, typically at the end of the semester when you simply +run out of time. +\medskip + +Each Project will have a due date by which your first serious submission must be made. +When a Project is specified its tentative due date will be given, but sometimes we will adjust that +date to a later date. +You will be allowed to fix/complete work on projects later as long as you make a first +meaningful submission on time. +Projects not submitted by the due date + will not be accepted. +\bigskip + +We will have three in-class Tests, each covering roughly the previous five weeks of material. +You will be allowed to use any written materials during the Tests, but you will not be allowed to +use any electronic devices. +\medskip + +Here is the schedule for the tests: +\medskip + +\ruledtable +Test Number | Date | Class Periods Covered \cr +Test 1 | September 26 | 1--8 \nr + | (class period 11) | \cr +Test 2 | October 29 | 9, 10, 12--17 \nr + | (class period 20) | \cr +Test 3 | December 10 or 12 | 18, 19, 21--27 \nr + | (scheduled final exam time) | +\endruledtable +\bigskip} + +Here is how course grades will be figured: +\medskip + +{\advance \leftskip 0.5true in + +Your {\tt testScore} will be computed by averaging your three test scores. Each test score is computed by dividing the points you got by the +number of points possible (so test ``points'' have different values on each test---they are just a convenient way of doing the partial credit +accounting on each problem). +\medskip + +Your {\tt projectScore} will be the number of project points you got divided by the number of +project points possible. +\medskip + +Your course score is then computed as +\smallskip +{\tt 0.4 * projectScore + 0.6 * testScore} +\medskip + +Your course grade is then computed according to this chart: +\medskip +} + +%\TightTables + +\def\tablespace{\hskip 0.05true in} +\def\tw{.35true in} + +\font \tinytt cmtt10 scaled 500 +\ruledtable +\bf Score in: | \rtitem{\tw}{\tinytt [0,60)} | \rtitem{\tw}{\tinytt [60,63)} | \rtitem{\tw}{\tinytt [63,67)} | \rtitem{\tw}{\tinytt [67,70)} | \rtitem{\tw}{\tinytt [70,73)} | \rtitem{\tw}{\tinytt [73,77)} | \rtitem{\tw}{\tinytt [77,80)} | \rtitem{\tw}{\tinytt [80,83)} | \rtitem{\tw}{\tinytt [83,87)} | \rtitem{\tw}{\tinytt [87,90)} | \rtitem{\tw}{\tinytt [90,93)} | \rtitem{\tw}{\tinytt [93,100]} \cr +\bf Grade: | \rtitem{\tw}{F} | \rtitem{\tw}{D-} | \rtitem{\tw}{D} | \rtitem{\tw}{D+} | \rtitem{\tw}{C-} | \rtitem{\tw}{C} | \rtitem{\tw}{C+} | \rtitem{\tw}{B-} | \rtitem{\tw}{B} | \rtitem{\tw}{B+} | \rtitem{\tw}{A-} | \rtitem{\tw}{A} +\endruledtable +\medskip + +{\advance \leftskip .5true in +with the additional rule that I will improve your grade by one level (one column farther to the right) if you have good attendance and participation. +\bigskip +} + +\vfil\eject +\bye diff --git a/Documents/schedule.tex b/Documents/schedule.tex new file mode 100755 index 0000000..6cb8661 --- /dev/null +++ b/Documents/schedule.tex @@ -0,0 +1,89 @@ +% PiCTeX schedule generated by Scheduler.java +% if not already loaded, decomment 2 lines below: +%\input pictex +%\input latexpicobjs +{\font \schedfont cmr10 scaled 750 +{\font \boldschedfont cmbx10 scaled 750 +\schedfont +$$ +\beginpicture +\setcoordinatesystem units <0.75pt, 0.75pt> +\put{{\boldschedfont 9:00}--9:30} <22.5pt, 7.5pt> at 0.0 360.0 +\putrectangle corners at 0.0 380.0 and 60.0 360.0 +\put{9:30--10:00} <22.5pt, 7.5pt> at 0.0 340.0 +\putrectangle corners at 0.0 360.0 and 60.0 340.0 +\put{{\boldschedfont 10:00}--10:30} <22.5pt, 7.5pt> at 0.0 320.0 +\putrectangle corners at 0.0 340.0 and 60.0 320.0 +\put{10:30--11:00} <22.5pt, 7.5pt> at 0.0 300.0 +\putrectangle corners at 0.0 320.0 and 60.0 300.0 +\put{{\boldschedfont 11:00}--11:30} <22.5pt, 7.5pt> at 0.0 280.0 +\putrectangle corners at 0.0 300.0 and 60.0 280.0 +\put{11:30--12:00} <22.5pt, 7.5pt> at 0.0 260.0 +\putrectangle corners at 0.0 280.0 and 60.0 260.0 +\put{{\boldschedfont 12:00}--12:30} <22.5pt, 7.5pt> at 0.0 240.0 +\putrectangle corners at 0.0 260.0 and 60.0 240.0 +\put{12:30--1:00} <22.5pt, 7.5pt> at 0.0 220.0 +\putrectangle corners at 0.0 240.0 and 60.0 220.0 +\put{{\boldschedfont 1:00}--1:30} <22.5pt, 7.5pt> at 0.0 200.0 +\putrectangle corners at 0.0 220.0 and 60.0 200.0 +\put{1:30--2:00} <22.5pt, 7.5pt> at 0.0 180.0 +\putrectangle corners at 0.0 200.0 and 60.0 180.0 +\put{{\boldschedfont 2:00}--2:30} <22.5pt, 7.5pt> at 0.0 160.0 +\putrectangle corners at 0.0 180.0 and 60.0 160.0 +\put{2:30--3:00} <22.5pt, 7.5pt> at 0.0 140.0 +\putrectangle corners at 0.0 160.0 and 60.0 140.0 +\put{{\boldschedfont 3:00}--3:30} <22.5pt, 7.5pt> at 0.0 120.0 +\putrectangle corners at 0.0 140.0 and 60.0 120.0 +\put{3:30--4:00} <22.5pt, 7.5pt> at 0.0 100.0 +\putrectangle corners at 0.0 120.0 and 60.0 100.0 +\put{{\boldschedfont 4:00}--4:30} <22.5pt, 7.5pt> at 0.0 80.0 +\putrectangle corners at 0.0 100.0 and 60.0 80.0 +\put{4:30--5:00} <22.5pt, 7.5pt> at 0.0 60.0 +\putrectangle corners at 0.0 80.0 and 60.0 60.0 +\put{{\boldschedfont 5:00}--5:30} <22.5pt, 7.5pt> at 0.0 40.0 +\putrectangle corners at 0.0 60.0 and 60.0 40.0 +\put{5:30--6:00} <22.5pt, 7.5pt> at 0.0 20.0 +\putrectangle corners at 0.0 40.0 and 60.0 20.0 +\put{{\boldschedfont 6:00}--6:30} <22.5pt, 7.5pt> at 0.0 0.0 +\putrectangle corners at 0.0 20.0 and 60.0 0.0 +\put{CS 3510} <29.400000000000002pt, 29.400000000000002pt> at 60.8 260.8 +\putrectangle corners at 60.8 339.20000000000005 and 139.2 260.8 +\put{CS 3510} <29.400000000000002pt, 29.400000000000002pt> at 220.8 260.8 +\putrectangle corners at 220.8 339.20000000000005 and 299.20000000000005 260.8 +\put{CS 3210} <29.400000000000002pt, 29.400000000000002pt> at 60.8 180.8 +\putrectangle corners at 60.8 259.20000000000005 and 139.2 180.8 +\put{CS 3210} <29.400000000000002pt, 29.400000000000002pt> at 220.8 180.8 +\putrectangle corners at 220.8 259.20000000000005 and 299.20000000000005 180.8 +\put{CS 3240} <29.400000000000002pt, 29.400000000000002pt> at 140.8 20.8 +\putrectangle corners at 140.8 99.2 and 219.20000000000002 20.8 +\put{CS 3240} <29.400000000000002pt, 29.400000000000002pt> at 300.8 20.8 +\putrectangle corners at 300.8 99.2 and 379.20000000000005 20.8 +\put{Office Hours} <29.400000000000002pt, 14.399999999999999pt> at 60.8 140.8 +\putrectangle corners at 60.8 179.20000000000002 and 139.2 140.8 +\put{Office Hours} <29.400000000000002pt, 14.399999999999999pt> at 220.8 140.8 +\putrectangle corners at 220.8 179.20000000000002 and 299.20000000000005 140.8 +\put{Office Hours} <29.400000000000002pt, 14.399999999999999pt> at 140.8 100.8 +\putrectangle corners at 140.8 139.2 and 219.20000000000002 100.8 +\put{Office Hours} <29.400000000000002pt, 14.399999999999999pt> at 300.8 100.8 +\putrectangle corners at 300.8 139.2 and 379.20000000000005 100.8 +\put{Office Hours} <29.400000000000002pt, 14.399999999999999pt> at 220.8 100.8 +\putrectangle corners at 220.8 139.2 and 299.20000000000005 100.8 +\put{CS Meetings} <29.400000000000002pt, 21.9pt> at 380.8 280.8 +\putrectangle corners at 380.8 339.2 and 459.20000000000005 280.8 +\put{Dept. Meetings} <29.400000000000002pt, 21.9pt> at 380.8 160.8 +\putrectangle corners at 380.8 219.20000000000002 and 459.20000000000005 160.8 +\put{L.A. Meeting} <29.400000000000002pt, 14.399999999999999pt> at 220.8 60.8 +\putrectangle corners at 220.8 99.19999999999999 and 299.20000000000005 60.8 +\put{Monday} <30.0pt, 8.25pt> at 60.0 380.0 +\putrectangle corners at 60.0 402.0 and 140.0 380.0 +\put{Tuesday} <30.0pt, 8.25pt> at 140.0 380.0 +\putrectangle corners at 140.0 402.0 and 220.0 380.0 +\put{Wednesday} <30.0pt, 8.25pt> at 220.0 380.0 +\putrectangle corners at 220.0 402.0 and 300.0 380.0 +\put{Thursday} <30.0pt, 8.25pt> at 300.0 380.0 +\putrectangle corners at 300.0 402.0 and 380.0 380.0 +\put{Friday} <30.0pt, 8.25pt> at 380.0 380.0 +\putrectangle corners at 380.0 402.0 and 460.0 380.0 +\endpicture +$$ +} diff --git a/Jive/IntPair.java b/Jive/IntPair.java new file mode 100755 index 0000000..af4e4cc --- /dev/null +++ b/Jive/IntPair.java @@ -0,0 +1,8 @@ +public class IntPair +{ + public int first, second; + + public IntPair( int a, int b ) + { first = a; second = b; } + +} diff --git a/Jive/Jive.java b/Jive/Jive.java new file mode 100755 index 0000000..481e812 --- /dev/null +++ b/Jive/Jive.java @@ -0,0 +1,948 @@ +import java.io.File; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.Scanner; + +public class Jive { + + private static Scanner keys = new Scanner( System.in ); + private static Scanner input; + private static PrintWriter output; + private static PrintWriter output2; + + // "global" info --- applies across entire program + // ------------------------------------------------ + + // holds the vpl code as it is produced + private static ArrayList vpl = new ArrayList(); + + // holds the name and starting index of all functions + private static ArrayList funcStart = new ArrayList(); + + // string at given index is name of function called at hole -index + private static ArrayList callHoles = new ArrayList(); + + // stores for entire program the start label assigned to each + // given function name + private static ArrayList callInfo = new ArrayList(); + + + // little info for actual globals in VPL: + // ---------------------------------------- + // holds all the global variables for entire program + private static ArrayList globsList; + + + // "local" info --- used separately for each function + // -------------------------------------------------- + + // holds the local variables and literals temporarily for each function + private static ArrayList locsList = new ArrayList(); + + // once have a locsList for a function, store it in allLocs for output2 + private static ArrayList allLocs = new ArrayList(); + + // holds the locations of the holes and the corresponding labels in current function + private static ArrayList labelHoles = new ArrayList(); + + // holds the label and corresponding index for all labels in current function + private static ArrayList labelInfo = new ArrayList(); + + + + public static void main(String[] args) throws Exception { + if (args.length != 1) { + System.out.println("Usage: java Jive "); + System.exit(1); + } + + String fileName = args[0]; + + input = new Scanner( new File( fileName ) ); + output = new PrintWriter( new File( fileName + ".vpl" ) ); + output2 = new PrintWriter( new File( fileName + ".doc" ) ); + + // scan Jive file one word at a time + // (line breaks mean nothing more than a space) + + // start anonymous "main" function + // since human readability is not a big issue, go ahead + // and treat the "main" function like all others, even + // though the label at the top is meaningless, since it + // can't be called + // (all other functions do these things when "Def" is encountered) + + vpl.add( 1 ); + vpl.add( nextLabel(true) ); // all functions start with a 1 command + + // note index where command 4 will be inserted + // (can change if there's a Globs command) + funcStart.add( new StringIntPair( "?", 2 ) ); + + // note label for start of the function + callInfo.add( new StringIntPair( "?", currentLabel ) ); + + // make scratch cell (local cell 0) for scratch space for main + locsList.add( "-" ); + int scratch = 0; + + String rememberWord = "huh?"; // used a little to pass word to next state + + callHoles.add("---"); // waste spot 0 so call holes -1, -2, -3, .. + // match nicely to positions in list + + int state = 1; + + while ( input.hasNext() ) { + + String word = input.next(); + + System.out.println("--------------------->>>" + + "\nIn state " + state + " processing [" + word + "]" ); + + if ( state == 1 ) { + if ( word.equals("/*") ) { + state = 2; + } + else if ( word.equals("Halt") ) { + vpl.add( 26 ); + state = 1; + } + else if ( word.equals("NL") ) { + vpl.add( 29 ); + state = 1; + } + else if ( word.equals("Def") ) {// starting a function definition + + // stuff to do when see Def, also when see end of input file + finishFunctionDef(); + + // initialize things for the upcoming function definition + locsList = new ArrayList(); + labelHoles = new ArrayList(); + labelInfo = new ArrayList(); + + // move on to see the function name + state = 3; + } + else if ( isLabel( word ) ) {// process a label + + int label = nextLabel(false); + + labelInfo.add( new StringIntPair( word, label ) ); + + vpl.add( 1 ); + vpl.add( label ); + + state = 1; + + } + else if ( word.equals("Globs") ) {// global declarations section + // global declarations must be first command in program, if there at all + if ( vpl.size() == 2 ) {// have only put in the command 1 for "main" + // so still at start + vpl.add( 0, 32 ); + + globsList = new ArrayList(); + + state = 6; + } + else { + error( "Globals declaration must occur at very beginning of a Jive program"); + } + } + else if ( word.equals("Jmp") ) { + vpl.add( 7 ); + state = 7; + } + + else if ( findBIF2( word ) >= 0 ) {// is built-in function with 2 args + // cheaply get opcode corresponding to word + + int op; + if ( word.equals("Get") ) { + op = 24; + } + else { + op = findBIF2(word) + 9; + } + + vpl.add( op ); // the binary op + vpl.add( scratch ); // where to put the result + state = 8; + } + + else if ( findBIF1( word ) >= 0 ) {// is built-in function with 1 arg + if ( word.equals( "Not" ) ) + vpl.add( 20 ); + else if ( word.equals( "Opp" ) ) + vpl.add( 21 ); + else if ( word.equals( "New" ) ) + vpl.add( 31 ); + else + error("[" + word + "] is not a valid one argument built-in function"); + + vpl.add( scratch ); + + state = 11; + } + + else if ( word.equals("Keys") ) {// is built-in function with 0 args + vpl.add( 27 ); + state = 13; + } + + else if ( word.equals("Fet") ) {// have to look for built-in Fet before user-def + state = 16; + } + + else if ( isFuncName( word ) ) { + rememberWord = word; + state = 14; + } + + else if ( isVar( word ) ) { + // can put in entire part 1 code here + vpl.add( 23 ); + vpl.add( scratch ); + vpl.add( processVar( word, locsList ) ); + + state = 15; + } + + }// state 1 + + else if ( state == 2 ) { + if ( word.equals("*/") ) {// reached end of comment + state = 1; // start a new command + } + else {// part of comment + // consume the word and stay in state 2 + } + } + + else if ( state == 3 ) { + if ( ! isFuncName( word ) ) { + error( "[" + word + "] is not a valid function name"); + } + + vpl.add( 1 ); + vpl.add( nextLabel(true) ); // all functions start with a 1 command + + // note index where command 4 will be inserted + funcStart.add( new StringIntPair( word, vpl.size() ) ); + + // note label for start of the function + callInfo.add( new StringIntPair( word, currentLabel ) ); + + state = 5; + } + + // state 4 lost in change from f ( a b c ) to f a b c . + + else if ( state == 5 ) { + if ( word.equals( "." ) ) { + + // make scratch cell for this function after params cells + locsList.add( "-" ); + scratch = locsList.size()-1; + + state = 1; // go on to body of function + + } + else if ( isParam( word ) ) { + // note another parameter + locsList.add( word ); + // loop back to stay in state 5 + } + } + + else if ( state == 6 ) { + if ( word.equals( "." ) ) { + // done creating list of globals, generate VPL code for command 32 + vpl.add( 1, globsList.size() ); + + // adjust start index of "main" to be 2 farther + funcStart.get( 0 ).x += 2; + + state = 1; + } + else if ( isParam( word ) ) { + // add global + globsList.add( word ); + // stay in state 6 + } + else { + error("[" + word + "] is not a valid global variable name"); + } + } + + else if ( state == 7 ) { + if ( isLabel( word ) ) { + // add the hole + vpl.add( -1 ); + labelHoles.add( new StringIntPair( word, vpl.size()-1 ) ); + + state = 1; + } + else { + error( "[" + word + "] is not a valid label"); + } + } + + else if ( state == 8 ) { + if ( isVar( word ) ) { + vpl.add( processVar( word, locsList ) ); // first arg + state = 9; + } + else { + error( "[" + word + "] is not a valid variable or literal"); + } + } + + else if ( state == 9 ) { + if ( isVar( word ) ) { + vpl.add( processVar( word, locsList ) ); // second arg + state = 10; + } + else { + error( "[" + word + "] is not a valid variable or literal"); + } + } + + else if ( state == 10 ) { + if ( word.equals("->") ) { + state = 100; + } + else { + error("a part 1 must be followed by ->"); + } + } + + else if ( state == 11 ) { + if ( isVar( word ) ) { + vpl.add( processVar( word, locsList ) ); + state = 12; + } + else { + error( "[" + word + "] is not a valid variable or literal"); + } + } + + else if ( state == 12 ) { + if ( word.equals("->") ) { + state = 100; + } + else { + error("a part 1 must be followed by ->"); + } + } + + else if ( state == 13 ) { + if ( word.equals("->") ) { + vpl.add( scratch ); + + state = 100; + } + else { + error("a part 1 must be followed by ->"); + } + } + + else if ( state == 14 ) { + if ( isVar( word ) ) { + vpl.add( 3 ); + vpl.add( processVar( word, locsList ) ); + // state loops to 14 + } + else if ( word.equals("->") ) { + // done with function call, send out the vpl code + + vpl.add( 2 ); + vpl.add( - nextCallHole() ); // leave a hole + callHoles.add( rememberWord ); + + // followed by command 6 for when return from doing called function + vpl.add( 6 ); + vpl.add( scratch ); + + state = 100; + } + else { + error("a part 1 must be followed by ->"); + } + + } + + else if ( state == 15 ) { + if ( word.equals("->") ) { + state = 100; + } + else { + error("a part 1 must be followed by ->"); + } + } + + else if ( state == 16 ) { + if ( isParam( word ) ) { + vpl.add( 34 ); + vpl.add( scratch ); + vpl.add( processVar( word, globsList ) ); + + state = 17; + } + else { + error("[" + word + "] is not a valid argument for Fet"); + } + } + + else if ( state == 17 ) { + if ( word.equals("->") ) { + state = 100; + } + else { + error("a part 1 must be followed by ->"); + } + + } + + // end of part 1 states + + // begin part 2 states + + else if ( state == 100 ) {// start state for part 2 + + if ( word.equals(".") ) { + // do nothing with the value in scratch cell from part 1 + state = 1; + } + + else if ( word.equals("Prt") ) { + // generate code to print the value in the scratch cell + vpl.add( 28 ); + vpl.add( scratch ); + state = 1; + } + + else if ( word.equals("Sym") ) { + // generate code to print the value in the scratch cell + vpl.add( 30 ); + vpl.add( scratch ); + state = 1; + } + + else if ( word.equals("Ret") ) { + // generate code to return the value in scratch cell + vpl.add( 5 ); + vpl.add( scratch ); + state = 1; + } + + else if ( isParam( word ) ) { + vpl.add( 23 ); + vpl.add( processVar( word, locsList ) ); + vpl.add( scratch ); + state = 1; + } + + else if ( word.equals("Jmp") ) { + state = 101; + } + + else if ( word.equals("Put") ) { + state = 102; + } + + else if ( word.equals("Sto") ) { + state = 104; + } + + else {// unknown first word in a part 2 + error("[" + word + "] is invalid as start of a part 2"); + } + + }// start state for part 2 (100) + + else if ( state == 101 ) { + if ( isLabel( word ) ) { + vpl.add( 8 ); + vpl.add( -1 ); // hole for target of jump + labelHoles.add( new StringIntPair( word, vpl.size()-1 ) ); + vpl.add( scratch ); + + state = 1; + } + else { + error("[" + word + "] is not a valid label to use after conditional Jmp"); + } + } + + else if ( state == 102 ) {// processing first for Put + if ( isVar( word ) ) {// have valid first argument + vpl.add( 25 ); + vpl.add( processVar( word, locsList ) ); + + state = 103; + } + else { + error("[" + word + "] is not a valid first argument for Put"); + } + } + + else if ( state == 103 ) {// processing second for Put + if ( isVar( word ) ) {// have valid second argument + vpl.add( processVar( word, locsList ) ); + + vpl.add( scratch ); + + state = 1; + } + else { + error("[" + word + "] is not a valid first argument for Put"); + } + } + + else if ( state == 104 ) { + if ( isParam( word ) ) {// valid argument for Sto + // generate VPL code 33 n a + vpl.add( 33 ); + vpl.add( processVar( word, globsList ) ); + vpl.add( scratch ); + + state = 1; + } + else { + error("[" + word + "] is not a valid argument for Sto"); + } + } + + }// loop to scan all words in Jive source file + + // finish off last function definition + + finishFunctionDef(); + + System.out.println("vpl before filling call holes:"); + for ( int k=0; k list ) { + + for (int k=0; k list ) { + for (int k=0; k Put array 0, + + the program behaved as desired, except at the end + it crashed. After some work, I realized that I + (with no one else to blame), should have done + + n -> Put array 0 + + With that change, sept17 worked perfectly + (up to n==45---for larger n, integer + overflow produced nonsensical results at the + end the sequence). + +The punchline is, we didn't find a problem with +Jive.java! diff --git a/Jive/StringIntPair.java b/Jive/StringIntPair.java new file mode 100755 index 0000000..feea677 --- /dev/null +++ b/Jive/StringIntPair.java @@ -0,0 +1,20 @@ +/* pair up a string and + an int, + used for holes and info +*/ + +public class StringIntPair { + + public String s; + public int x; + + public StringIntPair( String sIn, int xIn ) { + s = sIn; + x = xIn; + } + + public String toString() { + return "[" + s + "," + x + "]"; + } + +} diff --git a/Jive/Tests/calls b/Jive/Tests/calls new file mode 100755 index 0000000..1aa69c5 --- /dev/null +++ b/Jive/Tests/calls @@ -0,0 +1,31 @@ +/* do some function +definitions and calls +in various orders +*/ + +Keys -> x + +F 2 x -> a + +a -> Prt +NL + +Halt + +Def G a b c . + +Mult a b -> x +Mult x c -> x + +x -> Ret + +Def F a b . + +Add a 1 -> c +Sub b 1 -> d + +G c d 5 -> r + +r -> Ret + + diff --git a/Jive/Tests/factorial b/Jive/Tests/factorial new file mode 100755 index 0000000..9b4a4e9 --- /dev/null +++ b/Jive/Tests/factorial @@ -0,0 +1,21 @@ +/* main function + for computing + factorial of + input value +*/ + +Keys -> n +Fact n -> f +f -> Prt NL +Halt + +Def Fact n . + +Less n 2 -> Jmp small: + + Sub n 1 -> temp + Fact temp -> f + Mult n f -> Ret + +small: + 1 -> Ret diff --git a/Jive/Tests/factorial.doc b/Jive/Tests/factorial.doc new file mode 100755 index 0000000..dc88fe5 --- /dev/null +++ b/Jive/Tests/factorial.doc @@ -0,0 +1,44 @@ +[ 0] 1 1000 + +------------ ? ------------- +0: - +1: n +2: f + +[ 2] 4 3 +[ 4] 27 0 +[ 6] 23 1 0 +[ 9] 3 1 +[ 11] 2 2000 +[ 13] 6 0 +[ 15] 23 2 0 +[ 18] 23 0 2 +[ 21] 28 0 +[ 23] 29 +[ 24] 26 +[ 25] 1 2000 + +------------ Fact ------------- +0: n +1: - +2: 2 +3: 1 +4: temp +5: f + +[ 27] 4 5 +[ 29] 22 2 2 +[ 32] 22 3 1 +[ 35] 16 1 0 2 +[ 39] 8 2001 1 +[ 42] 10 1 0 3 +[ 46] 23 4 1 +[ 49] 3 4 +[ 51] 2 2000 +[ 53] 6 1 +[ 55] 23 5 1 +[ 58] 11 1 0 5 +[ 62] 5 1 +[ 64] 1 2001 +[ 66] 23 1 3 +[ 69] 5 1 diff --git a/Jive/Tests/factorial.vpl b/Jive/Tests/factorial.vpl new file mode 100755 index 0000000..73de9ff --- /dev/null +++ b/Jive/Tests/factorial.vpl @@ -0,0 +1,29 @@ +1 1000 +4 3 +27 0 +23 1 0 +3 1 +2 2000 +6 0 +23 2 0 +23 0 2 +28 0 +29 +26 +1 2000 +4 5 +22 2 2 +22 3 1 +16 1 0 2 +8 2001 1 +10 1 0 3 +23 4 1 +3 4 +2 2000 +6 1 +23 5 1 +11 1 0 5 +5 1 +1 2001 +23 1 3 +5 1 diff --git a/Jive/Tests/fizzbuzz b/Jive/Tests/fizzbuzz new file mode 100755 index 0000000..145c9a6 --- /dev/null +++ b/Jive/Tests/fizzbuzz @@ -0,0 +1,27 @@ +Keys -> x + +top: + + x -> Prt NL + + Eq x 1 -> Jmp exit: + + Rem x 2 -> r + Eq r 0 -> Jmp even: + Jmp odd: + + even: + Quot x 2 -> x + + Jmp top: + + odd: + Mult 3 x -> x + Add x 1 -> x + + Jmp top: + +exit: + +Halt + diff --git a/Jive/Tests/globs b/Jive/Tests/globs new file mode 100755 index 0000000..013c9d7 --- /dev/null +++ b/Jive/Tests/globs @@ -0,0 +1,15 @@ +/* unit tests, sort of, +on global stuff +*/ + +Globs a b c . + +17 -> Sto a +23 -> Sto b +41 -> Sto c + +Fet a -> Prt NL +Fet b -> Prt NL +Fet c -> Prt NL + +Halt diff --git a/Jive/Tests/listio b/Jive/Tests/listio new file mode 100755 index 0000000..924ca7c --- /dev/null +++ b/Jive/Tests/listio @@ -0,0 +1,51 @@ + +GetList -> a +PutList a -> . + +Halt + +/*--------------------------------------*/ +Def GetList . + +Keys -> size + +Add size 1 -> objSize /* 1 extra cell for size */ + +New objSize -> list + +size -> Put list 0 /* store size at index 0 */ + +1 -> index + +top: + + Less size index -> Jmp exit: + Keys -> input + input -> Put list index + Add index 1 -> index + + Jmp top: + +exit: + +list -> Ret + +/*--------------------------------------*/ +Def PutList list . + +0 -> index /* get size of list */ +Get list index -> size + +1 -> index + +top: + + Less size index -> Jmp exit: + Get list index -> value + value -> Prt 32 -> Sym + Add index 1 -> index + + Jmp top: +exit: + +0 -> Ret diff --git a/Jive/Tests/lits b/Jive/Tests/lits new file mode 100755 index 0000000..3f4243e --- /dev/null +++ b/Jive/Tests/lits @@ -0,0 +1,10 @@ +ShowSyms -> . +Halt + +Def ShowSyms . + +65 -> Sym +33 -> Sym +97 -> Sym +NL +0 -> Ret diff --git a/Jive/Tests/pastri b/Jive/Tests/pastri new file mode 100755 index 0000000..b521269 --- /dev/null +++ b/Jive/Tests/pastri @@ -0,0 +1,22 @@ +Keys -> row +Keys -> col + +PasTri row col -> Prt + +Halt + +Def PasTri row col . + +Eq col 0 -> temp1 +Eq row col -> temp2 +Or temp1 temp2 -> easy +easy -> Jmp easy: + +Sub col 1 -> upLeft +Sub row 1 -> rowAbove +PasTri rowAbove upLeft -> res1 +PasTri rowAbove col -> res2 +Add res1 res2 -> Ret + +easy: + 1 -> Ret diff --git a/Jive/Tests/pastri2 b/Jive/Tests/pastri2 new file mode 100755 index 0000000..da4e8da --- /dev/null +++ b/Jive/Tests/pastri2 @@ -0,0 +1,71 @@ +Globs p rowSize . + +Main -> . + +/* ------------------------------------ */ +Def Pastri2 row col . + +GetArray2d row col -> temp + +NotEq temp 0 -> Jmp easy: + + Eq col 0 -> Jmp onEdge: + Eq col row -> Jmp onEdge: + + Sub col 1 -> col1 + Sub row 1 -> row1 + + Pastri2 row1 col1 -> temp1 + Pastri2 row1 col -> temp2 + Add temp1 temp2 -> result + PutArray2d row col result -> . + result -> Ret + +onEdge: + PutArray2d row col 1 -> . + 1 -> Ret + +easy: + temp -> Ret + +/* ------------------------------------ */ +Def Main . + +Keys -> row +Keys -> col + +Add row 1 -> rowsize +Add col 1 -> colsize +Mult rowsize colsize -> n +New n -> Sto p + +colsize -> Sto rowSize + +Pastri2 row col -> Prt NL + +Halt + +/* ------------------------------------ */ +Def GetArray2d r c . + +Fet p -> array +Fet rowSize -> cols + +Mult r cols -> index +Add c index -> index + +Get array index -> result +result -> Ret + +/* ------------------------------------ */ +Def PutArray2d r c value . + +Fet p -> array +Fet rowSize -> cols + +Mult r cols -> index +Add c index -> index + +value -> Put array index + +0 -> Ret diff --git a/Jive/Tests/sillytest b/Jive/Tests/sillytest new file mode 100755 index 0000000..77dc826 --- /dev/null +++ b/Jive/Tests/sillytest @@ -0,0 +1,13 @@ +Keys -> x +Keys -> y +Keys -> z + +Add3 x y z -> Prt NL + +Halt + +Def Add3 a b c . + +Add a b -> x +Add x c -> x +x -> Ret diff --git a/Jive/Tests/tiny b/Jive/Tests/tiny new file mode 100755 index 0000000..7488ae1 --- /dev/null +++ b/Jive/Tests/tiny @@ -0,0 +1,7 @@ +Globs a b c . + +17 -> Sto b + +Fet b -> Prt + +Halt diff --git a/Jive/VPL.save b/Jive/VPL.save new file mode 100755 index 0000000000000000000000000000000000000000..252f82f88e3aa065a1c86799892bcdf35116d71c GIT binary patch literal 6658 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 Cw6W{} literal 0 HcmV?d00001 diff --git a/Jive/sept17 b/Jive/sept17 new file mode 100755 index 0000000..49cecb1 --- /dev/null +++ b/Jive/sept17 @@ -0,0 +1,77 @@ +/* ask the user for n, + create in an array the + first n fibonacci numbers + (1,1,2,3,5,8,...) + total them up and display +*/ + +Keys -> n + +Fib n -> array + +PutList array -> . + +/* forgot this on Sept. 17, + caused weird behavior, + running into the next function?! +*/ +Halt + +/* given n, + create a heap array with n+1 spaces, + store n in space 0, + compute fib numbers and store them in + spaces 1, 2, ... n + Return starting index of the array +*/ + +Def Fib n . + +Add n 1 -> size +New size -> array + +/* forgot this on Sept. 17--- + have to store n at + offset 0 +*/ +n -> Put array 0 + +0 -> temp1 +1 -> temp2 + +1 -> k + +top: + Less n k -> Jmp exit: + Add temp1 temp2 -> temp + temp -> Put array k + temp2 -> temp1 + Get array k -> temp2 + + Add k 1 -> k + + Jmp top: +exit: + +array -> Ret + +/*--------------------------------------*/ +Def PutList list . + +0 -> index /* get size of list */ +Get list index -> size + +1 -> index + +top: + + Less size index -> Jmp exit: + Get list index -> value + value -> Prt 32 -> Sym + Add index 1 -> index + + Jmp top: +exit: + +0 -> Ret + diff --git a/Jive/sept17.doc b/Jive/sept17.doc new file mode 100755 index 0000000..1d6c11a --- /dev/null +++ b/Jive/sept17.doc @@ -0,0 +1,101 @@ +[ 0] 1 1000 + +------------ ? ------------- +0: - +1: n +2: array + +[ 2] 4 3 +[ 4] 27 0 +[ 6] 23 1 0 +[ 9] 3 1 +[ 11] 2 2000 +[ 13] 6 0 +[ 15] 23 2 0 +[ 18] 3 2 +[ 20] 2 3000 +[ 22] 6 0 +[ 24] 26 +[ 25] 1 2000 + +------------ Fib ------------- +0: n +1: - +2: 1 +3: size +4: array +5: 0 +6: temp1 +7: temp2 +8: k +9: temp + +[ 27] 4 9 +[ 29] 22 2 1 +[ 32] 22 5 0 +[ 35] 9 1 0 2 +[ 39] 23 3 1 +[ 42] 31 1 3 +[ 45] 23 4 1 +[ 48] 23 1 0 +[ 51] 25 4 5 1 +[ 55] 23 1 5 +[ 58] 23 6 1 +[ 61] 23 1 2 +[ 64] 23 7 1 +[ 67] 23 1 2 +[ 70] 23 8 1 +[ 73] 1 2001 +[ 75] 16 1 0 8 +[ 79] 8 2002 1 +[ 82] 9 1 6 7 +[ 86] 23 9 1 +[ 89] 23 1 9 +[ 92] 25 4 8 1 +[ 96] 23 1 7 +[ 99] 23 6 1 +[ 102] 24 1 4 8 +[ 106] 23 7 1 +[ 109] 9 1 8 2 +[ 113] 23 8 1 +[ 116] 7 2001 +[ 118] 1 2002 +[ 120] 23 1 4 +[ 123] 5 1 +[ 125] 1 3000 + +------------ PutList ------------- +0: list +1: - +2: 0 +3: index +4: size +5: 1 +6: value +7: 32 + +[ 127] 4 7 +[ 129] 22 2 0 +[ 132] 22 5 1 +[ 135] 22 7 32 +[ 138] 23 1 2 +[ 141] 23 3 1 +[ 144] 24 1 0 3 +[ 148] 23 4 1 +[ 151] 23 1 5 +[ 154] 23 3 1 +[ 157] 1 3001 +[ 159] 16 1 4 3 +[ 163] 8 3002 1 +[ 166] 24 1 0 3 +[ 170] 23 6 1 +[ 173] 23 1 6 +[ 176] 28 1 +[ 178] 23 1 7 +[ 181] 30 1 +[ 183] 9 1 3 5 +[ 187] 23 3 1 +[ 190] 7 3001 +[ 192] 1 3002 +[ 194] 23 1 2 +[ 197] 5 1 diff --git a/Jive/sept17.vpl b/Jive/sept17.vpl new file mode 100755 index 0000000..f4912e2 --- /dev/null +++ b/Jive/sept17.vpl @@ -0,0 +1,71 @@ +1 1000 +4 3 +27 0 +23 1 0 +3 1 +2 2000 +6 0 +23 2 0 +3 2 +2 3000 +6 0 +26 +1 2000 +4 9 +22 2 1 +22 5 0 +9 1 0 2 +23 3 1 +31 1 3 +23 4 1 +23 1 0 +25 4 5 1 +23 1 5 +23 6 1 +23 1 2 +23 7 1 +23 1 2 +23 8 1 +1 2001 +16 1 0 8 +8 2002 1 +9 1 6 7 +23 9 1 +23 1 9 +25 4 8 1 +23 1 7 +23 6 1 +24 1 4 8 +23 7 1 +9 1 8 2 +23 8 1 +7 2001 +1 2002 +23 1 4 +5 1 +1 3000 +4 7 +22 2 0 +22 5 1 +22 7 32 +23 1 2 +23 3 1 +24 1 0 3 +23 4 1 +23 1 5 +23 3 1 +1 3001 +16 1 4 3 +8 3002 1 +24 1 0 3 +23 6 1 +23 1 6 +28 1 +23 1 7 +30 1 +9 1 3 5 +23 3 1 +7 3001 +1 3002 +23 1 2 +5 1 diff --git a/Project2 b/Project2 new file mode 100755 index 0000000..7be9090 --- /dev/null +++ b/Project2 @@ -0,0 +1 @@ +

Folder: Project2

diff --git a/VPL/IntPair.java b/VPL/IntPair.java new file mode 100755 index 0000000..af4e4cc --- /dev/null +++ b/VPL/IntPair.java @@ -0,0 +1,8 @@ +public class IntPair +{ + public int first, second; + + public IntPair( int a, int b ) + { first = a; second = b; } + +} diff --git a/VPL/VPL.java b/VPL/VPL.java new file mode 100755 index 0000000..ef985df --- /dev/null +++ b/VPL/VPL.java @@ -0,0 +1,309 @@ +import java.io.File; +import java.util.ArrayList; +import java.util.Scanner; +import java.util.StringTokenizer; + +public class VPL +{ + static String fileName; + static Scanner keys; + + static int max; + static int[] mem; + static int ip, bp, sp, rv, hp, numPassed, gp; + static int step; + + public static void main(String[] args) throws Exception { + + keys = new Scanner( System.in ); + + if( args.length != 2 ) { + System.out.println("Usage: java VPL " ); + System.exit(1); + } + + fileName = args[0]; + + max = Integer.parseInt( args[1] ); + mem = new int[max]; + + // load the program into the front part of + // memory + Scanner input = new Scanner( new File( fileName ) ); + String line; + StringTokenizer st; + int opcode; + + ArrayList labels, holes; + labels = new ArrayList(); + holes = new ArrayList(); + int label; + + // load the code + + int k=0; + while ( input.hasNextLine() ) { + line = input.nextLine(); + System.out.println("parsing line [" + line + "]"); + if( line != null ) + {// extract any tokens + st = new StringTokenizer( line ); + if( st.countTokens() > 0 ) + {// have a token, so must be an instruction (as opposed to empty line) + + opcode = Integer.parseInt(st.nextToken()); + + // load the instruction into memory: + + if( opcode == labelCode ) + {// note index that comes where label would go + label = Integer.parseInt(st.nextToken()); + labels.add( new IntPair( label, k ) ); + } + else if( opcode == noopCode ){ + } + else + {// opcode actually gets stored + mem[k] = opcode; k++; + + if( opcode == callCode || opcode == jumpCode || + opcode == condJumpCode ) + {// note the hole immediately after the opcode to be filled in later + label = Integer.parseInt( st.nextToken() ); + mem[k] = label; holes.add( new IntPair( k, label ) ); + ++k; + } + + // load correct number of arguments (following label, if any): + for( int j=0; j to go on" ); + keys.nextLine(); +*/ + + oldIp = ip; + + op = mem[ ip ]; ip++; + // extract the args into a, b, c for convenience: + a = -1; b = -2; c = -3; + + // numArgs is wrong for these guys, need one more! + if( op == callCode || op == jumpCode || + op == condJumpCode ) + { + actualNumArgs = numArgs( op ) + 1; + } + else + actualNumArgs = numArgs( op ); + + if( actualNumArgs == 1 ) + { a = mem[ ip ]; ip++; } + else if( actualNumArgs == 2 ) + { a = mem[ ip ]; ip++; b = mem[ ip ]; ip++; } + else if( actualNumArgs == 3 ) + { a = mem[ ip ]; ip++; b = mem[ ip ]; ip++; c = mem[ ip ]; ip++; } + + // implement all operations here: + // ******************************************** + + // put your work right here! + + if ( op == oppCode ) { + mem[ bp+2 + a ] = - mem[ bp+2 + b ]; + } + + + else + { + System.out.println("Fatal error: unknown opcode [" + op + "]" ); + System.exit(1); + } + + step++; + + }while( !done ); + + + }// main + + // use symbolic names for all opcodes: + + // op to produce comment + private static final int noopCode = 0; + + // ops involved with registers + private static final int labelCode = 1; + private static final int callCode = 2; + private static final int passCode = 3; + private static final int allocCode = 4; + private static final int returnCode = 5; // return a means "return and put + // copy of value stored in cell a in register rv + private static final int getRetvalCode = 6;//op a means "copy rv into cell a" + private static final int jumpCode = 7; + private static final int condJumpCode = 8; + + // arithmetic ops + private static final int addCode = 9; + private static final int subCode = 10; + private static final int multCode = 11; + private static final int divCode = 12; + private static final int remCode = 13; + private static final int equalCode = 14; + private static final int notEqualCode = 15; + private static final int lessCode = 16; + private static final int lessEqualCode = 17; + private static final int andCode = 18; + private static final int orCode = 19; + private static final int notCode = 20; + private static final int oppCode = 21; + + // ops involving transfer of data + private static final int litCode = 22; // litCode a b means "cell a gets b" + private static final int copyCode = 23;// copy a b means "cell a gets cell b" + private static final int getCode = 24; // op a b means "cell a gets + // contents of cell whose + // index is stored in b" + private static final int putCode = 25; // op a b means "put contents + // of cell b in cell whose offset is stored in cell a" + + // system-level ops: + private static final int haltCode = 26; + private static final int inputCode = 27; + private static final int outputCode = 28; + private static final int newlineCode = 29; + private static final int symbolCode = 30; + private static final int newCode = 31; + + // global variable ops: + private static final int allocGlobalCode = 32; + private static final int toGlobalCode = 33; + private static final int fromGlobalCode = 34; + + // debug ops: + private static final int debugCode = 35; + + // return the number of arguments after the opcode, + // except ops that have a label return number of arguments + // after the label, which always comes immediately after + // the opcode + private static int numArgs( int opcode ) + { + // highlight specially behaving operations + if( opcode == labelCode ) return 1; // not used + else if( opcode == jumpCode ) return 0; // jump label + else if( opcode == condJumpCode ) return 1; // condJump label expr + else if( opcode == callCode ) return 0; // call label + + // for all other ops, lump by count: + + else if( opcode==noopCode || + opcode==haltCode || + opcode==newlineCode || + opcode==debugCode + ) + return 0; // op + + else if( opcode==passCode || opcode==allocCode || + opcode==returnCode || opcode==getRetvalCode || + opcode==inputCode || + opcode==outputCode || opcode==symbolCode || + opcode==allocGlobalCode + ) + return 1; // op arg1 + + else if( opcode==notCode || opcode==oppCode || + opcode==litCode || opcode==copyCode || opcode==newCode || + opcode==toGlobalCode || opcode==fromGlobalCode + + ) + return 2; // op arg1 arg2 + + else if( opcode==addCode || opcode==subCode || opcode==multCode || + opcode==divCode || opcode==remCode || opcode==equalCode || + opcode==notEqualCode || opcode==lessCode || + opcode==lessEqualCode || opcode==andCode || + opcode==orCode || opcode==getCode || opcode==putCode + ) + return 3; + + else + { + System.out.println("Fatal error: unknown opcode [" + opcode + "]" ); + System.exit(1); + return -1; + } + + }// numArgs + + private static void showMem( int a, int b ) + { + for( int k=a; k<=b; ++k ) + { + System.out.println( k + ": " + mem[k] ); + } + }// showMem + +}// VPL diff --git a/VPL/ex1a b/VPL/ex1a new file mode 100755 index 0000000..e00248a --- /dev/null +++ b/VPL/ex1a @@ -0,0 +1,17 @@ +32 1 allocate one global cell named "0" + +4 10 make plenty of scratch space in the "main" stack frame + +22 0 17 local cell 0 <- constant 17 +33 0 0 global cell 0 <- local cell 0 + +27 1 local cell 1 <- input from keyboard + +34 2 0 local cell 2 <- global cell 0 + +9 3 1 2 local cell 3 <- input + copy of global value + +28 3 display the final answer +29 newline + +26 halt diff --git a/VPL/ex1b b/VPL/ex1b new file mode 100755 index 0000000..cc6d672 --- /dev/null +++ b/VPL/ex1b @@ -0,0 +1,33 @@ +0 Here's the map between local cells and names: +0 Local cell: Name: +0 0 n (input value) +0 1 2 (literal) +0 2 1 (literal) +0 3 n % 2 + +4 4 allocate space for 4 local cells + +27 0 local cell 0 <- input value (n) + +22 1 2 local cell 1 <- literal 2 +22 2 1 local cell 2 <- literal 1 + +13 3 0 1 local cell 3 <- n % 2 (conveniently 0 or 1 + +8 1001 3 if n%2 is not 0 jump to 1001 + +0 case that n is even + + 28 1 display 2 to say that n is even + 29 + +7 1002 hop over code for odd case + +1 1001 case that n is odd + + 28 2 display 1 to say that n is odd + 29 + +1 1002 + +26 diff --git a/VPL/ex1c b/VPL/ex1c new file mode 100755 index 0000000..44af0c5 --- /dev/null +++ b/VPL/ex1c @@ -0,0 +1,28 @@ +0 Local cell: Name: +0 0 n (display 1..n) +0 1 j (index in loop +0 2 1 (literal) +0 3 n < j + +4 4 allocate space for 4 local cells + +27 0 n = keyboard input + +22 1 1 j <- 1 +22 2 1 + +1 1001 top of loop + +16 3 0 1 if n < j exit loop +8 1002 3 + +28 1 println j +29 + +9 1 1 2 j = j+1 + +7 1001 go up to top of loop + +1 1002 exit loop + +26 halt diff --git a/VPL/ex1d b/VPL/ex1d new file mode 100755 index 0000000..e6aa3ab --- /dev/null +++ b/VPL/ex1d @@ -0,0 +1,43 @@ +0 Local cell: Name: +0 0 x +0 1 1 +0 2 2 +0 3 3 +0 4 x==1, x % 2 + +4 5 allocate local cells in main stack frame + +22 1 1 set the literals +22 2 2 +22 3 3 + +27 0 x <- input + +1 1001 top of loop +14 4 0 1 local cell 4 <- x == 1 + +8 1002 4 if x==1 exit loop + +28 0 println x +29 + +13 4 0 2 local cell 4 <- x%2, so is 0 if x even, 1 if x odd + +8 1003 4 if x is odd jump + + 0 didn't jump so x is even + 12 0 0 2 x <- x / 2 + +7 1004 skip over x odd code +1 1003 start of x odd case + + 11 0 0 3 x <- x*3 + 9 0 0 1 x <- x+1 + +1 1004 + +7 1001 jump to top of loop + +1 1002 exit loop + +26 diff --git a/VPL/ex2 b/VPL/ex2 new file mode 100755 index 0000000..df7e3ff --- /dev/null +++ b/VPL/ex2 @@ -0,0 +1,23 @@ +4 3 +27 0 +3 0 +2 1001 +6 1 +28 1 +29 +26 + +1 1001 +4 6 +22 2 2 +22 1 1 +16 6 0 2 +8 2001 6 +10 3 0 1 +3 3 +2 1001 +6 4 +11 5 0 4 +5 5 +1 2001 +5 1 diff --git a/VPL/ex3 b/VPL/ex3 new file mode 100755 index 0000000..e8c9f8b --- /dev/null +++ b/VPL/ex3 @@ -0,0 +1,103 @@ +0 main subprogram +0 cells used: +0 +0 0 holds starting index of list +0 1 holds n=# of items in list + +4 2 + +27 1 + +3 1 +2 100000 + +6 0 + +28 0 +29 + +3 0 +2 200000 + +29 + +26 + +0 list input subprogram +0 cells used + +0 0 parameter (n=desired number of items in list) +0 1 literal 1 +0 2 n+1 +0 3 index (k) in loop +0 4 holds starting point (a) of list +0 5 boolean result of n < k +0 6 input value + +1 100000 + +4 6 + +22 1 1 create 1 +9 2 0 1 cell 2 = n+1 + +31 4 2 a = new int[n+1] + +22 3 0 k=0 +25 4 3 0 a[k] = n + +22 3 1 k=1 + +1 102 top of loop + +16 5 0 3 cell 5 = n < k +8 101 5 if n < k jump to 101 + +27 6 cell 6 = input value + +25 4 3 6 a[k] = input value + +9 3 3 1 k=k+1 + +7 102 jump to top of loop +1 101 exit point of loop + +5 4 return a + +0 list display subprogram +0 cells used: +0 0 index of start of object (a) +0 1 literal 1 +0 2 number of items in list (n) +0 3 index k +0 4 ascii code for a space (32) +0 5 n < k +0 6 temp + +1 200000 + +4 5 + +22 1 1 +22 4 32 + +22 3 0 k=0 +24 2 0 3 n=a[0] + +22 3 1 k=1 + +1 201 top of loop +16 5 2 3 cell 5 = n < k +8 202 5 if n < k exit loop + +24 6 0 3 temp = a[k] + +28 6 print temp +30 4 print a space + +9 3 3 1 k=k+1 + +7 201 jump to top of loop +1 202 exit loop + +5 0 return (value stored in RV irrelevant) diff --git a/VPL/ex4 b/VPL/ex4 new file mode 100755 index 0000000..8dab770 --- /dev/null +++ b/VPL/ex4 @@ -0,0 +1,32 @@ +4 3 +27 0 +27 1 +3 0 +3 1 +2 101 +6 2 +28 2 +29 +26 +1 101 +4 6 +22 2 1 +22 5 0 +14 6 1 5 +8 102 6 +14 6 1 0 +8 102 6 +10 3 0 2 +10 4 1 2 +3 3 +3 4 +2 101 +6 6 +3 3 +3 1 +2 101 +6 7 +9 6 6 7 +5 6 +1 102 +5 2 diff --git a/VPL/someUnitTests b/VPL/someUnitTests new file mode 100755 index 0000000..b1b8eeb --- /dev/null +++ b/VPL/someUnitTests @@ -0,0 +1,93 @@ +4 5 + +27 0 +28 0 +29 + +22 0 23 +22 1 17 +22 3 0 +22 4 1 + +9 2 0 1 +28 2 +29 + +10 2 0 1 +28 2 +29 + +11 2 0 1 +28 2 +29 + +12 2 0 1 +28 2 +29 + +13 2 0 1 +28 2 +29 + +14 2 0 1 +28 2 +14 2 1 1 +28 2 +29 + +15 2 1 1 +28 2 +15 2 0 1 +28 2 +29 + +16 2 1 0 +28 2 +16 2 0 1 +28 2 +29 + +17 2 1 0 +28 2 +17 2 0 1 +28 2 +17 2 1 1 +28 2 +29 + +18 2 3 4 +28 2 +18 2 4 3 +28 2 +18 2 3 3 +28 2 +18 2 4 4 +28 2 +29 + +19 2 3 4 +28 2 +19 2 4 3 +28 2 +19 2 3 3 +28 2 +19 2 4 4 +28 2 +29 + +20 2 3 +28 2 +20 2 4 +28 2 +29 + +21 2 0 +28 2 +29 + +22 2 97 +23 3 2 +30 3 +29 + +26