ヘッダーファイルの整理
[YACASL2.git] / include / assemble.h
index 15d314c..3ab7a86 100644 (file)
-#ifndef YACASL2_ASSEMBLE_INCLUDED
-#define YACASL2_ASSEMBLE_INCLUDED
+#ifndef YACASL2_ASSEMBLE_H_INCLUDED
+#define YACASL2_ASSEMBLE_H_INCLUDED
 
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #include <stdbool.h>
+#include <ctype.h>
+#include <assert.h>
+#include <errno.h>
+#include "cerr.h"
 #include "struct.h"
-#include "word.h"
+#include "token.h"
 
 /**
- * CASL IIの仕様
- */
-enum {
-    LABELSIZE = 8,         /** ラベルの最大文字数 */
-    OPDSIZE = 40,          /** オペラントの最大数。CASL IIシミュレータの制限 */
-};
-
-/**
- * YACASL2の制限
- */
-enum {
-    LINESIZE = 1024,       /* 行の最大文字数 */
-    TOKENSIZE = 256,       /* トークンの最大文字数 */
-};
-
-/**
- * アセンブルモード
+ * @brief アセンブルモードを表すデータ型
  */
 typedef struct {
-    bool src;             /* ソースを表示する場合はtrue */
-    bool label;           /* ラベル表を表示する場合はtrue */
-    bool onlylabel;       /* ラベル表を表示して終了する場合はtrue */
-    bool asdetail;        /* アセンブラ詳細結果を表示する場合はtrue */
-    bool onlyassemble;    /* アセンブルだけを行う場合はtrue */
+    bool src;             /**<ソースを表示する場合はtrue */
+    bool label;           /**<ラベル表を表示する場合はtrue */
+    bool onlylabel;       /**<ラベル表を表示して終了する場合はtrue */
+    bool asdetail;        /**<アセンブラ詳細結果を表示する場合はtrue */
+    bool onlyassemble;    /**<アセンブルだけを行う場合はtrue */
 } ASMODE;
 
-extern ASMODE asmode;
-
 /**
- * アセンブルのプロパティ
+ * @brief アセンブルモード: src, label, onlylabel, asdetail, onlyassemble
  */
-typedef struct {
-    WORD ptr;     /* 現在のポインタ */
-    WORD lptr;    /* リテラル(=付きの値)を格納するポインタ */
-    char *prog;   /* 他のプログラムで参照する入口名 */
-} ASPROP;
-
-extern ASPROP *asprop;
-
-/**
-  * アセンブラ命令を表す番号
-  */
-typedef enum {
-    START = 01,
-    END = 02,
-    DS = 03,
-    DC = 04,
-} ASCMDID;
-
-/**
-  * アセンブラ命令を表す配列
-  */
-typedef struct {
-    ASCMDID cmdid;
-    int opdc_min;
-    int opdc_max;
-    char *cmd;
-} ASCMD;
+extern ASMODE asmode;
 
 /**
- * マクロ命令を表す番号
+ * @brief アセンブル時の現在およびリテラルのアドレスとプログラム入口名を表すデータ型
  */
-typedef enum {
-    IN = 011,
-    OUT = 012,
-    RPUSH = 013,
-    RPOP = 014,
-} MACROCMDID;
+typedef struct {
+    WORD ptr;     /**<現在のアドレス */
+    WORD lptr;    /**<リテラル(=付きの値)のアドレス */
+    char *prog;   /**<他のプログラムで参照する入口名 */
+} ASPTR;
 
 /**
- * マクロ命令を表す配列
+ * @brief アセンブル時の、現在およびリテラルのアドレスとプログラム入口名: ptr, lptr, prog
  */
-typedef struct {
-    MACROCMDID cmdid;
-    int opdc_min;
-    int opdc_max;
-    char *cmd;
-} MACROCMD;
+extern ASPTR *asptr;
 
 /**
- * ラベル配列
+ * @brief ラベル配列を表すデータ型
  */
 typedef struct {
-    char *prog;
-    char *label;
-    WORD adr;
+    char *prog;                 /**<プログラム  */
+    char *label;                /**<ラベル */
+    WORD adr;                   /**<アドレス */
 } LABELARRAY;
 
 /**
- * ラベル表
+ * @brief ラベル表を表すデータ型
  */
 typedef struct _LABELTAB {
-    struct _LABELTAB *next;
-    char *prog;
-    char *label;
-    WORD adr;
+    struct _LABELTAB *next;     /**<リスト次項目へのポインタ */
+    LABELARRAY *label;          /**<ラベル配列 */
 } LABELTAB;
 
