3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
6 * Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
9 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
10 * によって公表されている GNU General Public License の Version 2 に記
11 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
12 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
33 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
34 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
36 * @(#) $Id: clause.h,v 1.1 2009/01/31 05:27:37 suikan Exp $
39 // $Header: /cvsroot/toppersjsp4bf/jsp/cfg/base/clause.h,v 1.1 2009/01/31 05:27:37 suikan Exp $
44 #include "base/testsuite.h"
45 #include "base/parser.h"
46 #include "base/singleton.h"
47 #include "base/except.h"
52 #define INTEGER_CLAUSE_IDENTIFIER "##INTEGER" //2連の#と識別子を一気に取り出すことはできないので名前が重なることはない
53 #define LITERAL_CLAUSE_IDENTIFIER "##STRING"
54 #define OPERATOR_CLAUSE_IDENTIFIER "##OPERATOR"
61 typedef std::map<std::string, Clause *> map_type;
64 class Namespace : public std::map<std::string, map_type>
65 { public: SINGLETON_CONSTRUCTOR(Namespace) throw() {} };
68 static map_type * getClauseMap(std::string ns) throw();
71 static std::string getClauseIdentifier(Token token) throw();
74 void addClause(std::string ns, std::string identifier) throw();
76 //自分を複数のleading identifierに対応付ける
77 void addMultipleClauses(std::string ns, std::string identifier_list) throw();
79 protected: /* インタフェース */
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);
87 virtual void onFail(const Token & first, Parser & p) throw();
90 Clause(void) throw() {}
91 virtual ~Clause(void) throw() {}
94 inline bool isValid(void) const throw()
95 { return (this != 0); }
98 static bool parseClause(std::string ns, Parser & p);
101 static bool hasClause(std::string ns, std::string first) throw();
103 //[ヘルプ用] 登録されている節の一覧を作成する
104 static std::string makeClauseList(std::string ns, int width = 80) throw();
106 TESTSUITE_PROTOTYPE(main)
113 #define NAMESPACE_STATICAPI "StaticAPI"
115 class StaticAPI : public Clause
119 virtual void before(const Token & first, Parser & p);
120 virtual void after (const Token & first, Parser & p);
123 virtual void onFail(const Token & first, Parser & p) throw();
126 //デフォルトコンストラクタ (何もしない)
127 StaticAPI(void) throw() {}
128 //API名を指定して生成 (registをよぶ)
129 StaticAPI(std::string apinamelist) throw()
130 { addMultipleClauses(NAMESPACE_STATICAPI, apinamelist); }
132 inline void regist(std::string apinamelist) throw()
133 { addMultipleClauses(NAMESPACE_STATICAPI, apinamelist); }
136 static bool parseStaticAPI(Parser & p)
137 { return Clause::parseClause(NAMESPACE_STATICAPI, p); }
140 inline static bool hasStaticAPI(std::string first) throw()
141 { return Clause::hasClause(NAMESPACE_STATICAPI, first); }
143 //[ヘルプ用] 登録されている節の一覧を作成する
144 inline static std::string makeClauseList(int width = 80) throw()
145 { return Clause::makeClauseList(NAMESPACE_STATICAPI, width); }
148 static void skip(Parser & p, bool invalid_api = true) throw();
150 TESTSUITE_PROTOTYPE(main)
157 #define NAMESPACE_DIRECTIVES "Directives"
159 class Directives : public Clause
163 virtual void after(const Token & first, Parser & p) throw(Exception);
166 virtual void onFail(const Token & first, Parser & p) throw();
169 //デフォルトコンストラクタ (何もしない)
170 Directives(void) throw() {}
171 //API名を指定して生成 (registをよぶ)
172 Directives(std::string apinamelist) throw()
173 { addMultipleClauses(NAMESPACE_DIRECTIVES, apinamelist); }
175 inline void regist(std::string apinamelist) throw()
176 { addMultipleClauses(NAMESPACE_DIRECTIVES, apinamelist); }
179 inline static bool parseDirectives(Parser & p)
180 { return Clause::parseClause(NAMESPACE_DIRECTIVES, p); }
183 inline static bool hasDirectives(std::string first) throw()
184 { return Clause::hasClause(NAMESPACE_DIRECTIVES, first); }
186 //[ヘルプ用] 登録されている節の一覧を作成する
187 inline static std::string makeClauseList(int width = 80) throw()
188 { return Clause::makeClauseList(NAMESPACE_DIRECTIVES, width); }
190 TESTSUITE_PROTOTYPE(main)