/*
 * 	{vO~Ouv	ver.0.1
 *		copyright (c) 2011 Hideyuki Niwa
 *
 */

/*** Tu[` ***/
<checkword #word>
	::sys <char #l #word>
	::sys <isUnknown ::sys <member "A" #l>>
	;

<check ()>
	;
<check #l>
	::sys <isAtom #l> <checkword #l>
	;
<check (#l:#out)>
	( ::sys <isAtom #l> <checkword #l> <check #out>
	 |<check #l> <check #out>)
	;

<errormsg #msg>
	<InputStr #str>
	<LineNo #ln>
	<warn>
	<warn #ln "s *** ERROR *** " #msg "" >
	<warn>
	<warn #str>
	<exit>
	;

/*
 * \͕ 
 */

<Ah (#x1 : #x2)>
	<* #x1>  ["A"|","] <check #x1>
	<Ah #x2> 
	;
<Ah (#x1)>
	<* #x1> 
	;

<P let #y>
	<* #y>   ["A"|","] <check #y>
		vZ
	;

<P compare #y>
	<* #y>   ["A"|","] <check #y>
		r
	;

<P compare #y>
	<* #y>   ["A"|","] <check #y>
		
	;

<P M1 #x #y #z>
	<* #y> ( | )  ["A"|","] <check #y>
		<Ah #z> ( | )  ["A"|","] <check #z>
		<* #x> <check #x>
	;

<P M2 #x #y #z>
	<* #y> ( | )  ["A"|","] <check #y>
		<Ah #z>  ["A"|","] <check #z>
		<* #x> <check #x>
	;

<P M3 #x #y #z>
	<* #y> ( | )  ["A"|","] <check #y>
		<Ah #z>    ["A"|","] <check #z>
		<* #x> <check #x>
	;

<P M4 #x #y ()>
	<* #y>  ( |  ) ["A"|","] <check #y>
		<* #x> <check #x>
	; 

<P M5 #x #y ()>
	<* #y>  (||) ["A"|","] <check #y>
		<* #x> <check #x>
	; 

<P #flag>
	(
	   (ł邷ׂ | ׂ)    ("B" | "H" | "?")
	   <is #flag ^₷ׂ>
	 |
	   (ł||ł邩|邩||܂)  ("B" | "H" | "?")
	   <is #flag ^>
	 |
	   (Ă | ĉ |  |  | )  "B"
	   <is #flag >
	 |
	    (ł||ł|||܂)  "B"
	    <is #flag 錾>
	 |
	    "B"
	    <is #flag 錾>
	 )
	;

< #andxyz>
	    <P :#xyz>
	    (
	      (łꍇ | ł | łƂ | ̏ꍇ | ̂Ƃ | Ȃ | Ȃ
			| Ƃ | Ƃ | ꍇ | ꍇ) ["A"|","]
		<is #andxyz (#xyz)>
	     |
	      (ł邩 | ł | ł | 邩 |  |  
		|  | )  ["A"|","]
		< #andxyz2>
		<is #andxyz (#xyz : #andxyz2)>
	    )
	;

<` #xyz #flag>
	<P :#Mxyz1>
	(
	   (łꍇ | ł | łƂ | ̏ꍇ | ̂Ƃ | Ȃ | Ȃ 
			| Ƃ | Ƃ | ꍇ | ꍇ) ["A"|","]
	   <P :#Mxyz2> 
	   <P #flag>
	   <is #xyz (#Mxyz2 #Mxyz1)>
	 |
	   <P #flag>
	   <is #xyz (#Mxyz1)>
	 |
	   (ł邩 | ł | ł | 邩 |  |  
		|  | )  ["A"|","]
	   < #andxyz>
	   <P :#Mxyz2> 
	   <P #flag>
	   <is #xyz (#Mxyz2 #Mxyz1 : #andxyz)>
	)
	;


/*
 * ͌ʂ̃fJgvOt@Cɏo
 */
<`vg #out>
	::sys <mkpredlist #outprd #out>
	<printlist <quote #outprd>>
	<printf <\_t> ";" <\_n>>
	;
<񓚃vg (#out1 :#out)>
	::sys <append #o #out (#out1)>
	::sys <mkpredlist #outprd #o>
	<printf "? " >
	<printf "< " >
	<printf <quote #outprd>>
	<printf ">;" <\_n>>
	;
<񓚂ׂăvg (#out1 :#out)>
	::sys <append #o #out (#out1)>
	::sys <mkpredlist #outprd #o>
	<printf "? " >
	<printf "<񓚂ׂ ">
	<printf <quote #outprd>>
	<printf ">;" <\_n>>
	;

/*** sʂ̏o ***/
<񓚃Ah (#y1 :#y)>
	<printf #y1>
	<񓚃Ah2 #y>
	;
<񓚃Ah2 (#y1 :#y)>
	<printf "" #y1>
	<񓚃Ah2 #y>
	;
<񓚃Ah2 ()>
	;

<񓚒P (M0  #z #y)>
	<printf #z "́A">
	;

<񓚒P (M1 #x #z #y)>
	<printf #z "́A">
	<񓚃Ah #y>
	<printf "" #x >
	;

<񓚒P (M2 #x #z #y)>
	<printf #z "́A">
	<񓚃Ah #y>
	<printf "" #x >
	;

<񓚒P (M3 #x #z #y)>
	<printf #z "́A">
	<񓚃Ah #y>
	<printf "" #x >
	;
<񓚒P (M4 #x #z #y)>
	<printf #z "́A">
	<printf #x >
	;
<񓚒P (M5 #x #z #y)>
	<printf #z "">
	<printf #x >
	;

<񓚕 ((#M #x #z #y) : #out)>
	<񓚒P (#M #x #z #y)>
	(  <is #out ()> <print "łB">
	 | <is #out ((#M2 #x2 #z2 #y2))> <printf "łꍇA"> <񓚕 #out>
	 | <printf "łA"> <񓚕 #out>)
	;

<s ((#M #x #z #y) : #out)>
	<񓚒P (#M #x #z #y)>
	(  <is #out ()> <print "ł͂܂B">
	 | <is #out ((#M2 #x2 #z2 #y2))> <printf "łꍇA"> <s #out>
	 | <printf "łA"> <s #out>)
	;


< #outprd2>
	(
	  <timeout 10000000 #outprd2>
	  <񓚕 #outprd2>
	| <s #outprd2>
	)
	;

<񓚂ׂ #outprd2>
	(
	 <timeout 10000000 
	   <findall
	    #outprd2
	    <񓚕 #outprd2>
	  >
	 >
	| <s #outprd2>
	)
	;


/*
 * ̓t@C當؂o 
 */
<Rg>
	"//" <SKIPCR>
	;

<ǂݍ ()>
	<Rg>
	;

<ǂݍ #l>
	<TOKEN #l <* #x> ("B" | "H" | "?" | EOF)>
	;

<sԍݒ>
	<SKIPSPACE>
	::sys <line #ln>
	<setVar LineNo #ln>
	;

/*
 * C
 */
<ǂݍ>
	{ 
		<sԍݒ>
		<ǂݍ #in> 
		<setVar InputStr #in>
		::sys <strdelcntl #i #in>
		(
		   <is #i ()>
		 |
		   ::sys <syntax #i <NULLLINE>>
		 | 
		   ::sys <syntax #i
			 (  <` #out #flag> 
			    ::sys <switch #flag
				錾    <`vg #out>
				^ (
					<printf "? <printf '" #i "' <\_n>>; " <\_n>>
					<񓚃vg #out> 
					<print "? <print>;">)
				 (
					<printf "? <printf '" #i "' <\_n>>; " <\_n>>
					<񓚃vg #out> 
					<print "? <print>;">)
				^₷ׂ (
					<printf "? <printf '" #i "' <\_n>>; " <\_n>>
					<񓚂ׂăvg #out> 
					<print "? <print>;">)
			    >
			    [::sys <isUndefVar #out> 
				<errormsg "\߂ł܂B"> ]
			 | <errormsg "\Ɍ肪܂B">
			 )
		   > 
		)
		::sys <flush>
	}
	;


<gݍ>
	<printf
		"<M4 Xg #x ()> ::sys <isList #x>;" <\_n>
		"<M5 \ s ()> <print>;" <\_n>
		"<M5 \ #x ()> <print #x>;" <\_n>
	>
	;

<N>
	::sys <PrintResultOff>
	::sys <args #args> <is #args (_ #prg :_)>
	::sys <openr #prg 
		::sys <openw "tempfile.txt" 
			<gݍ>
			<ǂݍ>>>
	<load "tempfile.txt">;
	;

? <N>;