+/**
+ * ラベル表のサイズ
+ */
 enum {
-    /**
-     * ラベル表のサイズ
-     */
-    LABELTABSIZE = 251,
+    LABELTABSIZE = 251,         /**<ラベル表のサイズ */
 };
 
 /**
- * アセンブラが、1回目か、2回目か、を表す
+ * @brief アセンブラが、1回目か2回目かを表す数値
  */
 typedef enum {
-    FIRST = 0,
-    SECOND = 1,
+    FIRST = 0,                  /**<アセンブラ1回目 */
+    SECOND = 1,                 /**<アセンブラ2回目 */
 } PASS;
 
 /**
- * プログラム名とラベルに対応するアドレスをラベル表から検索する
+ * @brief ラベルのエラーをエラーリストに追加する
+ *
+ * @return なし
  */
-WORD getlabel(const char *prog, const char *label);
+void addcerrlist_label();
 
 /**
- * ラベルを表に追加する
+ * @brief プログラム名とラベルに対応するアドレスをラベル表から検索する
+ *
+ * @return プログラム名とラベルに対応するアドレス
+ *
+ * @param *prog プログラム名
+ * @param *label ラベル
  */
-bool addlabel(const char *prog, const char *label, WORD word);
+WORD getlabel(const char *prog, const char *label);
 
 /**
- * ラベル表を表示する
+ * @brief プログラム名、ラベル、アドレスをラベル表に追加する
+ *
+ * @return 追加に成功した時はtrue、失敗した時はfalse
+ *
+ * @param *prog プログラム名
+ * @param *label ラベル
+ * @param adr アドレス
  */
-void printlabel();
+bool addlabel(const char *prog, const char *label, WORD adr);
 
 /**
- * ラベル表を解放する
+ * @brief ラベル表を表示する
+ *
+ * @return なし
  */
-void freelabel();
+void printlabel();
 
 /**
- * オペランド
+ * @brief ラベル表を解放する
+ *
+ * @return なし
  */
-typedef struct {
-    int opdc;
-    char *opdv[OPDSIZE];
-} OPD;
+void freelabel();
 
 /**
- * 命令行
+ * @brief アセンブルエラーをエラーリストに追加する
+ *
+ * @return なし
  */
-typedef struct {
-    char *label;
-    char *cmd;
-    OPD *opd;
-} CMDLINE;
+void addcerrlist_assemble();
 
 /**
- * 1行を解析する
+ * @brief 指定された名前のファイルをアセンブル\n
+ *
+ * 1回目ではラベルを登録し、2回目ではラベルからアドレスを読み込む
+ *
+ * @return アセンブル完了時はtrue、エラー発生時はfalseを返す
+ *
+ * @param *file ファイル名
+ * @param pass アセンブラが何回目かを表す数
  */
-CMDLINE *linetok(const char *line);
+bool assemblefile(const char *file, PASS pass);
 
 /**
- * 指定された名前のファイルをアセンブル
- * 2回実行される
+ * @brief 指定された1つまたは複数のファイルを2回アセンブル
+ *
+ * @return アセンブル完了時はtrue、エラー発生時はfalseを返す
+ *
+ * @param filec アセンブルするファイルの数
+ * @param filev アセンブルするファイル名の配列
+ * @param adr アセンブル結果を格納するアドレス
  */
-bool assemble(const char *file, PASS pass);
+bool assemble(int filec, char *filev[], WORD adr);
 
 /**
- * 指定されたファイルにアセンブル結果を書込
+ * @brief ファイルにアセンブル結果を書き込む
+ *
+ * @return なし
+ *
+ * @param *file ファイル名
  */
 void outassemble(const char *file);
 
-#endif            /* YACASL2_ASSEMBLE_INCLUDEDの終端 */
+#endif