public class Log {
public static int err = 0;
public static void pError(String s) { System.out.println(s); ++err; }
public static int getError() { return err; }
}
import java.util.*;
public class Symtab {
public static final int ITYPE = 1, ATYPE = 2, UNDEF = -1;
List<Ent> tbl = new ArrayList<Ent>();
Stack<Integer> stk = new Stack<Integer>();
int mark;
private boolean duplCheck(String n) {
for(int i = mark; i < tbl.size(); ++i) {
Ent e = tbl.get(i);
if(e.alive && e.name.equals(n)) { return true; }
}
return false;
}
public Ent addDef(String n, int t) {
if(duplCheck(n)) {
Log.pError("dublicate: "+n); return new Ent(n, UNDEF, 0);
}
Ent e = new Ent(n, t, tbl.size()); tbl.add(e); return e;
}
public void enterScope() { stk.push(mark); mark = tbl.size(); }
public void exitScope() {
for(int i = mark; i < tbl.size(); ++i) { tbl.get(i).alive = false; }
mark = stk.pop();
}
public Ent lookup(String n) {
for(int i = tbl.size()-1; i >= 0; --i) {
Ent e = tbl.get(i);
if(e.alive && e.name.equals(n)) { return e; }
}
return new Ent(n, UNDEF, 0);
}
public int getGsize() { return tbl.size(); }
public void show() { for(Ent e: tbl) { System.out.println(" " + e); } }
public static class Ent {
public String name;
public boolean alive = true;
public int type, pos = 0;
public Ent(String n, int t, int p) { name = n; type = t; pos = p; }
public String toString() {
return String.format("%s%s[%d %d]", name, alive?"_":"!", type, pos);
}
}
}
import java.util.*;
public class SamA1 {
public static void main(String[] args) throws Exception {
Symtab st = new Symtab();
Scanner sc = new Scanner(System.in);
while(true) {
System.out.print("> ");
String[] cmd = sc.nextLine().split(" +");
if(cmd[0].equals("quit")) {
System.exit(0);
} else if(cmd[0].equals("def")) {
System.out.println(" +> " + st.addDef(cmd[1], Symtab.ITYPE));
} else if(cmd[0].equals("ref")) {
System.out.println(" -> " + st.lookup(cmd[1]));
} else if(cmd[0].equals("enter")) {
st.enterScope();
} else if(cmd[0].equals("exit")) {
st.exitScope();
} else {
st.show();
}
}
}
}
Package sama2;
Helpers
digit = ['0'..'9'] ;
lcase = ['a'..'z'] ;
ucase = ['A'..'Z'] ;
letter = lcase | ucase ;
Tokens
iconst = digit+ ;
blank = (' '|13|10)+ ;
int = 'int' ;
if = 'if' ;
while = 'while' ;
read = 'read' ;
print = 'print' ;
semi = ';' ;
assign = '=' ;
add = '+' ;
sub = '-' ;
aster = '*' ;
slash = '/' ;
lt = '<' ;
gt = '>' ;
lbra = '{' ;
rbra = '}' ;
lpar = '(' ;
rpar = ')' ;
lsbr = '[' ;
rsbr = ']' ;
ident = letter (letter|digit)* ;
Ignored Tokens
blank;
Productions
prog = {stlist} stlist
;
stlist = {stat} stlist stat
| {empty}
;
stat = {idcl} int ident semi
| {adcl} int ident lsbr iconst rsbr semi
| {assign} ident assign expr semi
| {aassign} ident lsbr [idx]:expr rsbr assign expr semi
| {read} read ident semi
| {print} print expr semi
| {if} if lpar expr rpar stat
| {while} while lpar expr rpar stat
| {block} lbra stlist rbra
;
expr = {gt} [left]:nexp gt [right]:nexp
| {lt} [left]:nexp lt [right]:nexp
| {one} nexp
;
nexp = {add} nexp add term
| {sub} nexp sub term
| {one} term
;
term = {mul} term aster fact
| {div} term slash fact
| {one} fact
;
fact = {iconst} iconst
| {ident} ident
| {aref} ident lsbr expr rsbr
| {one} lpar expr rpar
;
package sama2;
import sama2.analysis.*;
import sama2.node.*;
import java.io.*;
import java.util.*;
class TypeChecker extends DepthFirstAdapter {
Symtab st;
HashMap<Node,Integer> vtbl;
public TypeChecker(Symtab tb, HashMap<Node,Integer> vt) { st = tb; vtbl = vt; }
private void ckv(Node n, int t, int l, String s) {
if(getOut(n) instanceof Integer && (Integer)getOut(n) == t) { return; }
Log.pError(l+": "+s);
}
private int cki(String i, int t, int l) {
Symtab.Ent e = st.lookup(i);
if(e.type != t) { Log.pError(l+": identyfier is not of expexted type: "+i); }
return e.pos;
}
@Override
public void outAIdclStat(AIdclStat node) {
st.addDef(node.getIdent().getText(), Symtab.ITYPE);
}
@Override
public void outAAdclStat(AAdclStat node) {
Symtab.Ent e = st.addDef(node.getIdent().getText(), Symtab.ATYPE);
vtbl.put(node, e.pos);
}
@Override
public void outAAssignStat(AAssignStat node) {
int p = cki(node.getIdent().getText(), Symtab.ITYPE, node.getIdent().getLine());
ckv(node.getExpr(), Symtab.ITYPE, node.getAssign().getLine(), "non-int val");
vtbl.put(node, p);
}
@Override
public void outAAassignStat(AAassignStat node) {
int p = cki(node.getIdent().getText(), Symtab.ATYPE, node.getIdent().getLine());
ckv(node.getIdx(), Symtab.ITYPE, node.getLsbr().getLine(), "non-int index");
ckv(node.getExpr(), Symtab.ITYPE, node.getAssign().getLine(), "non-int val");
vtbl.put(node, p);
}
@Override
public void outAReadStat(AReadStat node) {
int p = cki(node.getIdent().getText(), Symtab.ITYPE, node.getIdent().getLine());
vtbl.put(node, p);
}
@Override
public void outAPrintStat(APrintStat node) {
ckv(node.getExpr(), Symtab.ITYPE, node.getPrint().getLine(), "non-int val");
}
@Override
public void outAIfStat(AIfStat node) {
ckv(node.getExpr(), Symtab.ITYPE, node.getLpar().getLine(), "non-int cond");
}
@Override
public void outAWhileStat(AWhileStat node) {
ckv(node.getExpr(), Symtab.ITYPE, node.getLpar().getLine(), "non-int cond");
}
@Override
public void inABlockStat(ABlockStat node) { st.enterScope(); }
@Override
public void outABlockStat(ABlockStat node) { st.exitScope(); }
@Override
public void outAGtExpr(AGtExpr node) {
ckv(node.getLeft(), Symtab.ITYPE, node.getGt().getLine(), "non-int val");
ckv(node.getRight(), Symtab.ITYPE, node.getGt().getLine(), "non-int val");
setOut(node, new Integer(Symtab.ITYPE));
}
@Override
public void outALtExpr(ALtExpr node) {
ckv(node.getLeft(), Symtab.ITYPE, node.getLt().getLine(), "non-int val");
ckv(node.getRight(), Symtab.ITYPE, node.getLt().getLine(), "non-int val");
setOut(node, new Integer(Symtab.ITYPE));
}
@Override
public void outAOneExpr(AOneExpr node) { setOut(node, getOut(node.getNexp())); }
@Override
public void outAAddNexp(AAddNexp node) {
ckv(node.getNexp(), Symtab.ITYPE, node.getAdd().getLine(), "non-int val");
ckv(node.getTerm(), Symtab.ITYPE, node.getAdd().getLine(), "non-int val");
setOut(node, new Integer(Symtab.ITYPE));
}
@Override
public void outASubNexp(ASubNexp node) {
ckv(node.getNexp(), Symtab.ITYPE, node.getSub().getLine(), "non-int val");
ckv(node.getTerm(), Symtab.ITYPE, node.getSub().getLine(), "non-int val");
setOut(node, new Integer(Symtab.ITYPE));
}
@Override
public void outAOneNexp(AOneNexp node) { setOut(node, getOut(node.getTerm())); }
@Override
public void outAMulTerm(AMulTerm node) {
ckv(node.getTerm(), Symtab.ITYPE, node.getAster().getLine(), "non-int val");
ckv(node.getFact(), Symtab.ITYPE, node.getAster().getLine(), "non-int val");
setOut(node, new Integer(Symtab.ITYPE));
}
@Override
public void outADivTerm(ADivTerm node) {
ckv(node.getTerm(), Symtab.ITYPE, node.getSlash().getLine(), "non-int val");
ckv(node.getFact(), Symtab.ITYPE, node.getSlash().getLine(), "non-int val");
setOut(node, new Integer(Symtab.ITYPE));
}
@Override
public void outAOneTerm(AOneTerm node) { setOut(node, getOut(node.getFact())); }
@Override
public void outAIconstFact(AIconstFact node) {
setOut(node, new Integer(Symtab.ITYPE));
}
@Override
public void outAIdentFact(AIdentFact node) {
Symtab.Ent e = st.lookup(node.getIdent().getText());
setOut(node, new Integer(e.type)); vtbl.put(node, e.pos);
}
@Override
public void outAArefFact(AArefFact node) {
int p = cki(node.getIdent().getText(), Symtab.ATYPE, node.getIdent().getLine());
ckv(node.getExpr(), Symtab.ITYPE, node.getLsbr().getLine(), "non-int index");
setOut(node, new Integer(Symtab.ITYPE)); vtbl.put(node, p);
}
@Override
public void outAOneFact(AOneFact node) { setOut(node, getOut(node.getExpr())); }
}
package sama2;
import sama2.parser.*;
import sama2.lexer.*;
import sama2.node.*;
import java.io.*;
import java.util.*;
public class SamA2 {
public static void main(String[] args) throws Exception {
Parser p = new Parser(new Lexer(new PushbackReader(
new InputStreamReader(new FileInputStream(args[0]), "JISAutoDetect"),
1024)));
Start tree = p.parse();
Symtab st = new Symtab();
HashMap<Node,Integer> vtbl = new HashMap<Node,Integer>();
TypeChecker tck = new TypeChecker(st, vtbl); tree.apply(tck); st.show();
// if(Log.getError() > 0) { return; }
// Executor exec = new Executor(vtbl, st.getGsize()); tree.apply(exec);
}
}
class Log {
public static int err = 0;
public static void pError(String s) { System.out.println(s); ++err; }
public static int getError() { return err; }
}
class Symtab {
public static final int ITYPE = 1, ATYPE = 2, UNDEF = -1;
List<Ent> tbl = new ArrayList<Ent>();
Stack<Integer> stk = new Stack<Integer>();
int mark;
private boolean duplCheck(String n) {
for(int i = mark; i < tbl.size(); ++i) {
Ent e = tbl.get(i);
if(e.alive && e.name.equals(n)) { return true; }
}
return false;
}
public Ent addDef(String n, int t) {
if(duplCheck(n)) {
Log.pError("dublicate: "+n); return new Ent(n, UNDEF, 0);
}
Ent e = new Ent(n, t, tbl.size()); tbl.add(e); return e;
}
public void enterScope() { stk.push(mark); mark = tbl.size(); }
public void exitScope() {
for(int i = mark; i < tbl.size(); ++i) { tbl.get(i).alive = false; }
mark = stk.pop();
}
public Ent lookup(String n) {
for(int i = tbl.size()-1; i >= 0; --i) {
Ent e = tbl.get(i);
if(e.alive && e.name.equals(n)) { return e; }
}
return new Ent(n, UNDEF, 0);
}
public int getGsize() { return tbl.size(); }
public void show() { for(Ent e: tbl) { System.out.println(" " + e); } }
public static class Ent {
public String name;
public boolean alive = true;
public int type, pos = 0;
public Ent(String n, int t, int p) { name = n; type = t; pos = p; }
public String toString() {
return String.format("%s%s[%d %d]", name, alive?"_":"!", type, pos);
}
}
}
package sama2;
import sama2.analysis.*;
import sama2.node.*;
import java.io.*;
import java.util.*;
class Executor extends DepthFirstAdapter {
Scanner sc = new Scanner(System.in);
PrintStream pr = System.out;
HashMap<Node,Integer> pos;
Object[] vars;
public Executor(HashMap<Node,Integer> p, int s) { pos = p; vars = new Object[s]; }
@Override
public void outAAdclStat(AAdclStat node) {
vars[pos.get(node)] = new Object[Integer.parseInt(node.getIconst().getText())];
}
@Override
public void outAAssignStat(AAssignStat node) {
vars[pos.get(node)] = getOut(node.getExpr());
}
@Override
public void outAAassignStat(AAassignStat node) {
Object[] a = (Object[])vars[pos.get(node)];
a[(Integer)getOut(node.getIdx())] = getOut(node.getExpr());
}
@Override
public void outAReadStat(AReadStat node) {
String s = node.getIdent().getText().intern();
pr.print(s + "> "); vars[pos.get(node)] = sc.nextInt(); sc.nextLine();
}
@Override
public void outAPrintStat(APrintStat node) {
pr.println(getOut(node.getExpr()).toString());
}
@Override
public void caseAIfStat(AIfStat node) {
node.getExpr().apply(this);
if((Integer)getOut(node.getExpr()) != 0) { node.getStat().apply(this); }
}
@Override
public void caseAWhileStat(AWhileStat node) {
while(true) {
node.getExpr().apply(this);
if((Integer)getOut(node.getExpr()) == 0) { return; }
node.getStat().apply(this);
}
}
@Override
public void outAGtExpr(AGtExpr node) {
if((Integer)getOut(node.getLeft()) > (Integer)getOut(node.getRight())) {
setOut(node, new Integer(1));
} else {
setOut(node, new Integer(0));
}
}
@Override
public void outALtExpr(ALtExpr node) {
if((Integer)getOut(node.getLeft()) < (Integer)getOut(node.getRight())) {
setOut(node, new Integer(1));
} else {
setOut(node, new Integer(0));
}
}
@Override
public void outAOneExpr(AOneExpr node) { setOut(node, getOut(node.getNexp())); }
@Override
public void outAAddNexp(AAddNexp node) {
int v = (Integer)getOut(node.getNexp()) + (Integer)getOut(node.getTerm());
setOut(node, new Integer(v));
}
@Override
public void outASubNexp(ASubNexp node) {
int v = (Integer)getOut(node.getNexp()) - (Integer)getOut(node.getTerm());
setOut(node, new Integer(v));
}
@Override
public void outAOneNexp(AOneNexp node) { setOut(node, getOut(node.getTerm())); }
@Override
public void outAMulTerm(AMulTerm node) {
int v = (Integer)getOut(node.getTerm()) * (Integer)getOut(node.getFact());
setOut(node, new Integer(v));
}
@Override
public void outADivTerm(ADivTerm node) {
int v = (Integer)getOut(node.getTerm()) / (Integer)getOut(node.getFact());
setOut(node, new Integer(v));
}
@Override
public void outAOneTerm(AOneTerm node) { setOut(node, getOut(node.getFact())); }
@Override
public void outAIconstFact(AIconstFact node) {
setOut(node, new Integer(node.getIconst().getText()));
}
@Override
public void outAIdentFact(AIdentFact node) {
setOut(node, vars[pos.get(node)]);
}
@Override
public void outAArefFact(AArefFact node) {
Object[] a = (Object[])vars[pos.get(node)];
setOut(node, a[(Integer)getOut(node.getExpr())]);
}
@Override
public void outAOneFact(AOneFact node) { setOut(node, getOut(node.getExpr())); }
}
int a[100]; int n; int i; int d;
read n;
i = 0; while(i < n) { read d; a[i] = d; i = i + 1; }
i = n - 1; while(i > 0-1) { print a[i]; i = i - 1; }