blob: 1db7107780ca4f2db3b9aae8402b5f8792c5588c [file] [log] [blame]
// Reverse Polish Notation, main.k
// © 2001, Michael Piefel <piefel@informatik.hu-berlin.de>
%{
#include <iostream>
#include "k.h"
#include "rk.h"
#include "unpk.h"
#include "csgiok.h"
int yyparse();
line TheLine;
%}
%{ KC_TYPES_HEADER
extern line TheLine;
%}
// Yes, create YYSTYPE union for the bison parser.
%option yystype
// Trivial printer function (ignores view)
void
printer(const char *s, uview v)
{
std::cout << s;
}
int
main(int argc, char **argv)
{
FILE* f;
std::cout << " RPN Parser and reformatter " << std::endl;
// If a saved tree is given on command line, read it
if (argc==2) {
f=fopen(argv[1], "r");
kc::CSGIOread(f, TheLine);
fclose(f);
} else yyparse();
line TheCanonLine=TheLine->rewrite(canon);
line TheShortLine=TheCanonLine->rewrite(calculate);
std::cout << "\nInfix notation:\n";
TheCanonLine->unparse(printer, infix);
std::cout << "\n\nCanonical postfix notation:\n";
TheCanonLine->unparse(printer, postfix);
std::cout << "\n\nCalculated infix notation:\n";
TheShortLine->unparse(printer, infix);
std::cout << "\n\nCalculated canonical postfix notation:\n";
TheShortLine->unparse(printer, postfix);
std::cout << std::endl;
}