2012-02-01から1ヶ月間の記事一覧

leap day

雪は全く大したことないがとても寒い。寒いというより冷たかった。毎四年恒例の2月29日。 そういえばうるう年だった2008年末*1にもうるう秒の挿入*2があったような。 今年予定されているような6月末*3の挿入は久しぶりだけど。 つまり日本時間でも今年は普段…

2月なので雪

雪が西からやってくる。 積雪はともかく寒さ、凍結に注意を。

gvprでの文字列の等価比較

前回のgvprプログラムには、 if (length(cs[i]) == length(c) && index(cs[i], c) == 0) {や if (length(list[i]) == length(action) && index(list[i], action) == 0) {のような条件式がif文中にあるが、この式は二つのstring型が等価かどうかを判断してい…

単純なマーク付けがなされた文字列の解析 #12

#10のプログラムから#11のプログラムへは手動で書き換えた。 試験データでは同様に動いているようだが、本当にちゃんと書き換えられているのだろうか。 というわけで、#10のプログラムから状態遷移表を作成してみて、 #11のアクション関数やtable等と突き合…

単純なマーク付けがなされた文字列の解析 #11

C

二重のswitch文による状態遷移はコンパイラが吐くコードにもよると思うが十分速いものだと思う。 ただ、ソースの記述量が多く、長くなる傾向があり、コンパクトさに欠ける。 状態stateと入力cによる二重のswitch文は二次元のテーブルと等価となる。 そこで、…

単純なマーク付けがなされた文字列の解析 #10

C

前回示した状態遷移図をそのまま素直にコードに落としてみる。 #include <stdio.h> #include <stdarg.h> void eprintf(char const *format, ...); void neprintf(char const *format, ...); void eprintf(char const *format, ...) { va_list ap; fputs("error: ", stderr); va_</stdarg.h></stdio.h>…

単純なマーク付けがなされた文字列の解析 #9

状態遷移図ができたので、これに対応したコードを書こうと思ったのだが、まだ問題があった。 修正した状態遷移図でもやはり#1のBNFで受容されない入力を受容してしまう。 BNFの終端記号<marked-string-body>は一文字以上の文字からなる文字列から還元される。 が、示した状態遷移</marked-string-body>…

記事一覧ページのカテゴリリスト

CSS

記事一覧ページにカテゴリリストを表示するにはどうすればいいのだろうと前から考えていた。 単に、設定→編集設定内のカテゴリリストに表示したい項目を追加するだけでよかったでござる。 リストが並ぶだけではさみしいのでタイトルを付けてみた。 スタイル…

単純なマーク付けがなされた文字列の解析 #8

前回示した状態遷移図は#1のBNFで受容されない入力を受容してしまうのだった。 入力長0の入力に対して#1のBNFはこれを受容しない。 つまり何か一文字は入力されることが受容される入力の必要条件になる。 $ echo -n | ./parser syntax errorのように、今まで…

単純なマーク付けがなされた文字列の解析 #7

構文解析器生成系と字句解析器生成系を使って解析プログラムを作ったわけだが、 解析したいことに比べてどうにも仕掛けが大げさすぎると思う。 保守性や拡張性を考えればこの方法は悪くないと思うがスカルペルでステーキを切っているような感覚が。そこで有…

Lua in MinGW

Lua

最近新しくプログラミング言語を触っていないなあということで、 今年になってLuaのソースをダウンロードしてきてmakeしたりしていた。 プラットフォームがWindowsでもlua-users wikiのBuilding Luaの項目にあるように、 様々なツールチェーンでLuaをビルド…

単純なマーク付けがなされた文字列の解析 #6

bisonはLR項の集合をノードとするGOTOグラフをDOT形式で出力するオプション-gを持っている。 例えば#3のparser.yからGOTOグラフを出力し、そのままdotコマンドで画像化すると結構大きいサイズになる。 GOTOグラフのノードの中にLR項の集合の全要素、つまり属…

単純なマーク付けがなされた文字列の解析 #5

#1と#3で示した二種類の構文規則からyacc/bisonが生成した構文解析器に関して、 yacc/bisonは-vオプションを付けると、 構文規則から導かれるLR項の集合を個々の状態とする、 構文解析に伴う解析器の状態遷移の詳細を得ることができる。 この詳細によれば、#…

strdup関数入りをコンパイル

C

ところで、strdup関数は多くの処理系で用意されており事実上の標準関数といっていいがANSI C標準ではない。 なので、例えば、 $ bison -dy parser.y $ flex lexer.l $ gcc -std=c89 -pedantic -Wall -Wextra -c lex.yy.c lexer.l: In function 'yylex': lexe…

単純なマーク付けがなされた文字列の解析 #4

C

yylexを手書きするのが面倒だと感じたら字句解析器生成系lex/flexの出番となる。 これにはyytextという文字列バッファが最初から付いてくる。 このバッファはflexのデフォルト動作では解析中の字句の長さに合わせて動的に長くなるので便利である。 固定長配…

単純なマーク付けがなされた文字列の解析 #3

C

非終端記号の<string>と<marked-string-body>はその生成規則が全く同じである。 分けて定義しているのは構文規則のレベルで両者を区別できるようにするためだった。 しかし、この二つは字句解析段階で一種類の字句として抽出した方が構文規則がシンプルになっていいという考え方もあるだ</marked-string-body></string>…

単純なマーク付けがなされた文字列の解析 #2

C

既にBNFで書けているわけなので、構文解析器生成系があれば簡単に解析器を自動生成できる。 parser.y %{ #include <stdio.h> int yylex(void); void yyerror(char const *); %} %token CHAR_EXCEPT_PARENTHESIS %% text : string_headed | marked_string_headed ; str</stdio.h>…

単純なマーク付けがなされた文字列の解析 #1

語を括弧で括ってマーク付けした英文を解析することを考える。 例えば、次の例では、 The quick brown (fox) jumps over the lazy (dog).foxとdogがマーク付けされている。 問題をほんの少し厳密にするためにBNFで記述する。 <text> ::= <string-headed> | <marked-string-headed> <string-headed> ::= <string> | <string> <marked-string-headed> <marked-string-headed> ::= <marked-string> | </marked-string></marked-string-headed></marked-string-headed></string></string></string-headed></marked-string-headed></string-headed></text>

今年は土日と祝日の距離が近いような。

インフルエンザが猖獗を極めているので注意注意。

連日寒いけれどもう慣れた。

公開しない関数

C

こんな感じのCソースがあった。本質部分を再構成すると、 foo.h #ifndef FOO_H_INCLUDED #define FOO_H_INCLUDED #ifdef USE_FOO_H_PRIVATE #define PRIVATE static #else #define PRIVATE /##/ #endif void bar(void); PRIVATE void zot(void); #undef PRIV…

コイン投げ #10

C

> 6桁表示なら精度はこのデフォルトで十分だった。 は誤りであることに気付いた。 最終的に必要な桁数が6桁であるからmain関数のmpfr_t型変数pの精度はデフォルトで十分、 というロジックが間違っている。 int prob(mpfr_t p, unsigned int a, unsigned int …

コイン投げ #9

C

Cに移し変えるなら、GMPとMPFRの両ライブラリを使うのがいいと思う*1。 精度に関する心配を減らせる上に便利な関数も用意されている。 #include <stdio.h> #include <gmp.h> #include <mpfr.h> int prob(mpfr_t p, unsigned int a, unsigned int b); int prob(mpfr_t p, unsigned int</mpfr.h></gmp.h></stdio.h>…

コイン投げ #8

現在二種類のアイテムそれぞれの獲得数は18個*1と27個である。 獲得確率が等しいとすれば、獲得数差が7個以内となるような確率は、 であり、これの余事象が起こることが稀であるというほどではまだない。この値を非効率的に求めるにはJavaなら次のようなコー…

ライフゲーム #30

ずいぶん長い間この話題を続けてきたのでこのあたりで一旦休む。さもないといつまでも続けられそうだ。 とりあえず便宜のため散らばっている関連するgvprプログラムをひとまとめにしておく。 以下のコードでは今までの記事のものから変更しているものもある…

ライフゲーム #29

set_gen0.gのはみ出し警告になにやらバグがある気がする。 はみ出さない配置なのに警告が出ることが起こるようだ。 設定動作そのものには影響していないようなのでとりあえずそのままに(え?*1気を取り直して、作成したトーラス面で滑空するGliderを見てみ…

ライフゲーム #28

gen_mesh.gが生成するグラフには端がある。そのため、前回のような現象も起きる。 とはいえ無限の広がりをもったグラフは難しいので、 グラフの上端と下端、右端と左端のノードを繋いでトーラス面にするプログラムを作ってみる。 gen_torus.g BEGIN { if (AR…

ライフゲーム #27

サイズを広めに取っておいて元々動かす気満々だったわけだが、Glider編隊を飛ばしてみよう。 レンダリングパラメータの設定にはvis_alive_2.gを使う。 $ gvpr -f gen_mesh.g -a 30,20 | > gvpr -cf set_gen0.g -a "glider.txt 26,16 glider.txt 21,16 glider…

Firefoxのコンテクストメニューの「要素を調査」を非表示にする

CSS

昨日、セキュリティ関連のウエブページを眺めていて、 31 JanにFirefoxのバージョン10が正式リリースされることを知った。 更新の確認だけを自動で行うようにはしているので特に問題ないのだが、 せっかくの二桁記念なので更新確認ボタンを時々押していた。 …