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

マーク付けに使う文字の変更 #3

C

複数の種類のメタ文字を同じ文字に指定すると、 int yylex(void) ...snip if (c == start_mark_char) return START_MARK; if (c == end_mark_char) return END_MARK; if (c == start_annotation_char) { ...snip return START_ANNOTATION; } なので、START_M…

マーク付けに使う文字の変更 #2

C

構文規則を元にyacc/bison用ソースを書いてみた。 parser.y %{ #define YYSTYPE char* #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> int yylex(void); void yyerror(char const *); static char *estrdupcat(const char *s1, const char *s2); static char *est</string.h></unistd.h></stdlib.h></stdio.h>…

マーク付けに使う文字の変更 #1

マークの開始、注釈の開始、マークの終了の意味をそれぞれ"("、":"、")"に持たせてきた。 これらの特別な意味をもった文字(メタ文字)の割り当てを解析時に動的に変更したい。 この変更は実行時に与えるコマンドラインオプションで行うことにする。問題はど…

GTK+ 3.4.0 released

オフィシャルのMLより。> * This is the first version of GTK+ 3 that works > well on Windows. Official builds of GTK+ 3.4.0 for > Windows are expected in the near futureやっとGTK+3のWindows用の公式ビルドが近々出るようだ。 GTK+3.0がリリースさ…

最近多い気が

ここのところ多い、また大きめ余震。 こんな一周年は要らないなあ。 少なくとも数年間は仕方ないのかも。

寒い

風が強くて体感温度的に寒かった。 霜注意報が出てるので明日の朝も寒そうだ。

注釈付きでマークされた文字列の解析 #15

C

受容する文字列パターンの範囲を広げてみる。つまり、マークされていない文字列、すなわち<string>において、 右括弧")"にはマークを終了するための特別な意味を持たせる必要はない。 そのため、<string>を構成する文字として扱っても、 今まで受容してきた文字列パターンは</string></string>…

注釈付きでマークされた文字列の解析 #14

C

エラー処理規則の抜けについて簡単にチェックできる方法がある。 例えば、 test.l %% [a-z]+ [^a-z]* $ flex test.l $ だが、 %% [a-z]+ [^a-z]* . $ flex test.l test.l:4: warning, rule cannot be matchedのようにflexが警告を出す。 パターン[a-z]+と[^a…

注釈付きでマークされた文字列の解析 #13

C

前回、文字単位の入力で状態遷移する際のアクションにより解析を行う有限状態機械をflexで実装した。 今度は、文字単位よりももっと大きな塊を抽出するパターンを使って字句解析器を作ってみる。 %{ #include <stdio.h> #include <string.h> #ifdef __STRICT_ANSI__ int fileno(</string.h></stdio.h>…

注釈付きでマークされた文字列の解析 #12

C

さて、作成した状態遷移図を基に有限状態機械の実装をする。 手書きで直接Cによる実装をするなら、 状態と入力文字を対のキーとして二重switch文か二次元テーブルでアクションを呼ぶのが手軽だろう。 しかし、対のキーそのものとそれに対応するアクションと…

注釈付きでマークされた文字列の解析 #11

構文解析器生成系を使用せず、文字単位の入力で状態遷移する有限状態機械を作成して解析してみる。 まずは状態遷移図を作ってみる。 ベースにした注釈無しのマーク付け文字列の解析で考察した状態遷移図と同様に、 ノードラベルが状態の名前、エッジラベルが…

Firefox11の画像だけの表示を行った時の表示形式を以前に戻してみる

CSS

昨日のやり方は直接的で正しく効果が発揮されるのだけれど、 如何せん、実現方法に手間がちょっとかかったり、運用面で問題があったりと、あまり良いものではないと思う。 しばらくこれで使ってみるとは言ったもののやっぱり気になったので、もう少し考えて…

Firefox11に無体な変更を施して画像だけの表示形式を以前に戻してみる

CSS

Firefox11になってユーザインタフェイスが変えられ、 画像だけを表示した際に中央表示されたうえに周辺部分が黒色になってしまったわけだが、 Firefox11がリリースされた日の辺りで述べたような方法がうまく通るか試みてみた。以下ではWindowsのcmd上でJDK*1…

時刻と時間

宇宙からの情報では古くないが地上ではやっぱり古い話題。(謎 「ここでの休憩時間は20分間です」や「出発は20分後です」などは拙い伝え方だ。 休憩時間が20分間であるのは伝えた瞬間だけだからだ。 その時点で時刻に変換してそれを基準に行動するか、 体内…

週末近辺でよく雨が降るような気が。 春が近づいている雨というよりも気温が上がらず冬の雨の感じ。

まだまだ余震

二日遅い話題。 一年前の本震を含め地震の揺れそのものに恐怖を感じたことは無いけれど、 ライフラインが止まったり土水が噴き出したりしたらというのが怖い。 住居は古い土地に建ってるので案外頑丈でその手の被害は全くなかったけれど。。 まだ一年しか経…

注釈付きでマークされた文字列の解析 #10

C

書いたBNFを元に構文解析器と字句解析器のソースを書いてみる。 まず、構文解析器。 parser.y %{ #define YYSTYPE char* #include <stdio.h> #include <stdlib.h> #include <string.h> int yylex(void); void yyerror(char const *); static char *estrdupcat(const char *s1, const char </string.h></stdlib.h></stdio.h>…

Firefox11の画像単独表示で黒枠センタリングされたりする

CSS

なぜデフォルトのユーザインタフェイスをころころ変える? リリースされたFirefox11では画像のみを表示させるとセンタリングされた上に周囲のマージンが黒系で塗り潰される。 今までと全く違う表示に異常な違和感がありまくりだ。 一次的なインタフェイスの…

注釈付きでマークされた文字列の解析 #9

colon_forbiddenによるモードの導入によって、 構文規則を実装するソースが少々ややこしくなって見づらい。 コロンを含んでよいか否かの情報を構文解析系から字句解析系へ渡さなければならなくなった原因は、 字句解析系に二種類の文字列を表す終端記号を要…

注釈付きでマークされた文字列の解析 #8

C

承前。というわけで、構文解析系と字句解析系の両方でアクセス可能な変数を一個定義し、 この変数で文字列にコロンが入ることを禁じるか否かのモードを表すものとして、 このモード変更の仕組みを構文解析の生成規則の途中にアクションとして記述する方法を…

注釈付きでマークされた文字列の解析 #7

生成規則が書けたので後は実際のコードを書いてみるだけだったのだが、大きな問題があった。 終端記号<string-except-special>と<string-except-parenthesis>は字句解析器から供給することになる。 ところが、字句解析器では与えられた入力に含まれる部分文字列をどちらの記号として返せばいいか分からないのだ</string-except-parenthesis></string-except-special>…

注釈付きでマークされた文字列の解析 #6

注釈無しのマーク付けの記事からすると、今度は、構文解析器に一文字ずつ処理させる代わりに、 <string>、<marked-string-body>、<annotation>を一塊の文字列として字句解析系から受け取るように変更する流れだろう。 括弧とコロンを含まない文字列を表す終端記号を<string-except-special>、 括弧を含まない文字列を表す終端</string-except-special></annotation></marked-string-body></string>…

注釈付きでマークされた文字列の解析 #5

C

そんな瑣末なことよりもyylexがif文の塊になりつつあることこそ気にするべきと気付いた。 ...snip %token CHAR_EXCEPT_SPECIAL ...snip char_except_parenthesis : CHAR_EXCEPT_SPECIAL | ':' ; marked_string_body_with_annotation : marked_string_body | …

注釈付きでマークされた文字列の解析 #4

C

コロンをリテラル文字トークンでなく普通のトークンCOLONとでも宣言してやれば違和感が減るかもと思い、 ...snip %token CHAR_EXCEPT_SPECIAL COLON ...snip char_except_parenthesis : CHAR_EXCEPT_SPECIAL | COLON ; marked_string_body_with_annotation :…

注釈付きでマークされた文字列の解析 #3

C

リテラル文字トークン':'を非終端記号char_except_parenthesisに還元するときに、 わざわざアクション$$ = ':';を実行しないといけないのは何となく無駄な感じがするかもしれない。 トークンの種類を定めるトークン値とトークンの持つ意味を定める意味値は異…

注釈付きでマークされた文字列の解析 #2

C

前回BNFで示した構文生成規則はこれまでの構文の定義と似ているため、 これを基にして構文解析器生成系のソースを書くとやっぱり似ることになる。というかほとんど同じだ。 parser.y %{ #include <stdio.h> int yylex(void); void yyerror(char const *); %} %token C</stdio.h>…

注釈付きでマークされた文字列の解析 #1

さて、少しだけ複雑にする。 括弧で括ってマーク付けした語に簡単な注釈を加えた英文を解析することを考える。 例えば、次の例では、 The (quick: swift) brown (fox) jumps over the (lazy: one of three virtues of a programmer) (dog).括弧で括られたqui…

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

C

二つの開始状態INITIALとSUCCESSIONの同一パターンに対するアクションにはあまり差がない。 特にエラー処理に関しては空入力に関する一つを除き両者で共通である。 そこで、もう少しまとまらないか考えてみる。 ...snip %% [^()]+ { printf("string [%s]\n",…

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

C

前回まではflex用のソースに状態遷移表をそのままに記述することで解析器を作っていた。 しかし、わざわざ人間が状態遷移表まで考えた上でそれを明示的に記述するなど、 せっかくの解析器自動生成系がもったいなさすぎで泣いている。 もう少し自然に素直に書…

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

C

前回示したflex用コードと#10や#11の有限状態機械のC実装とは表現の違いに過ぎないと述べたが、 生成されるプログラムの動作は変えないようにflex用コードの規則部を以下のように変更するとさらによく分かると思う。 ...snip %% BEGIN(start); <start>[^()] { print</start>…