You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.5 KiB
Plaintext
105 lines
2.5 KiB
Plaintext
// To compile and run this program using jacc and Sun's JDK:
|
|
//
|
|
// jacc simpleCalc.jacc
|
|
// javac Calc.java CalcTokens.java
|
|
// java Calc
|
|
// ... enter arithmetic expressions ... hit EOF to terminate
|
|
//
|
|
|
|
%class Calc
|
|
%interface CalcTokens
|
|
%semantic int : yylval
|
|
%get token
|
|
%next yylex()
|
|
|
|
%token '+' '-' '*' '/' '(' ')' ';' INTEGER
|
|
%left '+' '-'
|
|
%left '*' '/'
|
|
|
|
%%
|
|
|
|
prog : prog ';' expr { System.out.println($3); }
|
|
| expr { System.out.println($1); }
|
|
;
|
|
expr : expr '+' expr { $$ = $1 + $3; }
|
|
| expr '-' expr { $$ = $1 - $3; }
|
|
| expr '*' expr { $$ = $1 * $3; }
|
|
| expr '/' expr { $$ = $1 / $3; }
|
|
| '(' expr ')' { $$ = $2; }
|
|
| INTEGER { $$ = $1; }
|
|
;
|
|
|
|
%%
|
|
|
|
private void yyerror(String msg) {
|
|
System.out.println("ERROR: " + msg);
|
|
System.exit(1);
|
|
}
|
|
|
|
private int c;
|
|
|
|
/** Read a single input character from standard input.
|
|
*/
|
|
private void nextChar() {
|
|
if (c>=0) {
|
|
try {
|
|
c = System.in.read();
|
|
} catch (Exception e) {
|
|
c = (-1);
|
|
}
|
|
}
|
|
}
|
|
|
|
int token;
|
|
int yylval;
|
|
|
|
/** Read the next token and return the
|
|
* corresponding integer code.
|
|
*/
|
|
int yylex() {
|
|
for (;;) {
|
|
// Skip whitespace
|
|
while (c==' ' || c=='\n' || c=='\t' || c=='\r') {
|
|
nextChar();
|
|
}
|
|
if (c<0) {
|
|
return (token=ENDINPUT);
|
|
}
|
|
switch (c) {
|
|
case '+' : nextChar();
|
|
return token='+';
|
|
case '-' : nextChar();
|
|
return token='-';
|
|
case '*' : nextChar();
|
|
return token='*';
|
|
case '/' : nextChar();
|
|
return token='/';
|
|
case '(' : nextChar();
|
|
return token='(';
|
|
case ')' : nextChar();
|
|
return token=')';
|
|
case ';' : nextChar();
|
|
return token=';';
|
|
default : if (Character.isDigit((char)c)) {
|
|
int n = 0;
|
|
do {
|
|
n = 10*n + (c - '0');
|
|
nextChar();
|
|
} while (Character.isDigit((char)c));
|
|
yylval = n;
|
|
return token=INTEGER;
|
|
} else {
|
|
yyerror("Illegal character "+c);
|
|
nextChar();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
Calc calc = new Calc();
|
|
calc.nextChar(); // prime the character input stream
|
|
calc.yylex(); // prime the token input stream
|
|
calc.parse(); // parse the input
|
|
}
|