皆さんActiveBasicでプログラム言語作ったことありますか?
最近、ActiveBasicでプログラム言語を作っています。
インタプリタ言語です。
たいした機能をつける気はないですが、
作った方は、ぜひ、教えてください。
プログラム言語
作った事ありますよ。インタプリンタなら。
ただ、計算式の分岐が相当な量で、2項式までを処理するだけでも書くのが一苦労。
言語名は、開発名がA言語。
個性仕様は、一応変数名や変数型の別名なんかに日本語を使えるっていうだけです。
ASCIIの文字コードがギュウギュウ詰めに作ってあるので、全角文字か半角文字かを判断するだけでかなり骨が折れましたが。だからと言ってUnicodeの中で判定が易しいUTF-8っていうコードを使おうとしたら今度はBasicPromptが対応できずに落ちたりと。
今はコンパイラ作ってます。関数も作れない、配列も扱えない、ヘナチョコですが。
ただ、計算式の分岐が相当な量で、2項式までを処理するだけでも書くのが一苦労。
言語名は、開発名がA言語。
個性仕様は、一応変数名や変数型の別名なんかに日本語を使えるっていうだけです。
ASCIIの文字コードがギュウギュウ詰めに作ってあるので、全角文字か半角文字かを判断するだけでかなり骨が折れましたが。だからと言ってUnicodeの中で判定が易しいUTF-8っていうコードを使おうとしたら今度はBasicPromptが対応できずに落ちたりと。
今はコンパイラ作ってます。関数も作れない、配列も扱えない、ヘナチョコですが。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
コンパイラならば作ったことあります。インタプリタはないですが。
最初はコンパイラ・インタプリタどちらにするか悩んだのですが、インタプリタは言語翻訳機関とプログラム実行機関の2つを備えないといけないので面倒なことと、JavaVM (Java プログラムのインタプリタみたいなもの)について調査したときに色々と躓いてなかなか前進できなかった経験があるので、結局コンパイラにしました。
とりあえず形にはなったので、現在様々な言語仕様を検討し、より良い言語を目指している段階です。
可能ならいずれインタプリタの制作にも挑戦したいものです。
それで、「是非教えてください」と言われましても、この分野は深く広い学問体系になっているので、漠然としていてなにから取り組めばよいのやら…
とりあえず今回は処理のおおまかな流れについてお話しさせてください。
1.ソースファイルを先頭から1字ずつ読んで、それがどんな文字なのか(アルファベット / 数字 / 記号 / 日本語, etc...)を解析して、この情報を基に、個々の文字を単語レベルに結合します。
たとえばC言語のソースでは ならば こんな感じです。
この段階で、その単語(本当は字句またはトークンといいます)が識別子か予約語なのか、または演算子やその他の記号なのかを検査しておきます。
このフェイズを字句解析と言います。
2.1で得られた字句の並び方がプログラミング言語の構文として正しいかを解析します。
開括弧と閉括弧がちゃんと一致しているか、などの検査もこの段階で行います。
ソースの基本的な構文エラーはここで検出することになります。
この構文解析器の設計は、プログラミング言語の構文設計と密接に繋がっています。
プログラミング言語の構文を考えることは、ここの構造を考えることに等しいと言えるでしょう。
このフェイズを構文解析と言います。
3.ソースが言語構文のとおりだと確認できたら、こんどはこのソースがどういう動作を期待しているのかについて解析します。
たとえば、別の板で質問されていた逆ポーランド解析も主にこの段階で活躍します。
このフェイズを意味解析と言います。
また 2 と 3 のフェイズは強力に連携し合わなければならないので、設計を簡略化するために、これらを合わせて一つのフェイズとみなすこともあるそうです。
4.インタープリタならこの処理を即時実行して、1~3を繰り返すことになります。
コンパイラならさらに必ずしも必要ではない様々な処理(最適化処理など)を行って、オブジェクトファイルを出力します。
このような具合です。最初から一度にこれらすべてを設計してプログラムを組み上げるのは大変な作業ですから、まずは「2 + 3」が計算できるような簡単な計算機、次いで逆ポーランド電卓、(逆ポーランドではなく)普通の計算式を処理できる電卓、if などの条件分岐やループしか持たない簡単なインタプリタなどを作って、徐々にステップアップしながら同時にインタプリタを拡張していく方法をお勧めします。
最初はコンパイラ・インタプリタどちらにするか悩んだのですが、インタプリタは言語翻訳機関とプログラム実行機関の2つを備えないといけないので面倒なことと、JavaVM (Java プログラムのインタプリタみたいなもの)について調査したときに色々と躓いてなかなか前進できなかった経験があるので、結局コンパイラにしました。
とりあえず形にはなったので、現在様々な言語仕様を検討し、より良い言語を目指している段階です。
可能ならいずれインタプリタの制作にも挑戦したいものです。
それで、「是非教えてください」と言われましても、この分野は深く広い学問体系になっているので、漠然としていてなにから取り組めばよいのやら…
とりあえず今回は処理のおおまかな流れについてお話しさせてください。
1.ソースファイルを先頭から1字ずつ読んで、それがどんな文字なのか(アルファベット / 数字 / 記号 / 日本語, etc...)を解析して、この情報を基に、個々の文字を単語レベルに結合します。
たとえばC言語のソースでは
コード: 全て選択
if (i == 0) baz = foo + bar;
コード: 全て選択
if 予約語
( 括弧(開)
i 識別子
== 演算子
0 数値
) 括弧(閉)
baz 識別子
= 演算子
foo 識別子
+ 演算子
bar 識別子
; 終端文字
この段階で、その単語(本当は字句またはトークンといいます)が識別子か予約語なのか、または演算子やその他の記号なのかを検査しておきます。
このフェイズを字句解析と言います。
2.1で得られた字句の並び方がプログラミング言語の構文として正しいかを解析します。
開括弧と閉括弧がちゃんと一致しているか、などの検査もこの段階で行います。
ソースの基本的な構文エラーはここで検出することになります。
この構文解析器の設計は、プログラミング言語の構文設計と密接に繋がっています。
プログラミング言語の構文を考えることは、ここの構造を考えることに等しいと言えるでしょう。
このフェイズを構文解析と言います。
3.ソースが言語構文のとおりだと確認できたら、こんどはこのソースがどういう動作を期待しているのかについて解析します。
たとえば、別の板で質問されていた逆ポーランド解析も主にこの段階で活躍します。
このフェイズを意味解析と言います。
また 2 と 3 のフェイズは強力に連携し合わなければならないので、設計を簡略化するために、これらを合わせて一つのフェイズとみなすこともあるそうです。
4.インタープリタならこの処理を即時実行して、1~3を繰り返すことになります。
コンパイラならさらに必ずしも必要ではない様々な処理(最適化処理など)を行って、オブジェクトファイルを出力します。
このような具合です。最初から一度にこれらすべてを設計してプログラムを組み上げるのは大変な作業ですから、まずは「2 + 3」が計算できるような簡単な計算機、次いで逆ポーランド電卓、(逆ポーランドではなく)普通の計算式を処理できる電卓、if などの条件分岐やループしか持たない簡単なインタプリタなどを作って、徐々にステップアップしながら同時にインタプリタを拡張していく方法をお勧めします。
http://www.activebasic.com/forum/viewto ... highlight=
インタプリタ-とまで呼べるかどうか分からないけどそれらしきものがあります。
というか、YACCとかLEXとか使えばコンパイラやインタプリタなんて1時間未満で作れるんですけどね。(ただしC言語)
YACCとLEXを組み合わせれば元のソースコードは10行から20行くらいです。(ぶち簡略化して)
それをCのソースにすれば数千行になります。
ABのソースにしてもかなりの量になるでしょう。
だれかAB用のLEXとYACCつくって~~。無理か?
インタプリタ-とまで呼べるかどうか分からないけどそれらしきものがあります。
というか、YACCとかLEXとか使えばコンパイラやインタプリタなんて1時間未満で作れるんですけどね。(ただしC言語)
YACCとLEXを組み合わせれば元のソースコードは10行から20行くらいです。(ぶち簡略化して)
それをCのソースにすれば数千行になります。
ABのソースにしてもかなりの量になるでしょう。
だれかAB用のLEXとYACCつくって~~。無理か?
今日も元気にABLife
>インタプリタ-とまで呼べるかどうか分からないけどそれらしきものがあります。
>というか、YACCとかLEXとか使えばコンパイラやインタプリタなんて1時間未
>満で作れるんですけどね。(ただしC言語)
>YACCとLEXを組み合わせれば元のソースコードは10行から20行くらいです。(ぶち簡略化して)
>それをCのソースにすれば数千行になります。
>ABのソースにしてもかなりの量になるでしょう。
YACCとかは知らないんですけど、、、
ABでインタプリタを使ったらメインプログラムは1300行になりました。
(変数・文字列などのプログラムを除けば。)
>というか、YACCとかLEXとか使えばコンパイラやインタプリタなんて1時間未
>満で作れるんですけどね。(ただしC言語)
>YACCとLEXを組み合わせれば元のソースコードは10行から20行くらいです。(ぶち簡略化して)
>それをCのソースにすれば数千行になります。
>ABのソースにしてもかなりの量になるでしょう。
YACCとかは知らないんですけど、、、
ABでインタプリタを使ったらメインプログラムは1300行になりました。
(変数・文字列などのプログラムを除けば。)
最後に編集したユーザー MML [ 2010年7月21日(水) 02:15 ], 累計 1 回
そんなに短い行数でかけるんですか?インタプリンタって。
僕は仕様が複雑だったのもあって1万行を軽く超えてしまいましたが^^;
僕は仕様が複雑だったのもあって1万行を軽く超えてしまいましたが^^;
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。