| descartes-src (ソースパッケージ descartes-src-0.26.0.tar.gz) | 2012-09-09 20:57 |
| descartes-win (Windows用バイナリパッケージ descartes-win-0.26.0.zip) | 2012-09-09 20:52 |
| 会話キャラクター: ツンデレ アプリケーション (会話キャラ:ツンデレ v1.0 for Windows) | 2010-04-29 13:41 |
| 会話キャラクター: 2人の女の子 ダブルキャラクター (会話キャラクター 2人の女の子 ダブルキャラクター 1.0 for Windows) | 2011-10-02 22:23 |
| 会話キャラクター: Eliza風英語版 (会話キャラ:Eliza風英語版 v1.0 for Windows) | 2010-05-11 01:06 |
| 会話キャラクター: 猫耳メイド アプリケーション (会話キャラ:猫耳メイド v1.0 for Windows) | 2010-04-27 21:15 |
| 会話キャラクター: イライザ風日本語版 (会話キャラ:イライザ風日本語版 v1.0 for Windows) | 2010-04-30 21:53 |
| 経済指標表示プログラム for Windows (経済指標表示プログラム V1.0) | 2011-08-18 22:04 |
| ニュースヘッドライン表示プログラム (ニュースヘッドライン表示プログラム V1.0 for Windows) | 2011-08-16 12:31 |
| デカルト言語 example (デカルト言語の例題 example-0.7.0.zip) | 2009-03-01 19:47 |
| 電力状況表示プログラム for Windows (2011年夏版 全国電力供給状況表示プログラム V1.0) | 2011-08-15 13:25 |
以下に日本語プログラミング言語「紫」のソース全体を示します。
デカルト言語で書かれた、たったの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">;
;
? <起動>;
--
--
[PageInfo]
LastUpdate: 2011-09-07 02:40:39, ModifiedBy: hniwa
[License]
Creative Commons 2.1 Attribution
[Permissions]
view:all, edit:login users, delete/config:login users