# teaching machines

## CS 330 Lecture 9 – Calculator + functions

February 10, 2012 by . Filed under cs330, lectures, spring 2012.

### Agenda

• evaluating expressions
• persistence of memory
• avoiding reparsing with abstract syntax trees (ASTs)

### Code

#### Flop.g

grammar Flop;

import java.util.HashMap;
}

@members {
HashMap<String, Integer> memory;

public void setMemory(HashMap<String, Integer> memory) {
this.memory = memory;
}
}

stat
: ID EQUALS expr {memory.put($ID.text,$expr.value);}
| expr {System.out.println($expr.value);} ; expr returns [int value] : e1=precedence10 {$value = $e1.value;} (PLUS e2=precedence10 {$value += $e2.value;})* ; precedence10 returns [int value] : e1=precedence20 {$value = $e1.value;} (TIMES e2=precedence20 {$value *= $e2.value;})* ; precedence20 returns [int value] : NUMBER {$value = Integer.parseInt($NUMBER.text);} | ID {$value = memory.get($ID.text);} | LEFTPAREN expr RIGHTPAREN {$value = $expr.value;} ; LEFTPAREN : '(' ; RIGHTPAREN : ')' ; ID : '$' ('A'..'Z'|'a'..'z') ('A'..'Z'|'a'..'z'|'0'..'9')*
;

EQUALS
: '='
;

PLUS
: '+'
;

TIMES
: '*'
;

NUMBER
: '-'? '0'..'9'+
;

WHITESPACE
: (' '|'\t'|'\r'|'\n')+ {skip();}
;


#### FlopInterpreter.java

import java.io.IOException;
import org.antlr.runtime.*;
import java.util.Scanner;
import java.util.HashMap;

public class FlopInterpreter {
public static void main(String[] args) throws IOException, RecognitionException {

HashMap<String, Integer> memory = new HashMap<String, Integer>();

System.out.print("> ");
FlopLexer lexer = new FlopLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
FlopParser parser = new FlopParser(tokens);
parser.setMemory(memory);
parser.stat();
System.out.print("> ");
}
}
}


### Haiku

Why new languages?
Someone else wrote the old ones.
That’s reason enough.