
<compile>
	::sys<args #x>
	::sys<nth #inputfile #x 1>
	::sys<suffix #outputfile #inputfile c>
	<print inputfile #inputfile>
	<print outputfile #outputfile>
	::sys<openw #outputfile
		::sys<openr #inputfile <TinyPython>>>
	;


<TinyPython>				<print "#include <stdio.h>">
					<print "int main() {">
					<print "int a,b,c,d,e,f,g,h,i,j,k,l,m;">
					<print "int n,o,p,q,r,s,t,u,v,w,x,y,z;">
					<setVar exline 1>
		{
					<SKIPSPACE>
		  			<INDENT 0>
		  <ץ> 
		}
					<SKIPSPACE>
					<x <errormsg "indent error">>
		  			<INDENT 0>
		<EOF>			<print "exit(0);">
					<print "}">
		;

<ץ>
		  <ʸ>
		| 
		  <ץʸ>
		;

<ץʸ>
		[<¹ʸ> { ";" <¹ʸ>}] [<>] <CR>;

<֥å>
		":"			<INDENT #n0>
					<SKIPSPACE>
					<INDENT #n>
					<print "{">
		{
					<SKIPSPACE>
					<INDENT #n>
		  <ץ>
		}
					<SKIPSPACE>
					<INDENT #n0>
					<x <errormsg "indent error">>
					<print "}">
		;

<ʸ>	( <ifʸ> | <whileʸ> | <forʸ> )
					<setVar exline 
						<_ = ::sys <line #l>+1>>;

<¹ʸ>	( <printʸ> | <ʸ>)
					<setVar exline 
						<_ = ::sys <line #l>+1>>;


<ifʸ>          "if"	 		<x <errormsg "ifʸ˥顼">>
					<printf "if (">
		<Ｐ>		<printf ") ">
		<֥å> 
		[ 
			"else"   	<x <errormsg "elseʸ˥顼">>
			 		<printf "else " <\_n>>
			<֥å> 
		] 
		;

<whileʸ>       "while"  		<x <errormsg "whileʸ˥顼">>
			 		<printf "while (">
		<Ｐ> 		<printf ") " <\_n>>
		<֥å> 
		;

<forʸ>       "for"
				 	<x <errormsg "forʸ˥顼">>
		<ѿ #i>
		"in" "range" "("
		       (<NUM #n> | <ѿ #n>)
		")"
			 		<printf "{"  <\_n>>
					<printf "int " #i ";" <\_n>> 
					<printf "for (" #i "=0; " #i " < ">
					<printf #n>
					<printf "; " #i "++) " <\_n>>
		<֥å> 
					<printf "}" <\_n>>
		;

<printʸ>
	       "print"	  	 	<x <errormsg "printʸ˥顼">>
		<ɽ> 
			{","  		<printf 'printf(" ");' <\_n>>
			  <ɽ>}
					<printf 'printf("\n");' <\_n>>
		;

<ɽ>				<printf 'printf('>
		(
		   <STRINGS #s>		<printf '"%s","' #s '"'>
		 | 
					<printf '"%d", '>
		   <>
		)
					<printf ');' <\_n>>
		;

<ʸ>
	        <ѿ #v>
	 	 	 		<x <errormsg "ʸ˥顼">>
		"="
					<printf #v>
					<printf " = ">
		<>			<printf ";" <\_n>>
		;

<>          <expradd>;

<expradd>       <exprmul> 
		{ "+" 			<printf "+">
			<exprmul> 
		| "-" 			<printf "-">
			<exprmul> 
		}
		;

<exprmul>       <exprID> 
		{ "*" 			<printf "*">
			<exprID> 
		| "/" 			<printf "/">
			<exprID> 
		}
		;

<exprID>        "+" <exprterm> 
		| "-" 			<printf "-">
			<exprterm> 
		| <exprterm>
		;

<exprterm>      "(" 			<printf "(">
			<> 
		")" 			<printf ")">
		| <NUM> 		<GETTOKEN #n>
					<printf #n>
		| <ѿ #v>		<printf #v>
		;

<Ｐ> 		  	 	<x <errormsg "Ｐ˥顼">>
		<> 
		(">=" | ">" | "==" | "!=" | "<=" | "<") 
					<GETTOKEN #op>
					<printf #op>
		<>
		;

<ѿ #x> 
		<SKIPSPACE>
		<RANGE #x a z>
		;

<>	"#" <SKIPCR>
		;

<errormsg #x>
		::sys <line #n>
		<warn "error : " #n ":" #x>
		<exit>
		;
<errormsg #n #x>
		<warn "error : " #n ":" #x>
		<exit>
		;


?<compile>;

