bison マニュアルの逆ポーランド記法電卓

JFlex を使って

%%

%class Scanner
%implements Test.yyInput

%type int

%eofval{
    return YYEOF;
%eofval}

%{
    private int token;
    protected Double value;

    public boolean advance() throws java.io.IOException {
        token = yylex();
        return token != YYEOF;
    }

    public int token() {
        return token;
    }

    public Object value() {
        return value;
    }
%}

space   = [\ \t\b\015]+
digit   = [0-9]
integer = {digit}+
real    = ({digit}+"."{digit}*|{digit}*"."{digit}+)

%%

{space}              { }
{integer}|{real}     { value = new Double(yytext()); return Test.NUM; }
.|\n                 { value = null; return yytext().charAt(0); }

と、

%{

import java.io.*;

public class Test {

%}

%token NUM
%type <Double> exp NUM

%%

input:    /* 空 */
        | input line
;

line:     '\n'
        | exp '\n'  { System.out.println("\t" + $1); }
;

exp:      NUM           { $$ = new Double($1.doubleValue());         }
        | exp exp '+'   { $$ = new Double($1.doubleValue() + $2.doubleValue());    }
        | exp exp '-'   { $$ = new Double($1.doubleValue() - $2.doubleValue());    }
        | exp exp '*'   { $$ = new Double($1.doubleValue() * $2.doubleValue());    }
        | exp exp '/'   { $$ = new Double($1.doubleValue() / $2.doubleValue());    }
      /* べき乗関数 */
        | exp exp '^'   { $$ = new Double(Math.pow($1.doubleValue(), $2.doubleValue())); }
      /* 単項のマイナス */
        | exp 'n'       { $$ = new Double(-$1.doubleValue());        }
;

%%

  public static void main (String args []) {
    Scanner scanner = new Scanner(new InputStreamReader(System.in));
    try {
      new Test().yyparse(scanner);
    } catch (IOException ie) { ie.printStackTrace(); }
      catch (yyException ye) { System.err.println(ye); }
  }

}

で、

4 9 +
	13.0
3 7 + 3 4 5 *+-
	-13.0
3 7 + 3 4 5 * + - n
	13.0
5 6 / 4 n +
	-3.1666666666666665
3 4 ^
	81.0
1.2 3.4 +
	4.6
0.2 3.4 +
	3.6
.2 3.4 +
	3.6
1. 3.4 +
	4.4
1 3.4 +
	4.4