%{ import java.lang.*; import java.io.*; import java.util.StringTokenizer; %} /* YACC Declarations */ %token CONST_INT CONST_REAL TRUE FALSE %token ERROR %left '&' '|' %left '-' '+' %left '*' '/' '%' %nonassoc '!' %% calc: calc stament | ; stament : expression '\n' { eval.print($1); } | '\n' ; expression : CONST_REAL { $$ = eval.getConst( $1, "Real" ); } | CONST_INT { $$ = eval.getConst( $1, "Int" ); } | TRUE { $$ = eval.getConst( $1, "Bool" ); } | FALSE { $$ = eval.getConst( $1, "Bool" ); } | '+' expression %prec '!' { $$ = eval.unarySign( $2, '+' ); } | '-' expression %prec '!' { $$ = eval.unarySign( $2, '-' ); } | '!' expression %prec '!' { $$ = eval.not( $2 ); } | expression '+' expression { $$ = eval.aritmetical( $1, $3, '+' ); } | expression '-' expression { $$ = eval.aritmetical( $1, $3, '-' ); } | expression '*' expression { $$ = eval.aritmetical( $1, $3, '*' ); } | expression '/' expression { $$ = eval.aritmetical( $1, $3, '/' ); } | expression '%' expression { $$ = eval.mod ( $1, $3 ); } | expression '&' expression { $$ = eval.logical( $1, $3, '&' ); } | expression '|' expression { $$ = eval.logical( $1, $3, '|' ); } | '(' expression ')' { $$ = $2; } ; %% String ins; boolean firstTime = true; void yyerror(String s) { System.out.println("par:" + s); } int col; String input; void getLine(String s) { input = s; col = 0; firstTime = true; } Evaluator eval = new Evaluator(); int yylex() { int tok; java.lang.Double d; while (col < input.length()) if (Character.isDigit(input.charAt(col))) { String s = ""; while (col < input.length() && Character.isDigit(input.charAt(col))) s += input.charAt(col++); if (col < input.length() && input.charAt(col) == '.') { s += "."; col++; while (col < input.length() && Character.isDigit(input.charAt(col))) s += input.charAt(col++); try { d = java.lang.Double.valueOf(s); } catch (Exception e) { return tok = ERROR; } yylval = new SemanticValue(d.doubleValue()); return tok = CONST_REAL; } // end if is a real else { try { d = java.lang.Double.valueOf(s); } catch (Exception e) { return tok = ERROR; } yylval = new SemanticValue(d.doubleValue()); return tok = CONST_INT; } // end is a int } // end is a number else { // not is a number char c = input.charAt(col++); if (!Character.isWhitespace(c)) { if (!Character.isLetter(c)) return c; String s = "" + c; while (col < input.length() && Character.isLetter(input.charAt(col)) && !Character.isWhitespace(input.charAt(col))) { s += input.charAt(col++); } int r = reservedWord(s); yylval = new SemanticValue(r == TRUE); return r; } } if (firstTime) { firstTime = false; return '\n'; } return 0; } static int reservedWord(String s) { System.out.println("Buscando: " + s); if (s.equalsIgnoreCase("TRUE")) return TRUE; if (s.equalsIgnoreCase("FALSE")) return FALSE; return ERROR; } void eval() { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.println("BYACC/Java-TyCC Interaction Demo"); while (true) { System.out.print("expression:"); try { ins = in.readLine(); getLine(ins); yyparse(); } catch (Exception e) { } } } public static void main(String[] args) { Parser par = new Parser(false); par.eval(); }