/*
 * 形態素ライブラリ  V1.0
 *
 * 入力ファイルより文を読み込み、形態素解析を行う。
 *
 */
? <include list>;


<形態素解析 #o>
	<Prc>
	<文 #a #b>
	::list <append #c #a (#b)>
	<形態素 #c>
	<del_last_nil>
	<plist #o>
	;

<形態素 ()>;
<形態素 ((。 :_))>;
<形態素 ((#s1 #s2) :#l2)>
	<laststr #ls #s2>
	(
	 <is #ls は>
	 |
	 <is #ls が>
	 |
	 <is #ls に>
	 |
	 <is #ls を>
	)
	<Prn (#s1 #s2)>
	<形態素 #l2>
	;
<形態素 ((#s2) :#l2)>
	<laststr #ls #s2>
	<語尾チェック #ls>
	<Prn (#s2)>
	<形態素 #l2>
	;
<形態素 ((#s1 #s2) :#l2)>
	<laststr #ls #s2>
	<語尾チェック #ls>
	<Prn (#s1 #s2)>
	<形態素 #l2>
	;
<語尾チェック #ls>
	(
	 <is #ls き>
	 |
	 <is #ls し>
	 |
	 <is #ls ち>
	 |
	 <is #ls に>
	 |
	 <is #ls ひ>
	 |
	 <is #ls み>
	 |
//	 <is #ls り>
//	 |
	 <is #ls う>
	 |
	 <is #ls く>
	 |
	 <is #ls す>
	 |
	 <is #ls つ>
	 |
	 <is #ls て>
	 |
	 <is #ls え>
	 |
	 <is #ls で>
	 |
	 <is #ls ぶ>
	 |
	 <is #ls ば>
	)
	;
<形態素 ((#l1) :#l2)>
	(
	 <is #l1 が>
	 |
	 <is #l1 を>
	 |
	 <is #l1 は>
	 |
	 <is #l1 と>
	 |
	 <is #l1 で>
	)
	<Prn (#l1) >
	<形態素 #l2>
	;
/*
<形態素 ((#l1) :#l2)>
	<Prn (#l1) >
	<形態素 #l2>
	;
*/
<形態素 (#l1 :#l2)>
	<Pr #l1>
	<形態素 #l2>
	;

<文 #s #prd>
	{#s
		<nop #p>
		(
		 <括弧開く #p>
		|
		 <括弧閉じ #p>
			["、" | "，" | "," ]
		|
		 <その他 #p>
		|
		 <格 #x1 #g>
			(
			  <is #g "">
			  <is #p (#x1)>
			 |
			  <is #p (#x1 #g)>
			)
		)
	}
	(
	  <述語 #y #t>
		(
		  <is #t "">
		  <is #prd (#y)>
		 |
		  <is #prd (#y #t)>
		)
	 |
	  <* #y><is #prd (#y)>
	)
	;

<laststr #l #s>
	::sys <char #list #s>
	::list <last #l #list>
	;

<その他 (#s)>
		(
		   "万一"
		 | "少なくとも"
		 | "少しも"
		 | "少くとも"
		 | "待ちに待った"
		 | "何故なら"
		 | "因みに"
		 | "主には"
		 | "主に"
		 | "主として"
		 | "実は"
		 | "例えば"
		 | "考えていた"
		 | "思しき"
		 | "を"
		 | "わたり"
		 | "よるが"
		 | "よりますが"
		 | "より"
		 | "よもや"
		 | "ようやく"
		 | "もともと"
		 | "もとに"
		 | "もっとも"
		 | "もちろん"
		 | "もしくは"
		 | "もし"
		 | "もう"
		 | "まるで"
		 | "まだ"
		 | "または"
		 | "また"
		 | "ますます"
		 | "まさに"
		 | "まさか"
		 | "ほぼ"
		 | "は"		<NOTNEXTSTR "ず"><NOTNEXTSTR "を">
				<NOTNEXTSTR "じ">
		 | "に"		<NOTNEXTSTR "の"><NOTNEXTSTR "を">
				<NOTNEXTSTR "だ">
		 | "ならびに"
		 | "なり得るのか"
		 | "なりうるのか"
		 | "なり得る"
		 | "なりうる"
		 | "なぜなら"
		 | "なぜ"
		 | "なかったことは"
//		 | "なかったとはいえ"
//		 | "なかったと"
		 | "ないと"
		 | "なお"
		 | "ないしは"
		 | "どんどん"
		 | "との"
		 | "という"
		 | "ところで"
		 | "ところが"
		 | "どうすべきか"
		 | "どうしても"
		 | "どうして"
		 | "どうか"
		 | "どういうわけか"
		 | "とのこと"
		 | "というのは"
		 | "というと"
		 | "ともに"
		 | "ともあれ"
		 | "とも"	<NOTNEXTSTR "だ"><NOTNEXTSTR "と">
		 | "と"		<NOTNEXTSTR "も"><NOTNEXTSTR "は">
				<NOTNEXTSTR "こ"><NOTNEXTSTR "き">
				<NOTNEXTSTR "ら"><NOTNEXTSTR "り">
				<NOTNEXTSTR "る"><NOTNEXTSTR "れ">
				<NOTNEXTSTR "ろ">
		 | "でも"
		 | "では"
		 | "で"		<NOTNEXTSTR "す"><NOTNEXTSTR "き">
		 | "謹んで"
		 | "つつしんで"
		 | "ちょうど"
		 | "ちなみに"
		 | "たとえば"
		 | "だって"
		 | "だったら"
		 | "だけど"
		 | "だが"
		 | "だから"
		 | "ただし"
		 | "それまでも"
		 | "それまで"
		 | "それほど"
		 | "それはそうと"
		 | "それはさておき"
		 | "それは"
		 | "それにもかかわらず"
		 | "それにしては"
		 | "それに"
		 | "それなら"
		 | "それなのに"
		 | "それと共に"
		 | "それとともに"
		 | "それとも"
		 | "それでも"
		 | "それでは"
		 | "それで"
		 | "それぞれ"
		 | "それじゃ"
		 | "それこそが"
		 | "それこそ"
		 | "それが"
		 | "それから"
		 | "その結果"
		 | "そのような"
		 | "そのまま"
		 | "そのとき"
		 | "その通りで"
		 | "その通り"
		 | "その分"
		 | "そのために"
		 | "そのため"
		 | "そのうえで"
		 | "そのうえ"
		 | "その"
		 | "そちらで"
		 | "そして"
		 | "そこで"
		 | "そうか"
		 | "そういえば"
		 | "ぜひ"
		 | "すると"
		 | "すべてが"
		 | "すでに"
		 | "じゃあ"
		 | "じゃ"
		 | "しばらく"
		 | "してる"
		 | "じつは"
		 | "しっかり"
		 | "したがって"
		 | "しかも"
		 | "しかし"
		 | "し"			<NOTNEXTSTR "を"><NOTNEXTSTR "た">
					<NOTNEXTSTR "ま"><NOTNEXTSTR "な">
					<NOTNEXTSTR "て"><NOTNEXTSTR "い">
					<NOTNEXTSTR "る"><NOTNEXTSTR "れ">
		 | "され"
		 | "さらには"
		 | "さらに"
		 | "さて"
		 | "さすが"
		 | "こんばんわ"
		 | "こんばんは"
		 | "こんにちわ"
		 | "こんにちは"
		 | "これは"
		 | "これでも"
		 | "これでは"
		 | "これで"
		 | "このように"
		 | "このような"
		 | "このまま"
		 | "このほど"
		 | "このところ"
		 | "このとき"
		 | "このごろは"
		 | "このごろ"
		 | "この"
		 | "こうしたことから"
		 | "こうした"
		 | "こういう"
		 | "こう"
		 | "けれども"
		 | "けれど"
		 | "けっして"
		 | "きっと"
		 | "かつてなく"
		 | "かつてない"
		 | "かつて"
		 | "かつ"
		 | "が"
		 | "およびに"
		 | "および"
		 | "おそらく"
		 | "いただきたい"
		 | "頂きたい"
		 | "いただき"
		 | "頂き"
		 | "いずれは"
		 | "いずれ"
		 | "あれは"
		 | "あるに"
		 | "あるいは"
		 | "ある"
		 | "あまり"
		 | "あのまま"
		 | "あのとき"
		 | "あの"
		 | "あと"
		 | "すべての"
		 | "全ての"
		)
				<GETTOKEN #s>
		[
		    ","
		  | "、"
		  | "，"
		  | <SPACE>
		]
		;
/*
<格 #x1 #x2 #x3 #g>
	<括弧開く #x1>
	<* #x2> 
	<括弧閉じ #x3>
	<格2 #x3 #g>
	;
*/
<格 #x #g>
	<* #x> 
	<格2 #x #g>
	;
<格2 #x #g>
	(
		  "等を"
		| "等の"
		| "等にも"
		| "等"		
/*		| "をと"
				<NOTNEXTSTR "っ"><NOTNEXTSTR "り">
				<NOTNEXTSTR "れ">//<NOTNEXTSTR "る">
				<NOTNEXTSTR "ら"><NOTNEXTSTR "ろ">
*/
		| "を"	
		| "る"
		| "れる"
		| "よりも"
		| "よりは"
		| "より"
		| "ようにも"
		| "ように"
		| "や"		<NOTNEXTSTR "の"><NOTNEXTSTR "を">
				<NOTNEXTSTR "れ"><NOTNEXTSTR "し">
				<NOTNEXTSTR "か">
		| "ものを"
		| "ものは"
		| "ものの"
		| "もあるため"		
		| "もあるし"		
		| "もあるが"		
		| "もある"		
		| "もあり"
		| "も"
		| "までを"
		| "までも"
		| "までは"
		| "までの"
		| "までに"
		| "まで"
		| "または"
		| "また"
		| "いますが"
		| "いまして"
		| "いましたが"
		| "ますが"
		| "まして"
		| "ましたが"
		| "ほか"
		| "へを"
		| "へは"
		| "への"
		| "へと"
		| "へ"		
		| "ぶ"
		| "ば"		<NOTNEXTSTR "れ"><NOTNEXTSTR "を">
		| "は"		<NOTNEXTSTR "を"><NOTNEXTSTR "ず">
		| "のような"
		| "のものであり"
		| "のも"	<NOTNEXTSTR "の">
		| "のみを"
		| "のみは"
		| "のみが"
		| "のものを"
		| "のものは"
		| "のものに"
		| "のものが"
		| "のは"
		| "のための"
		| "のために"
		| "のため"
		| "のとおり"
		| "のと"	<NOTNEXTSTR "き"><NOTNEXTSTR "こ">
				<NOTNEXTSTR "あ">
		| "のことと"
		| "のうち"		
		| "のある"		
		| "の"		<NOTNEXTSTR "も"><NOTNEXTSTR "を">
				<NOTNEXTSTR "み"><NOTNEXTSTR "ぼ">
				<NOTNEXTSTR "り"><NOTNEXTSTR "る">
		| "によれば"
		| "によると"
		| "による"
		| "により"
		| "によっては"
		| "によって"
		| "にも"
		| "にまで"
		| "には"
		| "になる"
		| "になったことは"
		| "になった"
		| "にとっては"
		| "にとって"
		| "にて"
		| "についても"
		| "については"
		| "についての"
		| "について"
		| "にして"
		| "にしか"
		| "にくく"
		| "にくいが"
		| "にくい"
		| "における"
		| "においては"
		| "において"
		| "に"		<NOTNEXTSTR "の"><NOTNEXTSTR "を">
				<NOTNEXTSTR "だ">
		| "なんて"
		| "なる"
		| "ならば"
		| "なら"
		| "なのですが"
		| "なので"
		| "なのだけれども"
		| "なのだが"
		| "などを"
		| "なども"
		| "などは"
		| "などのための" 
		| "などの"
		| "などにも"
		| "などについては"
		| "などに"
		| "などでの"
		| "などで"
		| "などから"
		| "などが"
		| "など"
		| "なと"	<NOTNEXTSTR "こ">
		| "なしで"
		| "ないし"
		| "ないが"
		| "ない"
		| "な"		<NOTNEXTSTR "の"><NOTNEXTSTR "し">
				<NOTNEXTSTR "か"><NOTNEXTSTR "く">
				<NOTNEXTSTR "を"><NOTNEXTSTR "ん">
				<NOTNEXTSTR "り">
		| "とも"
		| "との"
		| "とはいえ"
		| "とは"
		| "となる"
		| "となり"	<NOTNEXTSTR "ま">
		| "となっているとのこと"
		| "となっているとの"
		| "となっている"
		| "とするのは"
		| "とするが"
		| "とする"
		| "としては"
		| "としての"
		| "として"
		| "としたい"
		| "とした"
		| "とき"
		| "といったら"
		| "といったのは"
		| "といったのが"
		| "といった"
		| "というよりは"
		| "というのは"
		| "というのが"
		| "というと"
		| "ということですので"
		| "ということは"
		| "ということが"
		| "というか"
		| "という"
		| "と"		<NOTNEXTSTR "か"><NOTNEXTSTR "を">
				<NOTNEXTSTR "つ"><NOTNEXTSTR "目">
				<NOTNEXTSTR "り"><NOTNEXTSTR "し">
				<NOTNEXTSTR "こ"><NOTNEXTSTR "も">
		| "でも"	<NOTNEXTSTR "ら"><NOTNEXTSTR "う">
		| "ても"	<NOTNEXTSTR "ら">
		| "ではなく"
		| "ではない"
		| "では"
		| "での"
		| "でない"
		| "ですが"
		| "でしたが"
		| "できるようにも"
		| "できるように"
		| "できるようなら"
		| "できるよう"
		| "できると"	<NOTNEXTSTR "こ">
		| "できるのは"
		| "できる"
		| "であることを"
		| "であることは"
		| "であることに"
		| "であること"
		| "であるが"
		| "である"
		| "であり"	<NOTNEXTSTR "ま">
		| "で"		<NOTNEXTSTR "き"><NOTNEXTSTR "を">
				<NOTNEXTSTR "す"><NOTNEXTSTR "し">
		| "て"		<NOTNEXTSTR "き"><NOTNEXTSTR "を">
				<NOTNEXTSTR "が"><NOTNEXTSTR "は">
				<NOTNEXTSTR "に"><NOTNEXTSTR "る">
				<NOTNEXTSTR "く">
		| "つもりは"
		| "たら"
		| "だけを"
		| "だけは"
		| "だけの"
		| "だけに"
		| "だけではなく" 
		| "だけでは" 
		| "だけでなく"
		| "だけが"
		| "だけでも"
		| "だけで"	<NOTNEXTSTR "す">
		| "だけ"
		| "だが"
		| "ための"
		| "ために"
		| "ため"
		| "だから"
		| "た"		<NOTNEXTSTR "ち">
		| "せよといった"		
		| "せよという"		
//		| "せ"		<NOTNEXTSTR "る">
		| "すれば"
		| "するのに"
		| "するのは"
		| "するのと"
		| "するのだと"
		| "するのが"
		| "するには"
		| "するに"
		| "するというのが"
		| "するということが"
		| "するという"
		| "すると"	<NOTNEXTSTR "こ">
		| "するつもりは"
		| "することを"
		| "することは"
		| "することの"
		| "することに"
		| "することで"
		| "することが"
		| "することと"
//		| "すること"
		| "するが"
		| "する"
		| "しれないが"
		| "しれない"
		| "しようと"
		| "しよう"
		| "しなかったのは"
		| "しないのは"
		| "してもらい"
		| "しても"		<NOTNEXTSTR "ら">
		| "しては"
		| "してきた"
		| "しており"
		| "しているのが"
		| "しているの"
		| "している"
		| "していない"
		| "していたものの"
		| "していた"
		| "していくという"　
		| "していく"
		| "し続ける"
		| "したら"
		| "したように"
		| "したのに"
		| "したので"
		| "したのだと"
		| "したと"
		| "たと"
		| "したが"
		| "したい"
		| "いました"
		| "した"
		| "しか"
/*
		| "し"			<NOTNEXTSTR "を"><NOTNEXTSTR "た">
					<NOTNEXTSTR "ま"><NOTNEXTSTR "な">
					<NOTNEXTSTR "て">
*/
		| "されることに"
		| "されても"
		| "されては"
		| "されているのか"
		| "されている"
		| "されたが"
		| "ことも"
		| "とも"
		| "ことは"
		| "ことなどは"
		| "ことなど"
		| "ことと"
		| "ことが"
		| "こと"
		| "こそ"
		| "く"			<NOTNEXTSTR "の"><NOTNEXTSTR "だ">
					<NOTNEXTSTR "ら"><NOTNEXTSTR "る">
		| "かる"
		| "かけられた"
		| "があり"		<NOTNEXTSTR "ま"><NOTNEXTSTR "を">
		| "が"			<NOTNEXTSTR "り"><NOTNEXTSTR "る">
					<NOTNEXTSTR "っ">
		| "からも"
		| "からの"
		| "からは"
		| "かも"
		| "から"
		| "か"			<NOTNEXTSTR "に"><NOTNEXTSTR "れ">
					<NOTNEXTSTR "を"><NOTNEXTSTR "な">
					<NOTNEXTSTR "ず"><NOTNEXTSTR "し">
					<NOTNEXTSTR "か"><NOTNEXTSTR "っ">
		| "おり"
		| "および"
		| "おく"
		| "う"		<NOTNEXTSTR "の">
		| "いるが"
/*
		| "い"		<NOTNEXTSTR "し"><NOTNEXTSTR "ま">
				<NOTNEXTSTR "て"><NOTNEXTSTR "た">
				<NOTNEXTSTR "に"><NOTNEXTSTR "が">
				<NOTNEXTSTR "を"><NOTNEXTSTR "は">
				<NOTNEXTSTR "だ"><NOTNEXTSTR "の">
				<NOTNEXTSTR "る"><NOTNEXTSTR "っ">
*/
		| "?"		
		| "？"		
		| "!"		
		| "！"		
		| <NEXTSTR "、"> 
		| <NEXTSTR "，"> 
		| <NEXTSTR ","> 
		| <NEXTSTR "("> 
	  	| <NEXTSTR "（"> 
		| <NEXTSTR "「"> 
		| <NEXTSTR "『"> 
		| <NEXTSTR "["> 
		| <NEXTSTR "【"> 
		| <NEXTSTR "{"> 
		| <NEXTSTR ")"> 
		| <NEXTSTR "）">  
		| <NEXTSTR "」"> 
		| <NEXTSTR "』"> 
		| <NEXTSTR "]"> 
		| <NEXTSTR "】"> 
		| <NEXTSTR "}"> 
		| <NEXTSTR '"'> 
		| <NEXTSTR "'"> 
		| <NEXTSTR "”">
		| <NEXTSTR "“">
	)
		
		<NOTNEXTSTR "。">
		<NOTNEXTSTR ".">

 		<GETTOKEN #g>
	(
		  <eq #g "を"> [ "," | "、" | "，"]
		| ","
		| "、"
		| "，"
		| <SPACE>
		| (
		    ::sys <rightstr #rc #x 1>
		    <NEXTCHAR #lc>  
		   (
			(  ::sys <syntax #rc <NONRANGE _ "あ" "ん">>
		    	 | ::sys <syntax #lc <NONRANGE _ "あ" "ん">>
			)
		   )		  
		   <noteq #lc "ぁ">
		   <noteq #lc "ぃ">
		   <noteq #lc "ぅ">
		   <noteq #lc "ぇ">
		   <noteq #lc "ぉ">
		   //<noteq #lc "っ">
		   <noteq #lc "ゃ">
		   <noteq #lc "ゅ">
		   <noteq #lc "ょ">

		   <noteq #rc "な">
		   <noteq #rc "で">
		 )
	)
	;


	
<述語 #y #t>
	<* #y>
	((
	   "いたしました"
	 | "いたします"
	 | "ありました"
	 | "できる"
	 | "できます"
	 | "あります"
	 | "いない"
	 | "らしかった"
	 | "らしい"
	 | "ようだった"
	 | "ようだ"
	 | "ものです"
	 | "ものだ"
	 | "もの"
	 | "みてほしい"
	 | "します"
	 | "しました"
	 | "ました"
	 | "まい"
	 | "ほしかった"
	 | "ほしい"
	 | "なる"
	 | "なります"
	 | "なのだから"
	 | "なった"
	 | "しなかっただろう"
	 | "なかっただろう"
	 | "しなかった"
	 | "なかった"
	 | "しないだろう"
	 | "ないだろう"
	 | "しない"
	 | "ない"
	 | "です"
	 | "でした"
	 | "できる"
	 | "できない"
	 | "である"
	 | "であった"
	 | "してみる"
	 | "てみる"
	 | "してみた"
	 | "てみた"
	 | "してました"
	 | "てました"
	 | "してある"
	 | "てある"
	 | "してあった"
	 | "てあった"
	 | "しただろう"
	 | "だろう"
	 | "だれ"
	 | "だった"
	 | "だから"
	 | "したかった"
	 | "たかった"
	 | "したい"
	 | "たい"
	 | "した"
	 | "そうだった"
	 | "そうだ"
	 | "する"
	 | "しています"
	 | "した"
	 | "しい"
	 | "される"
	 | "されている"
	 | "された"
	 | "ください"
	 | "かかった"
	 | "かかる"
	 | "かる"
	 | "からだ"
	 | "か"
	 | "ました"
	 | "いる"
	 | "ある"
	 | "ある"
	 ) <GETTOKEN #t>
	|(
	 | "?"
	 | "？"
	 | "."
	 | "。"
	 | "..."
	 | "……"
	 | "…"
	 | <SPACE>
	 | <CR>
	 )<is #t "">
	)
	
	(
		  "?"
		| "？"
		| "."
		| "。"
		| "..."
		| "……"
		| "…"
		| <SPACE>
		| <CR>
		| <EOF>
	)
	;

<括弧 #g>
	(
	    "("
	  | "（"
	  | "「"
	  | "『"
	  | "【"
	  | "["
	  | "{"
	  | ")" 
	  | "）"  
	  | "」" 
	  | "』" 
	  | "】" 
	  | "]" 
	  | "}" 
	  | "'"
	  | '"'
	  | "”"
	  | "“"
	)
	<GETTOKEN #g>
	;

<括弧開く #g>
	(
	    "("
	  | "（"
	  | "「"
	  | "『"
	  | "【"
	  | "["
	  | "{"
	  | "'"
	  | '"'
	  | "”"
	)
	<GETTOKEN #g>
	;

<括弧閉じ #g>
	(
	    ")" 
	  | "）"  
	  | "」" 
	  | "』" 
	  | "】" 
	  | "]" 
	  | "}" 
	  | "'"
	  | '"'
	  | "“"
	)
	<GETTOKEN #g>
	;



// 文章構造をリストに変換する処理。print, printfの代替
<lastelement () #e (#e)>
	;
<lastelement () () ()>
	;
<lastelement (#l) #e (#l #e)>
	;
<lastelement (#l1:#l3) #e (#l1:#l2)>
	<lastelement #l3 #e #l2>
	;
	
<pr_el (#lout) () #l2 #new>
	::list <append #lout #l2 (#new)>
	;
<pr_el #lout #l1 #l2 #new>
	::list <append #l3 #l2 (#new)>
	::list <append #lout #l1 (#l3)>
	;


<pr #lout #lin #new>
	<lastelement #l1 #l2 #lin>
	<pr_el #lout #l1 #l2 #new>
	;

<prn #lout #lin #new>
	<pr #lout2 #lin #new>
	::list <append #lout #lout2 (())>
	;
<prn #lout #lin>
	::list <append #lout #lin (())>
	;
	
<plist ()>;

<Prc>
	<setVar plist ()>
	;

<Pr #l>
	<plist #list1>
	<pr #list2 #list1 #l>
	<setVar plist #list2>
	;
<Prn #l>
	<plist #list1>
	<prn #list2 #list1 #l>
	<setVar plist #list2>
	;
<Prn>
	<plist #list1>
	<prn #list2 #list1>
	<setVar plist #list2>
	;

<del_last_nil>
	<plist #list>
	<del_last_nil #l #list>
	<setVar plist #l>
	;

<del_last_nil #l2 #l1>
	<lastelement #l2 () #l1>
	;
<del_last_nil #l1 #l1>
	;

<読み込み>
	{ 
		::sys <getline #x 
			::sys <strdelcntl #y #x> 
			::sys <split #l #y "。">
			<foreach (#i #l)
				(
				   ::sys <syntax #i <NULLLINE>>
				 | 
				   ::sys <syntax ::sys<concat _ (#i "。")> 
					<形態素解析 #o>
					<printlistnl #o>
					<print>
				   >
				)
			>
		>
	};
	
//? <読み込み>;



