先日も書きましたが、ニュース系の機能に関してはあまり重点を置いていないので、FANTASY Bookmark さんには変わらず頑張っていただきたいのです……。むしろ、www.lightnovels.net は FANTASY Bookmark さんにスペースを全部お渡しして、books.lightnovels.net あたりで書評管理関係をこっそり動かさせてもらうというのでも僕は全然構わなかったりしますので(^^;
*.lightnovels.net でいろんな人がライトノベル関係のサイトを立ちあげて、全体としてライトノベル総合サイト、なんていう形でもいいのかなぁ、とか。
お互いシェア(?)を食い合うような形ではなくて、少しずつ機能分担して相乗効果が出てくるような形がベストだと思っています。
■ ハンドル名に関しては些細なことですのでお気になさらないで下さい〜。僕もコスプレ写真を撮られているMASSさんという方がいると知らなければこだわらなかったでしょうし(^^;ちなみに、完全に面識のない赤の他人の方デス(汗)
同様にmasさんという方もいらっしゃったり。こちらは声優ファンの方のようです。……みんな似たもの同士?(爆)
■ 話は変わりますが、3Mbps も出ているんですか……うらやましいです(><)<1.5Mくらいの人
諸般の事情で FreeBSD なレンタルサーバに ports/lang/mono をインストールしてみる。いや jay の C# バージョンが欲しかっただけなのですが(汗)
しかし、jay は mono のコンパイルの前段階に一瞬使われるだけでインストールはされないため、ports から入れてもまったく無意味なのでした……
ところで、mono の C# コンパイラって C# コンパイラがインストールされていないと make できないようなのですが……。ええっと、鶏と卵?(汗)ports からはちゃんとインストールできたということは、どこかにちゃんと C 版も転がっているのだとは思うのですけど。
gcc が xgcc をまず作るみたいなことをしているのでしょうか……
jay というのはもともと Java を吐く yacc(構文解析ルーチン自動生成ソフト)なのですが、mono プロジェクトが(自分のC#コンパイラで使うために) C# も吐けるように手を入れました。C#コンパイラのソースと一緒に混じっています。単体での配布は発見できませんでしたので、C# コンパイラの tar 玉を開いて jay 以下で make してください。
jay -c filename.jay < skeleton.cs > filename.cs
という感じで使います。
yacc を書くのは久しぶりですが、C# は型の概念が明確なのと、メモリ管理を気にしないで良いので、yacc もとても書きやすいですね。素晴らしい。
ここに載っている jay ファイルを参考に簡単な電卓プログラムを作ってみました。せっかくなので参考までに載せておきます。
%{ using System; namespace Test { public class JayTestParser { %} %token <String> Number %type <int> line, sum, product, term %% line : sum // $$ = $1 | /* null */ { $$ = 0; } sum : product // $$ = $1 | sum '+' product { $$ = $1 + $3; } | sum '-' product { $$ = $1 - $3; } product : term // $$ = $1 | product '*' term { $$ = $1 * $3; } | product '/' term { $$ = $1 / $3; } | product '%' term { $$ = $1 % $3; } term : '+' term { $$ = $2; } | '-' term { $$ = - $2; } | '(' sum ')' { $$ = $2; } | Number { $$ = Int32.Parse($1); } %% } // end of class JayTestParser
また、この Parser を呼び出す本体のコードです。スペース区切りで lex しているところは適宜各人で置き変えてください。
using System; namespace Test { public class JayTest { public static void Main() { string s = System.Console.ReadLine(); JayTestLexer lexer = new JayTestLexer(s); JayTestParser parser = new JayTestParser(); int result = (int)parser.yyparse(lexer); System.Console.WriteLine(result); } } public class JayTestLexer : yyParser.yyInput { string[] ts; int pos = -1; public JayTestLexer(string s) { ts = s.Split(' '); } public bool advance() { if ( pos+1 >= ts.Length ) { return false; } else { pos++; return true; } } public int token() { try { Int32.Parse(ts[pos]); return Token.Number; } catch { return (int)ts[pos][0]; } } public Object value() { return ts[pos]; } } }