[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