[llvm-commits] CVS: llvm-test/MultiSource/Applications/kimwitu++/inputs/f1.k f2.k f3.k abs.k main.k rpn.k
John Criswell
criswell at cs.uiuc.edu
Mon Sep 13 15:20:22 PDT 2004
Changes in directory llvm-test/MultiSource/Applications/kimwitu++/inputs:
f1.k added (r1.1)
f2.k added (r1.1)
f3.k added (r1.1)
abs.k (r1.1) removed
main.k (r1.1) removed
rpn.k (r1.1) removed
---
Log message:
Renamed input files to f<x>.k so that generated header and source files do
not conflict with original Kimwitu++ source files.
This was causing problems if builddir == sourcedir.
---
Diffs of the changes: (+209 -0)
Index: llvm-test/MultiSource/Applications/kimwitu++/inputs/f1.k
diff -c /dev/null llvm-test/MultiSource/Applications/kimwitu++/inputs/f1.k:1.1
*** /dev/null Mon Sep 13 17:20:21 2004
--- llvm-test/MultiSource/Applications/kimwitu++/inputs/f1.k Mon Sep 13 17:20:10 2004
***************
*** 0 ****
--- 1,20 ----
+ // Reverse Polish Notation, abs.k
+ // © 2001, Michael Piefel <piefel at informatik.hu-berlin.de>
+
+ // The abstract syntax of our expressions
+ line:
+ Line(expression);
+
+ term:
+ Number(integer) | Ident(casestring);
+
+ expression:
+ Term( term )
+ | Plus( expression expression )
+ | Mul( expression expression )
+ | Minus( expression expression )
+ | Div( expression expression )
+ | Div2( expression casestring expression )
+ ;
+
+
Index: llvm-test/MultiSource/Applications/kimwitu++/inputs/f2.k
diff -c /dev/null llvm-test/MultiSource/Applications/kimwitu++/inputs/f2.k:1.1
*** /dev/null Mon Sep 13 17:20:22 2004
--- llvm-test/MultiSource/Applications/kimwitu++/inputs/f2.k Mon Sep 13 17:20:10 2004
***************
*** 0 ****
--- 1,58 ----
+ // Reverse Polish Notation, main.k
+ // © 2001, Michael Piefel <piefel at 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;
+ }
+
Index: llvm-test/MultiSource/Applications/kimwitu++/inputs/f3.k
diff -c /dev/null llvm-test/MultiSource/Applications/kimwitu++/inputs/f3.k:1.1
*** /dev/null Mon Sep 13 17:20:22 2004
--- llvm-test/MultiSource/Applications/kimwitu++/inputs/f3.k Mon Sep 13 17:20:10 2004
***************
*** 0 ****
--- 1,131 ----
+ // Reverse Polish Notation, rpn.k
+ // © 2001, Michael Piefel <piefel at informatik.hu-berlin.de>
+
+ // Define which views (ie., different paths) we intent to take
+ // during unparse and rewrite
+ %uview infix postfix;
+ %rview canon calculate;
+
+
+ // Simple expressions
+ Plus( exp1, exp2 )
+ -> [ infix: exp1 "+" exp2 ]
+ [ postfix: exp1 " " exp2 " +" ];
+
+ Minus( exp1, exp2 )
+ -> [ infix: exp1 "-" exp2 ]
+ [ postfix: exp1 " " exp2 " -" ];
+
+ // Beware of parentheses in infix representation
+ Mul( exp1, exp2=Plus(*,*) ),
+ Mul( exp1, exp2=Minus(*,*) )
+ -> [ infix: exp1 "*(" exp2 ")" ];
+
+ Mul( exp1=Plus(*,*), exp2 ),
+ Mul( exp1=Minus(*,*), exp2 )
+ -> [ infix: "(" exp1 ")*" exp2 ];
+
+ Mul( exp1=Plus(*,*), exp2=Plus(*,*) ),
+ Mul( exp1=Plus(*,*), exp2=Minus(*,*) ),
+ Mul( exp1=Minus(*,*), exp2=Plus(*,*) ),
+ Mul( exp1=Minus(*,*), exp2=Minus(*,*) )
+ -> [ infix: "(" exp1 ")*(" exp2 ")" ];
+
+ Mul( exp1, exp2 )
+ -> [ infix: exp1 "*" exp2 ]
+ [ postfix: exp1 " " exp2 " *"];
+
+ Div( exp1=Plus(*,*), exp2 ),
+ Div( exp1=Minus(*,*), exp2 )
+ -> [ infix: "(" exp1 ")/" exp2 ];
+
+ Div( exp1, exp2=Plus(*,*) ),
+ Div( exp1, exp2=Minus(*,*) ),
+ Div( exp1, exp2=Mul(*,*) ),
+ Div( exp1, exp2=Div(*,*) )
+ -> [ infix: exp1 "/(" exp2 ")"];
+
+ Div( exp1=Plus(*,*), exp2=Plus(*,*) ),
+ Div( exp1=Plus(*,*), exp2=Minus(*,*) ),
+ Div( exp1=Minus(*,*), exp2=Plus(*,*) ),
+ Div( exp1=Minus(*,*), exp2=Minus(*,*) )
+ -> [ infix: "(" exp1 ")/(" exp2 ")" ];
+
+ Div( exp1, exp2 )
+ -> [ infix: exp1 "/" exp2 ]
+ [ postfix: exp1 " " exp2 " /" ];
+
+
+ // Calculate all that can be calculated (ie. all where
+ // we have concrete numbers)
+ Plus( Term(Number(a)), Term(Number(b)) )
+ -> < calculate: Term(Number(plus(a,b)))>;
+
+ Plus( Term(Number(a)), Plus(Term(Number(b)), rest) )
+ -> < calculate: Plus(Term(Number(plus(a,b))), rest)>;
+
+ Plus( Term(Number(a)), Minus(Term(Number(b)), rest) )
+ -> < calculate: Minus(Term(Number(plus(a,b))), rest)>;
+
+ Minus( Term(Number(a)), Term(Number(b)) )
+ -> < calculate: Term(Number(minus(a,b)))>;
+
+ Minus( Term(Number(a)), Minus(Term(Number(b)), rest) )
+ -> < calculate: Plus(Term(Number(minus(a,b))), rest)>;
+
+ Minus( Term(Number(a)), Plus(Term(Number(b)), rest) )
+ -> < calculate: Minus(Term(Number(minus(a,b))), rest)>;
+
+ Mul( Term(Number(a)), Term(Number(b)) )
+ -> < calculate: Term(Number(mul(a,b)))>;
+
+ Mul( Term(Number(a)), Mul(Term(Number(b)), rest) )
+ -> < calculate: Mul(Term(Number(mul(a,b))), rest)>;
+
+ Mul( Term(Number(a)), Div(Term(Number(b)), rest) )
+ -> < calculate: Div(Term(Number(mul(a,b))), rest)>;
+
+ Div( Term(Number(a)), Term(Number(b)) )
+ -> < calculate: Term(Number(divi(a,b)))>;
+
+ Div( Term(Number(a)), Div(Term(Number(b)), rest) )
+ -> < calculate: Mul(Term(Number(divi(a,b))), rest)>;
+
+ Div( Term(Number(a)), Mul(Term(Number(b)), rest) )
+ -> < calculate: Div(Term(Number(divi(a,b))), rest)>;
+
+ // Helper functions to actually compute
+ %{ KC_REWRITE
+ inline integer plus(integer a, integer b) { return mkinteger(a->value+b->value); }
+ inline integer minus(integer a, integer b) { return mkinteger(a->value-b->value); }
+ inline integer mul(integer a, integer b) { return mkinteger(a->value*b->value); }
+ inline integer divi(integer a, integer b) { return mkinteger(b->value==0 ? 0 : a->value / b->value); }
+ %}
+
+
+ // Rewrite to a canonical form of the expression where operators
+ // are to be put as far to the end as possible
+ Plus( Plus(a, b), c)
+ -> < canon: Plus(a, Plus(b, c))>;
+
+ Plus( Minus(a, b), c)
+ -> < canon: Plus(c, Minus(a, b))>;
+
+ Minus( Plus(a, b), c)
+ -> < canon: Plus(a, Minus(b, c))>;
+
+ Mul( Mul(a, b), c)
+ -> < canon: Mul(a, Mul(b, c))>;
+
+ Plus( a=Term(Ident(*)), b=Term(Number(*)) )
+ -> < canon: Plus(b, a)>;
+
+ Mul( a=Term(Ident(*)), b=Term(Number(*)) )
+ -> < canon: Mul(b, a)>;
+
+ Plus( a=Term(Ident(*)), Plus(b=Term(Number(*)), rest) )
+ -> < canon: Plus(b, Plus(a,rest))>;
+
+ Mul( a=Term(Ident(*)), Mul(b=Term(Number(*)), rest) )
+ -> < canon: Mul(b, Mul(a,rest))>;
+
More information about the llvm-commits
mailing list