開発中のソースとドキュメント
開発中のソースコードとドキュメント、メモ類をここから閲覧できます。
なお、コードは以下の理由であまり奇麗ではありません。
- 設計書も何もなしでいきなりコーディングしているから。
- flex と bison については勉強しながら書いているから。
- もともとの SCASM の文法が美しくないから。
実装済みのもの
現時点では、以下のものができています。
- プリプロセッサ (#define/include/macro を展開する)
- 字句解析
- 構文解析
- 解析した文をメモリに保存する
- ユーザ定義関数の展開処理
- ビルトイン関数の実装
- LatRange の処理
- Section 0(VOR/ILS), 1-8(Synthetic), 9(Object), 10(Library), 11(Facility),
12(Anchor), 13(ATIS), 14(NDB), 15(Dynamic), 16(IMO/Landme), 17(Title),
19(Exception) のセクションヘッダの処理
- ラベルの解決
- コードの生成
- SCASM 互換関数の定義マクロのごく一部
- エラー処理
以下のものはまだ実装されていません。
- Section 19(Exception), 20(Airport Facility) のサポート
- SCASM 互換関数の定義マクロ
ソースの解説
いきなりソースだけ見せられてもさっぱりわからないと思うので、
簡単に説明しておきます。
FSC が起動されると、最初にmain() 関数に行きます。
main() 関数は main.cpp にあります。
main() は、ファイルをオープンし、最初にプリプロセッサの
fscpp() 関数を呼び出します。
プリプロセッサでは、#define と Include, Macro の展開処理を行い、
コメント文の削除を行います。
プリプロセッサの本体は fscpp.l にあります。これは flex で書かれています。
プリプロセスが終わると、こんどは字句解析と構文解析を行います。
これは yyparse() 関数を呼び出して行います。
字句解析は fsc.l で、構文解析は fsc.y で実装されています。
それぞれ、flex, bison で書かれています。このファイルを見れば、
字句の定義と文法定義がわかります。
構文解析まで終了したら、文をセクション/LatRange に分割し、
ラベルの解決を行い、コードを吐き出します。この部分はまだできていません。
その他のファイルは補助用のファイルです。内容は大体以下の通り。
(他にもいくつかあります。)
- builtin.cpp : ビルトイン関数の実装
- codehead.cpp : ヘッダ、セクション、LatRange の管理用
- section.cpp : セクション処理
- subsection.cpp : サブセクション(LatRangeなど)の処理
- context.cpp : コンテキスト(主にローカル変数)の管理
- debug.cpp : デバッグ用
- error.cpp : エラー処理
- func.cpp : 関数定義の管理
- gencode.cpp : コード生成部
- label.cpp : ラベルの管理
- node.cpp : ノードの管理
- statement.cpp : 文の管理
- strbuf.cpp : ストリングバッファ
- symbol.cpp : シンボルテーブル
- value.cpp : 値の保存用
- variable.cpp : 変数テーブル
default.fsc は SCASM 互換命令を実現するためのマクロ集です(未完成)。
コンパイルは FreeBSD 上でできます。make するだけです。
ソースコードとドキュメントを見る