最近の更新 (Recent Changes)

2014-01-01
2013-01-04
2012-12-22
2012-12-15
2012-12-09

Wikiガイド(Guide)

サイドバー (Side Bar)


← 前のページに戻る

3.1 ソース全体

以下に日本語プログラミング言語「紫」のソース全体を示します。

デカルト言語で書かれた、たったの329ステップのプログラムで実現されています。

同じものは、デカルト言語の配布パッケージのexample/murasaki/murasakiに入っています。


/*
 * 	日本語プログラミング言語「紫」	ver.0.1
 *		copyright (c) 2011 Hideyuki Niwa
 *
 */

/*** サブルーチン ***/
<checkword #word>
	::sys <char #l #word>
	::sys <isUnknown ::sys <member "、" #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 "行目 *** ERROR *** " #msg "↓" >
	<warn>
	<warn #str>
	<exit>
	;

/*
 * 構文解析部分 
 */

<アンド文 (#x1 : #x2)>
	<* #x1> と ["、"|","] <check #x1>
	<アンド文 #x2> 
	;
<アンド文 (#x1)>
	<* #x1> 
	;

<単文 let #y>
	<* #y> を  ["、"|","] <check #y>
		計算
	;

<単文 compare #y>
	<* #y> を  ["、"|","] <check #y>
		比較
	;

<単文 compare #y>
	<* #y> が  ["、"|","] <check #y>
		成立
	;

<単文 M1 #x #y #z>
	<* #y> (は | が)  ["、"|","] <check #y>
		<アンド文 #z> (が | を)  ["、"|","] <check #z>
		<* #x> <check #x>
	;

<単文 M2 #x #y #z>
	<* #y> (は | が)  ["、"|","] <check #y>
		<アンド文 #z> の ["、"|","] <check #z>
		<* #x> <check #x>
	;

<単文 M3 #x #y #z>
	<* #y> (は | が)  ["、"|","] <check #y>
		<アンド文 #z>  に  ["、"|","] <check #z>
		<* #x> <check #x>
	;

<単文 M4 #x #y ()>
	<* #y>  (は | が ) ["、"|","] <check #y>
		<* #x> <check #x>
	; 

<単文 M5 #x #y ()>
	<* #y>  (を|に|の) ["、"|","] <check #y>
		<* #x> <check #x>
	; 

<単文末 #flag>
	(
	   (であるすべて | すべて)    ("。" | "?" | "?")
	   <is #flag 疑問すべて>
	 |
	   (ですか|か|であるか|するか|したか|しますか)  ("。" | "?" | "?")
	   <is #flag 疑問>
	 |
	   (してください | して下さい | して | しろ | せよ)  "。"
	   <is #flag 命令>
	 |
	    (です|だ|である|する|した|します)  "。"
	    <is #flag 宣言>
	 |
	    "。"
	    <is #flag 宣言>
	 )
	;

<複文 #andxyz>
	    <単文 :#xyz>
	    (
	      (である場合 | であれば | であるとき | の場合 | のとき | するならば | ならば
			| するとき | したとき | する場合 | した場合) ["、"|","]
		<is #andxyz (#xyz)>
	     |
	      (であるかつ | であり | でかつ | するかつ | かつ | したかつ 
		| し | で)  ["、"|","]
		<複文 #andxyz2>
		<is #andxyz (#xyz : #andxyz2)>
	    )
	;

<定義文 #xyz #flag>
	<単文 :#Mxyz1>
	(
	   (である場合 | であれば | であるとき | の場合 | のとき | するならば | ならば 
			| するとき | したとき | する場合 | した場合) ["、"|","]
	   <単文 :#Mxyz2> 
	   <単文末 #flag>
	   <is #xyz (#Mxyz2 #Mxyz1)>
	 |
	   <単文末 #flag>
	   <is #xyz (#Mxyz1)>
	 |
	   (であるかつ | であり | でかつ | するかつ | かつ | したかつ 
		| し | で)  ["、"|","]
	   <複文 #andxyz>
	   <単文 :#Mxyz2> 
	   <単文末 #flag>
	   <is #xyz (#Mxyz2 #Mxyz1 : #andxyz)>
	)
	;


/*
 * 解析結果のデカルトプログラムをファイルに出力
 */
<定義文プリント #out>
	::sys <mkpredlist #outprd #out>
	<printlist <quote #outprd>>
	<printf <\_t> ";" <\_n>>
	;
<回答プリント (#out1 :#out)>
	::sys <append #o #out (#out1)>
	::sys <mkpredlist #outprd #o>
	<printf "? " >
	<printf "<回答 " >
	<printf <quote #outprd>>
	<printf ">;" <\_n>>
	;
<回答すべてプリント (#out1 :#out)>
	::sys <append #o #out (#out1)>
	::sys <mkpredlist #outprd #o>
	<printf "? " >
	<printf "<回答すべて ">
	<printf <quote #outprd>>
	<printf ">;" <\_n>>
	;

/*** 実行結果の出力 ***/
<回答アンド (#y1 :#y)>
	<printf #y1>
	<回答アンド2 #y>
	;
<回答アンド2 (#y1 :#y)>
	<printf "と" #y1>
	<回答アンド2 #y>
	;
<回答アンド2 ()>
	;

<回答単文 (M0 数式 #z #y)>
	<printf #z "は、数式">
	;

<回答単文 (M1 #x #z #y)>
	<printf #z "は、">
	<回答アンド #y>
	<printf "を" #x >
	;

<回答単文 (M2 #x #z #y)>
	<printf #z "は、">
	<回答アンド #y>
	<printf "の" #x >
	;

<回答単文 (M3 #x #z #y)>
	<printf #z "は、">
	<回答アンド #y>
	<printf "に" #x >
	;
<回答単文 (M4 #x #z #y)>
	<printf #z "は、">
	<printf #x >
	;
<回答単文 (M5 #x #z #y)>
	<printf #z "を">
	<printf #x >
	;

<回答文 ((#M #x #z #y) : #out)>
	<回答単文 (#M #x #z #y)>
	(  <is #out ()> <print "です。">
	 | <is #out ((#M2 #x2 #z2 #y2))> <printf "である場合、"> <回答文 #out>
	 | <printf "であり、"> <回答文 #out>)
	;

<不明文 ((#M #x #z #y) : #out)>
	<回答単文 (#M #x #z #y)>
	(  <is #out ()> <print "ではありません。">
	 | <is #out ((#M2 #x2 #z2 #y2))> <printf "である場合、"> <不明文 #out>
	 | <printf "であり、"> <不明文 #out>)
	;


<回答 #outprd2>
	(
	  <timeout 10000000 #outprd2>
	  <回答文 #outprd2>
	| <不明文 #outprd2>
	)
	;

<回答すべて #outprd2>
	(
	 <timeout 10000000 
	   <findall
	    #outprd2
	    <回答文 #outprd2>
	  >
	 >
	| <不明文 #outprd2>
	)
	;


/*
 * 入力ファイルから文を一つ切り出す 
 */
<コメント>
	"//" <SKIPCR>
	;

<文読み込み ()>
	<コメント>
	;

<文読み込み #l>
	<TOKEN #l <* #x> ("。" | "?" | "?" | EOF)>
	;

<行番号設定>
	<SKIPSPACE>
	::sys <line #ln>
	<setVar LineNo #ln>
	;

/*
 * メイン処理
 */
<読み込み>
	{ 
		<行番号設定>
		<文読み込み #in> 
		<setVar InputStr #in>
		::sys <strdelcntl #i #in>
		(
		   <is #i ()>
		 |
		   ::sys <syntax #i <NULLLINE>>
		 | 
		   ::sys <syntax #i
			 (  <定義文 #out #flag> 
			    ::sys <switch #flag
				宣言    <定義文プリント #out>
				疑問 (
					<printf "? <printf '" #i "' <\_n>>; " <\_n>>
					<回答プリント #out> 
					<print "? <print>;">)
				命令 (
					<printf "? <printf '" #i "' <\_n>>; " <\_n>>
					<回答プリント #out> 
					<print "? <print>;">)
				疑問すべて (
					<printf "? <printf '" #i "' <\_n>>; " <\_n>>
					<回答すべてプリント #out> 
					<print "? <print>;">)
			    >
			    [::sys <isUndefVar #out> 
				<errormsg "構文が解釈できません。"> ]
			 | <errormsg "構文に誤りがあります。">
			 )
		   > 
		)
		::sys <flush>
	}
	;


<組み込み>
	<printf
		"<M4 リスト #x ()> ::sys <isList #x>;" <\_n>
		"<M5 表示 改行 ()> <print>;" <\_n>
		"<M5 表示 #x ()> <print #x>;" <\_n>
	>
	;

<起動>
	::sys <PrintResultOff>
	::sys <args #args> <is #args (_ #prg :_)>
	::sys <openr #prg 
		::sys <openw "tempfile.txt" 
			<組み込み>
			<読み込み>>>
	<load "tempfile.txt">;
	;

? <起動>;


--

--