プロジェクトの参照設定

C#のプロジェクトの参照設定がよく分からない。ソリューションは以下のような状況になっている。

プロジェクトA
俺ライブラリ側。プロジェクトBや他のアプリなどでも使う(かもしれない)部品群。このプロジェクトの中で、とあるインターフェースX(.NET Framework 3.0以降で提供されているきわめて標準的なもの)を実装したクラスFooを定義している。つまり、プロジェクトAはインターフェースXを含むdllを参照している。
プロジェクトB
アプリ側。このプロジェクト内で、プロジェクトAのクラスFooを使用している。プロジェクトBはプロジェクトAをプロジェクト参照しているが、インターフェースXを含むdllは参照していない。


この状況でビルドすると、

型 'X' が参照されていないアセンブリで定義されています。アセンブリ ほげほげふがふが への参照を追加してください。

ってエラーが出る。なんでプロジェクトBがインターフェースXを含むdllを参照しないといけないの?プロジェクトBを参照してるからそれでいいやん。

日付や時間を表す文字列を受理するオートマトン②

以下のフォーマットを受理するDFAを作った。
Ideone.com - FxXej0 - Online C# Compiler & Debugging Tool

  • yyyy/MM/dd HH:mm:ss.fff
  • yyyy/MM/dd HH:mm:ss
  • yyyy/MM/dd HH:mm
  • yyyy/MM/dd HH
  • yyyy/MM/dd
  • yyyy/MM
  • yy/MM/dd HH:mm:ss.fff
  • yy/MM/dd HH:mm:ss
  • yy/MM/dd HH:mm
  • yy/MM/dd HH
  • yy/MM/dd
  • MM/dd HH:mm:ss.fff
  • MM/dd HH:mm:ss
  • MM/dd HH:mm
  • MM/dd HH
  • MM/dd
  • HH:mm:ss.fff
  • HH:mm:ss
  • HH:mm
  • mm:ss.fff

受理するかどうか確かめると同時に、どのパターンか判断する方法は無いかな...。
ただし、MM/ddとmm:ssは、それぞれyy/MMとHH:mmと区別できないから、yy/MMとHH:mmとして扱うことにした。

日付や時間を表す文字列を受理するオートマトン①

日付や時間に関する型も用意して、オートマトンでチェックしたい。受理したい形式は以下。

  • yyyy/MM/dd HH:mm:ss.fff
  • yyyy/MM/dd HH:mm:ss
  • yyyy/MM/dd HH:mm
  • yyyy/MM/dd HH
  • HH:mm:ss.fff
  • HH:mm:ss
  • HH:mm
  • mm:ss.fff
  • mm:ss
  • ss.fff

時刻部分はAM/PM表記も許したいな。例えば"01:23 AM"や"01:23:45 PM"とか。
このままだと、HH:mmとmm:ssを区別できないし、ss.fffと実数も区別できない。

整数、実数の時と同じようにDFAC#で実装したい。

実数を表す文字列を受理するオートマトン③

先日εNFAをNFAに変換した。
今度はこのNFAをDFAに変換したい。これをやるのが「部分集合構成法」というものらしい。以下にDFAの状態遷移表を作っていく。
NFAの初期状態はS_{0}のみなので、初期状態の集合は\{S_{0}\}となる。そして、初期状態の集合から遷移する可能性のある状態をまとめて遷移先の状態と考える。こんな感じ。

状態 X Y Z .
\{S_{0}\} \{S_{1}\} \{S_{2},S_{3},S_{5},S_{13},S_{19}\} \{S_{9}\}
続きを読む

実数を表す文字列を受理するオートマトン②

自分の理解力の無さから、参考にしようとしていたサイトの説明では行き詰ってしまった。なのでオートマトンの教科書を読んでみた。
ε動作ありのNFAから、ε動作なしのNFAへの変換のやり方が書いてあったので、やってみた。
まず\epsilon-Cl(S_{i})(ε閉包というらしい)というものを定義してみる。これは状態S_{i}からε動作だけで到達できる状態の集合(ただしS_{i}自身の含む)を表す。

続きを読む