OSDN Git Service

Doxygenコメントを追加した。
[uzume/uzume_bfin.git] / uzume_prototype / kernel / cfg / base / clause.h
1 /*
2  *  TOPPERS/JSP Kernel
3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
4  *      Just Standard Profile Kernel
5  * 
6  *  Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory
7  *                              Toyohashi Univ. of Technology, JAPAN
8  * 
9  *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 
10  *  によって公表されている GNU General Public License の Version 2 に記
11  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
12  *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
13  *  利用と呼ぶ)することを無償で許諾する.
14  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16  *      スコード中に含まれていること.
17  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20  *      の無保証規定を掲載すること.
21  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23  *      と.
24  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
26  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27  *        報告すること.
28  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30  * 
31  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
33  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
34  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
35  * 
36  *  @(#) $Id: clause.h,v 1.1 2009/01/31 05:27:37 suikan Exp $
37  */
38
39 // $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/clause.h,v 1.1 2009/01/31 05:27:37 suikan Exp $
40
41 #ifndef CLAUSE_H
42 #define CLAUSE_H
43
44 #include "base/testsuite.h"
45 #include "base/parser.h"
46 #include "base/singleton.h"
47 #include "base/except.h"
48
49 #include <map>
50 #include <string>
51
52 #define INTEGER_CLAUSE_IDENTIFIER   "##INTEGER" //2連の#と識別子を一気に取り出すことはできないので名前が重なることはない
53 #define LITERAL_CLAUSE_IDENTIFIER   "##STRING"
54 #define OPERATOR_CLAUSE_IDENTIFIER  "##OPERATOR"
55
56     //構文上の一節を処理するクラス
57 class Clause
58 {
59 public:
60         //ある名前空間に属する節のマップ
61     typedef std::map<std::string, Clause *> map_type;
62
63         //名前空間
64     class Namespace : public std::map<std::string, map_type>
65     { public: SINGLETON_CONSTRUCTOR(Namespace) throw() {} };
66
67 protected:
68     static map_type * getClauseMap(std::string ns) throw();
69
70         //トークンから識別名を生成する
71     static std::string getClauseIdentifier(Token token) throw();
72
73         //自身を登録する
74     void   addClause(std::string ns, std::string identifier) throw();
75
76         //自分を複数のleading identifierに対応付ける
77     void   addMultipleClauses(std::string ns, std::string identifier_list) throw();
78
79 protected:  /* インタフェース */
80
81         //パーサ本体
82     virtual void before(const Token & first, Parser & p);
83     virtual void body  (const Token & first, Parser & p) = 0;
84     virtual void after (const Token & first, Parser & p);
85
86         //パース失敗時の回復処理
87     virtual void onFail(const Token & first, Parser & p) throw();
88
89 public:
90     Clause(void) throw() {}
91     virtual ~Clause(void) throw() {}
92
93         //有効判定
94     inline bool isValid(void) const throw()
95     {   return (this != 0);   }
96
97         //節の解析
98     static bool parseClause(std::string ns, Parser & p);
99
100         //firstで始まる節があるか
101     static bool hasClause(std::string ns, std::string first) throw();
102
103         //[ヘルプ用] 登録されている節の一覧を作成する
104     static std::string makeClauseList(std::string ns, int width = 80) throw();
105
106     TESTSUITE_PROTOTYPE(main)
107 };
108
109
110     /*
111      *   静的API
112      */
113 #define NAMESPACE_STATICAPI "StaticAPI"
114
115 class StaticAPI : public Clause
116 {
117 protected:
118
119     virtual void before(const Token & first, Parser & p);
120     virtual void after (const Token & first, Parser & p);
121
122         //パース失敗時の回復処理
123     virtual void onFail(const Token & first, Parser & p) throw();
124
125 public:
126         //デフォルトコンストラクタ (何もしない)
127     StaticAPI(void) throw() {}      
128         //API名を指定して生成 (registをよぶ)
129     StaticAPI(std::string apinamelist) throw()
130     {   addMultipleClauses(NAMESPACE_STATICAPI, apinamelist);   }
131
132     inline void regist(std::string apinamelist) throw()
133     {   addMultipleClauses(NAMESPACE_STATICAPI, apinamelist);   }
134
135         //節の解析
136     static bool parseStaticAPI(Parser & p)
137     {   return Clause::parseClause(NAMESPACE_STATICAPI, p);   }
138
139         //firstで始まる節があるか
140     inline static bool hasStaticAPI(std::string first) throw()
141     {   return Clause::hasClause(NAMESPACE_STATICAPI, first);   }
142
143         //[ヘルプ用] 登録されている節の一覧を作成する
144     inline static std::string makeClauseList(int width = 80) throw()
145     {   return Clause::makeClauseList(NAMESPACE_STATICAPI, width);   }
146
147         //スキップ
148     static void skip(Parser & p, bool invalid_api = true) throw();
149
150     TESTSUITE_PROTOTYPE(main)
151 };
152
153
154     /*
155      *   プリプロセスディレクティブ
156      */
157 #define NAMESPACE_DIRECTIVES "Directives"
158
159 class Directives : public Clause
160 {
161 protected:
162
163     virtual void after(const Token & first, Parser & p) throw(Exception);
164
165         //パース失敗時の回復処理
166     virtual void onFail(const Token & first, Parser & p) throw();
167
168 public:
169         //デフォルトコンストラクタ (何もしない)
170     Directives(void) throw() {}      
171         //API名を指定して生成 (registをよぶ)
172     Directives(std::string apinamelist) throw()
173     {   addMultipleClauses(NAMESPACE_DIRECTIVES, apinamelist);   }
174
175     inline void regist(std::string apinamelist) throw()
176     {   addMultipleClauses(NAMESPACE_DIRECTIVES, apinamelist);   }
177
178         //節の解析
179     inline static bool parseDirectives(Parser & p)
180     {   return Clause::parseClause(NAMESPACE_DIRECTIVES, p);   }
181
182         //firstで始まる節があるか
183     inline static bool hasDirectives(std::string first) throw()
184     {   return Clause::hasClause(NAMESPACE_DIRECTIVES, first);   }
185
186         //[ヘルプ用] 登録されている節の一覧を作成する
187     inline static std::string makeClauseList(int width = 80) throw()
188     {   return Clause::makeClauseList(NAMESPACE_DIRECTIVES, width);   }
189
190     TESTSUITE_PROTOTYPE(main)
191 };
192
193 #endif
194
195
196