| /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
| * Copyright (C) 2001 Gerwin Klein <lsf@jflex.de> * |
| * All rights reserved. * |
| * * |
| * This is a modified version of the example from * |
| * http://www.lincom-asg.com/~rjamison/byacc/ * |
| * * |
| * Thanks to Larry Bell and Bob Jamison for suggestions and comments. * |
| * * |
| * This program is free software; you can redistribute it and/or modify * |
| * it under the terms of the GNU General Public License. See the file * |
| * COPYRIGHT for more information. * |
| * * |
| * This program is distributed in the hope that it will be useful, * |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of * |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
| * GNU General Public License for more details. * |
| * * |
| * You should have received a copy of the GNU General Public License along * |
| * with this program; if not, write to the Free Software Foundation, Inc., * |
| * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * |
| * * |
| * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ |
| |
| %{ |
| import java.io.*; |
| %} |
| |
| %token NL /* newline */ |
| %token <dval> NUM /* a number */ |
| |
| %type <dval> exp |
| |
| %left '-' '+' |
| %left '*' '/' |
| %left NEG /* negation--unary minus */ |
| %right '^' /* exponentiation */ |
| |
| %% |
| |
| input: /* empty string */ |
| | input line |
| ; |
| |
| line: NL { if (interactive) System.out.print("Expression: "); } |
| | exp NL { System.out.println(" = " + $1); |
| if (interactive) System.out.print("Expression: "); } |
| ; |
| |
| exp: NUM { $$ = $1; } |
| | exp '+' exp { $$ = $1 + $3; } |
| | exp '-' exp { $$ = $1 - $3; } |
| | exp '*' exp { $$ = $1 * $3; } |
| | exp '/' exp { $$ = $1 / $3; } |
| | '-' exp %prec NEG { $$ = -$2; } |
| | exp '^' exp { $$ = Math.pow($1, $3); } |
| | '(' exp ')' { $$ = $2; } |
| ; |
| |
| %% |
| |
| private Yylex lexer; |
| |
| |
| private int yylex () { |
| int yyl_return = -1; |
| try { |
| yylval = new ParserVal(0); |
| yyl_return = lexer.yylex(); |
| } |
| catch (IOException e) { |
| System.err.println("IO error :"+e); |
| } |
| return yyl_return; |
| } |
| |
| |
| public void yyerror (String error) { |
| System.err.println ("Error: " + error); |
| } |
| |
| |
| public Parser(Reader r) { |
| lexer = new Yylex(r, this); |
| } |
| |
| |
| static boolean interactive; |
| |
| public static void main(String args[]) throws IOException { |
| System.out.println("BYACC/Java with JFlex Calculator Demo"); |
| |
| Parser yyparser; |
| if ( args.length > 0 ) { |
| // parse a file |
| yyparser = new Parser(new FileReader(args[0])); |
| } |
| else { |
| // interactive mode |
| System.out.println("[Quit with CTRL-D]"); |
| System.out.print("Expression: "); |
| interactive = true; |
| yyparser = new Parser(new InputStreamReader(System.in)); |
| } |
| |
| yyparser.yyparse(); |
| |
| if (interactive) { |
| System.out.println(); |
| System.out.println("Have a nice day"); |
| } |
| } |