Package sam91;
Helpers
digit = ['0'..'9'] ;
lcase = ['a'..'z'] ;
ucase = ['A'..'Z'] ;
letter = lcase | ucase ;
Tokens
iconst = ('+'|'-'|) digit+ ;
blank = (' '|13|10)+ ;
if = 'if' ;
read = 'read' ;
print = 'print' ;
semi = ';' ;
assign = '=' ;
lt = '<' ;
gt = '>' ;
lbra = '{' ;
rbra = '}' ;
lpar = '(' ;
rpar = ')' ;
ident = letter (letter|digit)* ;
Ignored Tokens
blank;
Productions
prog = {stlist} stlist
;
stlist = {stat} stlist stat
| {empty}
;
stat = {assign} ident assign expr semi
| {read} read ident semi
| {print} print expr semi
| {if} if lpar cond rpar stat
| {block} lbra stlist rbra
;
cond = {gt} [left]:expr gt [right]:expr
| {lt} [left]:expr lt [right]:expr
;
expr = {ident} ident
| {iconst} iconst
;
package sam91;
import sam91.parser.*;
import sam91.lexer.*;
import sam91.node.*;
import java.io.*;
import java.util.*;
public class Sam91 {
public static void main(String[] args) throws Exception {
Parser p = new Parser(new Lexer(new PushbackReader(
new InputStreamReader(new FileInputStream(args[0])), 1024)));
Start tree = p.parse();
}
}
read x; read y;
if(x > y) { z = x; x = y; y = z; }
print x; print y;
Package sam92;
Helpers
digit = ['0'..'9'] ;
lcase = ['a'..'z'] ;
ucase = ['A'..'Z'] ;
letter = lcase | ucase ;
Tokens
iconst = ('+'|'-'|) digit+ ;
blank = (' '|13|10)+ ;
if = 'if' ;
while = 'while' ;
read = 'read' ;
print = 'print' ;
semi = ';' ;
assign = '=' ;
add = '+' ;
sub = '-' ;
lt = '<' ;
gt = '>' ;
lbra = '{' ;
rbra = '}' ;
lpar = '(' ;
rpar = ')' ;
ident = letter (letter|digit)* ;
Ignored Tokens
blank;
Productions
prog = {stlist} stlist
;
stlist = {stat} stlist stat
| {empty}
;
stat = {assign} ident 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
| {term} term
;
term = {ident} ident
| {iconst} iconst
;
package sam92;
import sam92.parser.*;
import sam92.lexer.*;
import sam92.node.*;
import java.io.*;
import java.util.*;
public class Sam92 {
public static void main(String[] args) throws Exception {
Parser p = new Parser(new Lexer(new PushbackReader(
new InputStreamReader(new FileInputStream(args[0])), 1024)));
Start tree = p.parse();
}
}
package sam92;
import sam92.analysis.*;
import sam92.node.*;
import java.io.*;
import java.util.*;
class Executor extends DepthFirstAdapter {
Scanner sc = new Scanner(System.in);
PrintStream pr = System.out;
HashMap vars = new HashMap();
@Override
public void outAIdentTerm(AIdentTerm node) {
String s = node.getIdent().getText().intern();
if(!vars.containsKey(s)) vars.put(s, new Integer(0));
setOut(node, vars.get(s));
}
@Override
public void outAIconstTerm(AIconstTerm node) {
setOut(node, new Integer(node.getIconst().getText()));
}
@Override
public void outATermNexp(ATermNexp node) {
setOut(node, getOut(node.getTerm()));
}
@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 outAOneExpr(AOneExpr node) {
setOut(node, getOut(node.getNexp()));
}
@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 outAAssignStat(AAssignStat node) {
String s = node.getIdent().getText().intern();
vars.put(s, getOut(node.getExpr()));
}
@Override
public void outAReadStat(AReadStat node) {
String s = node.getIdent().getText().intern();
pr.print(s + "> ");
vars.put(s, 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);
}
}
}
Package sam93;
Helpers
digit = ['0'..'9'];
lcase = ['a'..'z'];
ucase = ['A'..'Z'];
letter = lcase | ucase;
Tokens
woireru = 'を入れる';
niyomikomu = 'に読み込む';
ni = 'に';
wouchidasu = 'を打ち出す';
naraba = 'ならば';
wojikkou = 'を実行';
noaida = 'の間';
gt = '>';
lt = '<';
add = '+';
sub = '-';
number = digit+;
ident = letter (letter|digit)*;
blank = (' ' | 10 | 13 )+;
Ignored Tokens
blank;
Productions
prog = {stlist} stlist
;
stlist = {empty}
| {stat} stlist stat
;
stat = {assign} ident ni expr woireru
| {read} ident niyomikomu
| {print} expr wouchidasu
| {if} expr naraba stlist wojikkou
| {while} expr noaida stlist wojikkou
;
expr = {term} term
| {gt} [left]:term gt [right]:term
| {lt} [left]:term lt [right]:term
;
term = {fact} fact
| {add} term add fact
| {sub} term sub fact
;
fact = {ident} ident
| {number} number
;
nに読み込む
xに1を入れる
n>0の間xにx+xを入れるnにn-1を入れるを実行
xを打ち出す
package sam93;
import sam93.parser.*;
import sam93.lexer.*;
import sam93.node.*;
import java.io.*;
import java.util.*;
public class Sam93 {
public static void main(String[] args) throws Exception {
Parser p = new Parser(new Lexer(new PushbackReader(
new InputStreamReader(new FileInputStream(args[0])), 1024)));
Start tree = p.parse();
tree.apply(new Executor());
}
}
package sam93;
import sam93.analysis.*;
import sam93.node.*;
import java.io.*;
import java.util.*;
class Executor extends DepthFirstAdapter {
Scanner sc = new Scanner(System.in);
PrintStream pr = System.out;
HashMap<String,Integer> vars = new HashMap<String,Integer>();
@Override
public void outAAssignStat(AAssignStat node) {
vars.put(node.getIdent().getText(), (Integer)getOut(node.getExpr()));
}
@Override
public void outAReadStat(AReadStat node) {
String s = node.getIdent().getText();
pr.print(s + "> "); vars.put(s, 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.getStlist().apply(this); }
}
@Override
public void caseAWhileStat(AWhileStat node) {
while(true) {
node.getExpr().apply(this);
if((Integer)getOut(node.getExpr()) == 0) { break; }
node.getStlist().apply(this);
}
}
@Override
public void outATermExpr(ATermExpr node) {
setOut(node, getOut(node.getTerm()));
}
@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 outAFactTerm(AFactTerm node) {
setOut(node, getOut(node.getFact()));
}
@Override
public void outAAddTerm(AAddTerm node) {
int v = (Integer)getOut(node.getTerm()) + (Integer)getOut(node.getFact());
setOut(node, new Integer(v));
}
@Override
public void outASubTerm(ASubTerm node) {
int v = (Integer)getOut(node.getTerm()) - (Integer)getOut(node.getFact());
setOut(node, new Integer(v));
}
@Override
public void outAIdentFact(AIdentFact node) {
setOut(node, vars.get(node.getIdent().getText()));
}
@Override
public void outANumberFact(ANumberFact node) {
setOut(node, Integer.parseInt(node.getNumber().getText()));
}
}