translation_unit_parser.h 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345
  1. // Hannibal: partial C++ grammar to parse C++ type information
  2. // Copyright (c) 2005-2006 Danny Havenith
  3. //
  4. // Boost.Wave: A Standard compliant C++ preprocessor
  5. // Copyright (c) 2001-2009 Hartmut Kaiser
  6. //
  7. // http://www.boost.org/
  8. //
  9. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  10. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  11. #if !defined(HANNIBAL_TRANSLATION_UNIT_GRAMMAR_H_INCLUDED)
  12. #define HANNIBAL_TRANSLATION_UNIT_GRAMMAR_H_INCLUDED
  13. #include <map>
  14. #include <boost/assert.hpp>
  15. #include <boost/spirit/include/classic_core.hpp>
  16. #include <boost/spirit/include/classic_confix.hpp>
  17. #include <boost/wave/wave_config.hpp>
  18. #include <boost/wave/token_ids.hpp>
  19. #include <boost/wave/util/pattern_parser.hpp>
  20. //
  21. // If so required, trace every declaration and member-declaration.
  22. // This can be a much faster alternative to BOOST_SPIRIT_DEBUG-type of
  23. // debugging.
  24. //
  25. #ifdef HANNIBAL_TRACE_DECLARATIONS
  26. struct trace_actor
  27. {
  28. trace_actor(
  29. const char rule_type[],
  30. std::ostream &strm
  31. )
  32. : strm_( strm), rule_type_( rule_type)
  33. {
  34. // nop
  35. }
  36. template<typename PositionIterator>
  37. void operator()(PositionIterator begin, PositionIterator end) const
  38. {
  39. typedef const boost::wave::cpplexer::lex_token<>::position_type
  40. position_type;
  41. //typedef pos_iterator_type::token_type::position_type position_type;
  42. position_type &begin_pos(begin->get_position());
  43. strm_ << "Parsed " << rule_type_ << std::endl;
  44. strm_ << " from: " << begin_pos.get_file()
  45. << "(" << begin_pos.get_line() << ")"
  46. << std::endl;
  47. };
  48. private:
  49. std::ostream &strm_;
  50. char const* const rule_type_;
  51. };
  52. #define HANNIBAL_TRACE_ACTION( type) [trace_actor( (type), std::cout)]
  53. #else
  54. #define HANNIBAL_TRACE_ACTION( type)
  55. #endif
  56. ///////////////////////////////////////////////////////////////////////////////
  57. #define HANNIBAL_TRACE_TRANSLATION_UNIT_GRAMMAR \
  58. bool(BOOST_SPIRIT_DEBUG_FLAGS_CPP & BOOST_SPIRIT_DEBUG_FLAGS_CPP_EXPR_GRAMMAR) \
  59. /**/
  60. ///////////////////////////////////////////////////////////////////////////////
  61. // Helper macro to register rules for debugging
  62. #if HANNIBAL_DUMP_PARSE_TREE != 0
  63. #define HANNIBAL_REGISTER_RULE(r) \
  64. BOOST_SPIRIT_DEBUG_NODE(r); \
  65. self.declare_rule(r, #r) \
  66. /**/
  67. #else
  68. #define HANNIBAL_REGISTER_RULE(r) \
  69. BOOST_SPIRIT_DEBUG_NODE(r) \
  70. /**/
  71. #endif
  72. ///////////////////////////////////////////////////////////////////////////////
  73. struct dump_actor {
  74. template<typename ForwardIterator>
  75. void operator()(ForwardIterator begin, ForwardIterator end)
  76. {
  77. std::cerr << "*** COULD NOT PARSE THE FOLLOWING ***" << std::endl;
  78. while (begin != end)
  79. {
  80. std::cerr << begin->get_value();
  81. ++begin;
  82. }
  83. }
  84. } dump_a;
  85. ///////////////////////////////////////////////////////////////////////////////
  86. struct translation_unit_grammar
  87. : public boost::spirit::classic::grammar<translation_unit_grammar>
  88. {
  89. #if HANNIBAL_DUMP_PARSE_TREE != 0
  90. //
  91. // allow an external map with rule-id -> rule-name mappings.
  92. // this map is external so it can be altered by the definition constructor,
  93. // which receives a const grammar object.
  94. //
  95. // Please Note: the lifetime of the rule map should at least extend beyond the
  96. // call of the definition constructor...
  97. //
  98. typedef std::map<boost::spirit::classic::parser_id, std::string>
  99. rule_map_type;
  100. translation_unit_grammar(rule_map_type *rule_map_ptr_ = 0)
  101. : rule_map_ptr(rule_map_ptr_)
  102. #else
  103. translation_unit_grammar()
  104. #endif
  105. {
  106. BOOST_SPIRIT_DEBUG_TRACE_GRAMMAR_NAME(*this,
  107. "translation_unit_grammar", HANNIBAL_TRACE_TRANSLATION_UNIT_GRAMMAR);
  108. }
  109. template <typename ScannerT>
  110. struct definition
  111. {
  112. // declare non-terminals
  113. typedef boost::spirit::classic::rule<ScannerT> rule_type;
  114. rule_type constant_expression;
  115. rule_type logical_or_exp, logical_and_exp;
  116. rule_type inclusive_or_exp, exclusive_or_exp, and_exp;
  117. rule_type cmp_equality, cmp_relational;
  118. rule_type shift_exp;
  119. rule_type add_exp, multiply_exp;
  120. rule_type unary_exp, primary_exp, constant;
  121. boost::spirit::classic::subrule<0> const_exp_subrule;
  122. boost::spirit::classic::subrule<1> shift_exp_clos;
  123. rule_type simple_type_name, class_keywords;
  124. rule_type storage_class_specifier, cv_qualifier, function_specifier;
  125. rule_type access_specifier;
  126. rule_type extension_type_decorator;
  127. rule_type operator_sym;
  128. rule_type class_key;
  129. rule_type enumerator;
  130. rule_type enumerator_list;
  131. rule_type enumerator_definition;
  132. rule_type member_declarator;
  133. rule_type member_declarator_list;
  134. rule_type member_declaration;
  135. rule_type constant_initializer;
  136. rule_type pure_specifier;
  137. rule_type namespace_body;
  138. rule_type type_id;
  139. rule_type unnamed_namespace_definition;
  140. rule_type extension_namespace_definition;
  141. rule_type original_namespace_definition;
  142. rule_type named_namespace_definition;
  143. rule_type namespace_definition;
  144. rule_type linkage_specification;
  145. rule_type explicit_specialization;
  146. rule_type using_directive;
  147. rule_type using_declaration;
  148. rule_type type_parameter;
  149. rule_type template_parameter;
  150. rule_type template_parameter_list;
  151. rule_type template_declaration;
  152. rule_type explicit_instantiation;
  153. rule_type qualified_namespace_specifier;
  154. rule_type namespace_alias_definition;
  155. rule_type expression_list;
  156. rule_type initializer_list;
  157. rule_type initializer_clause;
  158. rule_type initializer;
  159. rule_type init_declarator;
  160. rule_type init_declarator_list;
  161. rule_type asm_definition;
  162. rule_type simple_declaration;
  163. rule_type block_declaration;
  164. rule_type declaration;
  165. rule_type declaration_seq;
  166. rule_type translation_unit;
  167. rule_type function_definition, function_definition_helper, declarator;
  168. rule_type direct_declarator, parameters_or_array_spec;
  169. rule_type abstract_declarator, direct_abstract_declarator;
  170. rule_type direct_abstract_declarator_helper;
  171. rule_type parameter_declaration_clause, parameter_declaration_list;
  172. rule_type parameter_declaration, assignment_expression, decimal_literal;
  173. rule_type octal_literal, hexadecimal_literal;
  174. rule_type declarator_id, id_expression, qualified_id, unqualified_id;
  175. rule_type operator_function_id, conversion_function_id, conversion_type_id;
  176. rule_type conversion_declarator, function_body;
  177. rule_type compound_statement, ctor_initializer, ptr_operator;
  178. rule_type decl_specifier, type_specifier;
  179. rule_type type_specifier_seq, cv_qualifier_seq, enum_specifier;
  180. rule_type enum_keyword, simple_type_specifier;
  181. rule_type class_specifier, member_specification, class_head;
  182. rule_type type_name, elaborated_type_specifier, template_argument_list;
  183. rule_type template_argument, nested_name_specifier;
  184. rule_type class_or_namespace_name, class_name, enum_name, typedef_name;
  185. rule_type namespace_name, template_id;
  186. rule_type decl_specifier_seq, no_type_decl_specifier;
  187. rule_type function_try_block, handler_seq, handler;
  188. rule_type exception_specification, template_name;
  189. rule_type original_namespace_name, base_specifier;
  190. rule_type base_specifier_list, base_clause;
  191. rule_type odd_language_extension, mem_initializer_id;
  192. rule_type mem_initializer, mem_initializer_list;
  193. rule_type ta_expression_operator;
  194. rule_type ta_logical_or_expression;
  195. rule_type ta_expression;
  196. rule_type ta_conditional_expression;
  197. rule_type ta_throw_expression;
  198. rule_type ta_assignment_expression;
  199. rule_type postfix_expression_helper;
  200. rule_type simple_postfix_expression;
  201. rule_type pseudo_destructor_name;
  202. rule_type direct_new_declarator;
  203. rule_type new_declarator;
  204. rule_type new_initializer;
  205. rule_type new_type_id;
  206. rule_type new_placement;
  207. rule_type delete_expression;
  208. rule_type new_expression;
  209. rule_type unary_operator;
  210. rule_type postfix_expression;
  211. rule_type unary_expression;
  212. rule_type expression_operator;
  213. rule_type cast_expression;
  214. rule_type throw_expression;
  215. rule_type assignment_operator;
  216. rule_type logical_or_expression;
  217. rule_type conditional_expression;
  218. rule_type boolean_literal;
  219. rule_type string_literal;
  220. rule_type floating_literal;
  221. rule_type character_literal;
  222. rule_type integer_literal;
  223. rule_type expression;
  224. rule_type literal;
  225. rule_type primary_expression;
  226. //
  227. // grammar definition.
  228. definition(translation_unit_grammar const& self)
  229. {
  230. using namespace boost::spirit::classic;
  231. using namespace boost::wave;
  232. using boost::wave::util::pattern_p;
  233. //
  234. // First, a long list of expression rules.
  235. //
  236. HANNIBAL_REGISTER_RULE( primary_expression);
  237. primary_expression
  238. = literal
  239. | ch_p(T_THIS)
  240. | ch_p(T_COLON_COLON) >> ch_p(T_IDENTIFIER)
  241. | ch_p(T_COLON_COLON) >> operator_function_id
  242. | ch_p(T_COLON_COLON) >> qualified_id
  243. | ch_p(T_LEFTPAREN) >> expression >> ch_p(T_RIGHTPAREN)
  244. | id_expression
  245. ;
  246. HANNIBAL_REGISTER_RULE( literal);
  247. literal
  248. = integer_literal
  249. | character_literal
  250. | floating_literal
  251. | string_literal
  252. | boolean_literal
  253. ;
  254. HANNIBAL_REGISTER_RULE( integer_literal);
  255. integer_literal
  256. = pattern_p( IntegerLiteralTokenType, TokenTypeMask)
  257. ;
  258. HANNIBAL_REGISTER_RULE( character_literal);
  259. character_literal
  260. = pattern_p( CharacterLiteralTokenType, TokenTypeMask)
  261. ;
  262. HANNIBAL_REGISTER_RULE( floating_literal);
  263. floating_literal
  264. = pattern_p( FloatingLiteralTokenType, TokenTypeMask)
  265. ;
  266. HANNIBAL_REGISTER_RULE( string_literal);
  267. string_literal
  268. = pattern_p( StringLiteralTokenType, TokenTypeMask)
  269. ;
  270. HANNIBAL_REGISTER_RULE( boolean_literal);
  271. boolean_literal
  272. = pattern_p( BoolLiteralTokenType, TokenTypeMask)
  273. ;
  274. //
  275. // TODO: separate assignment expression into a grammar of it's own
  276. //
  277. HANNIBAL_REGISTER_RULE( assignment_expression);
  278. assignment_expression
  279. = conditional_expression
  280. | logical_or_expression >> assignment_operator >> assignment_expression
  281. | throw_expression
  282. ;
  283. //
  284. // Have a separate assignment expression for template arguments.
  285. // This is needed, because without it, an expression of the form
  286. // template < a, b, c > x;
  287. // would not parse, since the 'c > x' part would be taken by the
  288. // assignment expression.
  289. //
  290. // Note that this ta_xxxxx duplication cascades all the way down to
  291. // logical_or_expression.
  292. // Both the previous example and a declaration of the form
  293. // template < a, b, (c > d) > x;
  294. // should parse fine now.
  295. //
  296. //
  297. HANNIBAL_REGISTER_RULE( ta_assignment_expression);
  298. ta_assignment_expression
  299. = ta_conditional_expression
  300. | ta_logical_or_expression >> assignment_operator >> ta_assignment_expression
  301. | ta_throw_expression
  302. ;
  303. HANNIBAL_REGISTER_RULE( throw_expression);
  304. throw_expression
  305. = ch_p(T_THROW) >> !assignment_expression
  306. ;
  307. HANNIBAL_REGISTER_RULE( ta_throw_expression);
  308. ta_throw_expression
  309. = ch_p(T_THROW) >> !ta_assignment_expression
  310. ;
  311. HANNIBAL_REGISTER_RULE( conditional_expression);
  312. conditional_expression
  313. = logical_or_expression
  314. >> !(
  315. ch_p(T_QUESTION_MARK)
  316. >> expression
  317. >> ch_p(T_COLON)
  318. >> assignment_expression
  319. )
  320. ;
  321. HANNIBAL_REGISTER_RULE( ta_conditional_expression);
  322. ta_conditional_expression
  323. = ta_logical_or_expression
  324. >> !(
  325. ch_p(T_QUESTION_MARK)
  326. >> ta_expression
  327. >> ch_p(T_COLON)
  328. >> ta_assignment_expression
  329. )
  330. ;
  331. HANNIBAL_REGISTER_RULE( expression);
  332. expression
  333. = assignment_expression % ch_p(T_COMMA);
  334. HANNIBAL_REGISTER_RULE( ta_expression);
  335. ta_expression
  336. = ta_assignment_expression % ch_p(T_COMMA);
  337. HANNIBAL_REGISTER_RULE( assignment_operator);
  338. assignment_operator
  339. = pp(T_ASSIGN)
  340. | pp(T_ANDASSIGN)
  341. | pp(T_ORASSIGN)
  342. | pp(T_XORASSIGN)
  343. | pp(T_DIVIDEASSIGN)
  344. | pp(T_MINUSASSIGN)
  345. | pp(T_PERCENTASSIGN)
  346. | pp(T_PLUSASSIGN)
  347. | pp(T_SHIFTLEFTASSIGN)
  348. | pp(T_SHIFTRIGHTASSIGN)
  349. | pp(T_STARASSIGN)
  350. ;
  351. // we skip quite a few rules here, since we're not interested in operator precedence
  352. // just now.
  353. HANNIBAL_REGISTER_RULE( logical_or_expression);
  354. logical_or_expression
  355. = cast_expression % expression_operator
  356. ;
  357. HANNIBAL_REGISTER_RULE( ta_logical_or_expression);
  358. ta_logical_or_expression
  359. = cast_expression % ta_expression_operator
  360. ;
  361. HANNIBAL_REGISTER_RULE( expression_operator );
  362. expression_operator
  363. = ta_expression_operator | pp(T_GREATER)
  364. ;
  365. HANNIBAL_REGISTER_RULE( ta_expression_operator );
  366. ta_expression_operator
  367. = pp(T_OROR)
  368. | pp(T_ANDAND)
  369. | pp(T_OR)
  370. | pp(T_XOR)
  371. | pp(T_AND)
  372. | pp(T_NOTEQUAL)
  373. | pp(T_EQUAL)
  374. | pp(T_GREATEREQUAL)
  375. | pp(T_LESSEQUAL)
  376. | pp(T_LESS)
  377. | pp(T_SHIFTLEFT)
  378. | pp(T_SHIFTRIGHT)
  379. | pp(T_PLUS)
  380. | pp(T_MINUS)
  381. | pp(T_PERCENT)
  382. | pp(T_DIVIDE)
  383. | pp(T_STAR)
  384. | pp(T_ARROWSTAR)
  385. | pp(T_DOTSTAR)
  386. ;
  387. HANNIBAL_REGISTER_RULE( cast_expression);
  388. cast_expression
  389. = ch_p(T_LEFTPAREN) >> type_id >> ch_p(T_RIGHTPAREN)
  390. >> cast_expression
  391. | unary_expression
  392. ;
  393. HANNIBAL_REGISTER_RULE( unary_expression);
  394. unary_expression
  395. = postfix_expression
  396. | ch_p(T_PLUSPLUS) >> cast_expression
  397. | ch_p(T_MINUSMINUS) >> cast_expression
  398. | unary_operator >> cast_expression
  399. | ch_p(T_SIZEOF) >> unary_expression
  400. | ch_p(T_SIZEOF)
  401. >> ch_p(T_LEFTPAREN) >> type_id >> ch_p(T_RIGHTPAREN)
  402. | new_expression
  403. | delete_expression
  404. ;
  405. HANNIBAL_REGISTER_RULE( unary_operator);
  406. unary_operator
  407. = ch_p(T_STAR)
  408. | pp(T_AND)
  409. | pp(T_PLUS)
  410. | ch_p(T_MINUS)
  411. | ch_p(T_NOT)
  412. | pp(T_COMPL)
  413. ;
  414. HANNIBAL_REGISTER_RULE( new_expression);
  415. new_expression
  416. = !ch_p(T_COLON_COLON) >> ch_p(T_NEW) >> !new_placement
  417. >> (
  418. new_type_id >> !new_initializer
  419. | ch_p(T_LEFTPAREN) >> type_id >> ch_p(T_RIGHTPAREN) >> !new_initializer
  420. )
  421. ;
  422. HANNIBAL_REGISTER_RULE( new_placement);
  423. new_placement
  424. = ch_p(T_LEFTPAREN) >> expression_list >> ch_p(T_RIGHTPAREN)
  425. ;
  426. HANNIBAL_REGISTER_RULE( new_type_id);
  427. new_type_id
  428. = type_specifier_seq >> !new_declarator
  429. ;
  430. HANNIBAL_REGISTER_RULE( new_declarator);
  431. new_declarator
  432. = ptr_operator >> !new_declarator
  433. | direct_new_declarator
  434. ;
  435. HANNIBAL_REGISTER_RULE( direct_new_declarator);
  436. direct_new_declarator
  437. = *( pp(T_LEFTBRACKET) >> expression >> pp(T_RIGHTBRACKET) )
  438. >> pp(T_LEFTBRACKET) >> constant_expression >> pp(T_RIGHTBRACKET)
  439. ;
  440. HANNIBAL_REGISTER_RULE( new_initializer);
  441. new_initializer
  442. = ch_p(T_LEFTPAREN) >> !expression_list >> ch_p(T_RIGHTPAREN)
  443. ;
  444. HANNIBAL_REGISTER_RULE( delete_expression);
  445. delete_expression
  446. = !ch_p(T_COLON_COLON) >> ch_p(T_DELETE) >> cast_expression
  447. | !ch_p(T_COLON_COLON) >> ch_p(T_DELETE)
  448. >> pp(T_LEFTBRACKET) >> pp(T_RIGHTBRACKET)
  449. >> cast_expression
  450. ;
  451. HANNIBAL_REGISTER_RULE( postfix_expression);
  452. postfix_expression
  453. = simple_postfix_expression >> *postfix_expression_helper
  454. ;
  455. HANNIBAL_REGISTER_RULE( simple_postfix_expression);
  456. simple_postfix_expression
  457. = primary_expression
  458. | simple_type_specifier
  459. >> ch_p(T_LEFTPAREN) >> !expression_list >> ch_p(T_RIGHTPAREN)
  460. | ch_p(T_DYNAMICCAST)
  461. >> ch_p(T_LESS) >> type_id >> ch_p(T_GREATER)
  462. >> ch_p(T_LEFTPAREN) >> expression >> ch_p(T_RIGHTPAREN)
  463. | ch_p(T_STATICCAST)
  464. >> ch_p(T_LESS) >> type_id >> ch_p(T_GREATER)
  465. >> ch_p(T_LEFTPAREN) >> expression >> ch_p(T_RIGHTPAREN)
  466. | ch_p(T_REINTERPRETCAST)
  467. >> ch_p(T_LESS) >> type_id >> ch_p(T_GREATER)
  468. >> ch_p(T_LEFTPAREN) >> expression >> ch_p(T_RIGHTPAREN)
  469. | ch_p(T_CONSTCAST)
  470. >> ch_p(T_LESS) >> type_id >> ch_p(T_GREATER)
  471. >> ch_p(T_LEFTPAREN) >> expression >> ch_p(T_RIGHTPAREN)
  472. | ch_p(T_TYPEID)
  473. >> ch_p(T_LEFTPAREN) >> expression >> ch_p(T_RIGHTPAREN)
  474. | ch_p(T_TYPEID)
  475. >> ch_p(T_LEFTPAREN) >> type_id >> ch_p(T_RIGHTPAREN)
  476. ;
  477. HANNIBAL_REGISTER_RULE( postfix_expression_helper );
  478. postfix_expression_helper
  479. = pp(T_LEFTBRACKET) >> expression >> pp(T_RIGHTBRACKET)
  480. | ch_p(T_LEFTPAREN) >> !expression_list >> ch_p(T_RIGHTPAREN)
  481. | ch_p(T_DOT) >> !ch_p(T_TEMPLATE) >> !ch_p(T_COLON_COLON) >> id_expression
  482. | ch_p(T_ARROW) >> !ch_p(T_TEMPLATE) >> !ch_p(T_COLON_COLON) >> id_expression
  483. | ch_p(T_DOT) >> pseudo_destructor_name
  484. | ch_p(T_ARROW) >> pseudo_destructor_name
  485. | ch_p(T_PLUSPLUS)
  486. | ch_p(T_MINUSMINUS)
  487. ;
  488. HANNIBAL_REGISTER_RULE( pseudo_destructor_name);
  489. pseudo_destructor_name
  490. = !ch_p(T_COLON_COLON) >> !nested_name_specifier
  491. >> (
  492. type_name >> ch_p(T_COLON_COLON) >> ch_p(T_COMPL) >> type_name
  493. | ch_p(T_COMPL) >> type_name
  494. )
  495. ;
  496. HANNIBAL_REGISTER_RULE(constant_expression);
  497. constant_expression
  498. = conditional_expression
  499. ;
  500. HANNIBAL_REGISTER_RULE(ctor_initializer);
  501. ctor_initializer
  502. = ch_p(T_COLON) >> mem_initializer_list
  503. ;
  504. HANNIBAL_REGISTER_RULE(mem_initializer_list);
  505. mem_initializer_list
  506. = mem_initializer % ch_p(T_COMMA)
  507. ;
  508. HANNIBAL_REGISTER_RULE(mem_initializer);
  509. mem_initializer
  510. = mem_initializer_id
  511. >> comment_nest_p(ch_p(T_LEFTPAREN), ch_p(T_RIGHTPAREN))
  512. // TODO: restore after assignment expression has been implemented
  513. //ch_p(T_LEFTPAREN) >> !expression_list >> ch_p(T_RIGHTPAREN)
  514. ;
  515. HANNIBAL_REGISTER_RULE(mem_initializer_id);
  516. mem_initializer_id
  517. = !ch_p(T_COLON_COLON) >> !nested_name_specifier >> class_name
  518. | ch_p(T_IDENTIFIER)
  519. ;
  520. //
  521. // the eps_p is added to allow skipping of trailing whitespace
  522. // (post-skip)
  523. //
  524. HANNIBAL_REGISTER_RULE(translation_unit);
  525. translation_unit
  526. = !declaration_seq >> end_p;
  527. ;
  528. HANNIBAL_REGISTER_RULE(odd_language_extension);
  529. odd_language_extension // read: microsoft extensions
  530. = extension_type_decorator
  531. >> !comment_nest_p(ch_p(T_LEFTPAREN), ch_p(T_RIGHTPAREN))
  532. ;
  533. HANNIBAL_REGISTER_RULE(declaration_seq);
  534. declaration_seq
  535. = +declaration HANNIBAL_TRACE_ACTION( "declaration")
  536. ;
  537. HANNIBAL_REGISTER_RULE(declaration);
  538. declaration
  539. = template_declaration
  540. | explicit_instantiation
  541. | explicit_specialization
  542. | linkage_specification
  543. | namespace_definition
  544. | block_declaration
  545. | function_definition
  546. ;
  547. HANNIBAL_REGISTER_RULE(block_declaration);
  548. block_declaration
  549. = simple_declaration
  550. | asm_definition
  551. | namespace_alias_definition
  552. | using_declaration
  553. | using_directive
  554. ;
  555. HANNIBAL_REGISTER_RULE(simple_declaration);
  556. simple_declaration
  557. = !decl_specifier_seq >> !init_declarator_list
  558. >> ch_p(T_SEMICOLON)
  559. ;
  560. HANNIBAL_REGISTER_RULE(asm_definition);
  561. asm_definition
  562. = ch_p(T_ASM)
  563. >> ch_p(T_LEFTPAREN) >> ch_p(T_STRINGLIT) >> ch_p(T_RIGHTPAREN)
  564. >> ch_p(T_SEMICOLON)
  565. ;
  566. HANNIBAL_REGISTER_RULE(init_declarator_list);
  567. init_declarator_list
  568. = init_declarator % ch_p(T_COMMA)
  569. ;
  570. HANNIBAL_REGISTER_RULE(init_declarator);
  571. init_declarator
  572. = declarator >> !initializer
  573. ;
  574. HANNIBAL_REGISTER_RULE(initializer);
  575. initializer
  576. = ch_p(T_ASSIGN) >> initializer_clause
  577. | ch_p(T_LEFTPAREN) >> expression_list >> ch_p(T_RIGHTPAREN)
  578. ;
  579. HANNIBAL_REGISTER_RULE(initializer_clause);
  580. initializer_clause
  581. = assignment_expression
  582. | ch_p(T_LEFTBRACE) >> initializer_list
  583. >> !ch_p(T_COMMA) >> ch_p(T_RIGHTBRACE)
  584. | ch_p(T_LEFTBRACE) >> ch_p(T_RIGHTBRACE)
  585. ;
  586. HANNIBAL_REGISTER_RULE(initializer_list);
  587. initializer_list
  588. = initializer_clause % ch_p(T_COMMA)
  589. ;
  590. HANNIBAL_REGISTER_RULE(expression_list);
  591. expression_list
  592. = assignment_expression % ch_p(T_COMMA)
  593. ;
  594. HANNIBAL_REGISTER_RULE(namespace_alias_definition);
  595. namespace_alias_definition
  596. = ch_p(T_NAMESPACE) >> ch_p(T_IDENTIFIER) >> ch_p(T_ASSIGN)
  597. >> qualified_namespace_specifier
  598. >> ch_p(T_SEMICOLON)
  599. ;
  600. HANNIBAL_REGISTER_RULE(qualified_namespace_specifier);
  601. qualified_namespace_specifier
  602. = !ch_p(T_COLON_COLON) >> !nested_name_specifier
  603. >> namespace_name
  604. ;
  605. HANNIBAL_REGISTER_RULE(explicit_instantiation);
  606. explicit_instantiation
  607. = template_declaration
  608. ;
  609. HANNIBAL_REGISTER_RULE(template_declaration);
  610. template_declaration
  611. = !ch_p(T_EXPORT) >> ch_p(T_TEMPLATE)
  612. >> ch_p(T_LESS) >> template_parameter_list >> ch_p(T_GREATER)
  613. >> declaration
  614. ;
  615. HANNIBAL_REGISTER_RULE(template_parameter_list);
  616. template_parameter_list
  617. = template_parameter % ch_p(T_COMMA)
  618. ;
  619. HANNIBAL_REGISTER_RULE(template_parameter);
  620. template_parameter
  621. = type_parameter
  622. | parameter_declaration
  623. ;
  624. HANNIBAL_REGISTER_RULE(type_parameter);
  625. type_parameter
  626. = ch_p(T_CLASS) >> !ch_p(T_IDENTIFIER)
  627. >> !(ch_p(T_ASSIGN) >> type_id)
  628. | ch_p(T_TYPENAME) >> !ch_p(T_IDENTIFIER)
  629. >> !(ch_p(T_ASSIGN) >> type_id)
  630. | ch_p(T_TEMPLATE)
  631. >> ch_p(T_LESS) >> template_parameter_list >> ch_p(T_GREATER)
  632. >> ch_p(T_CLASS) >> !ch_p(T_IDENTIFIER)
  633. >> !(ch_p(T_ASSIGN) >> template_name)
  634. ;
  635. HANNIBAL_REGISTER_RULE(template_name);
  636. template_name
  637. = ch_p(T_IDENTIFIER)
  638. ;
  639. HANNIBAL_REGISTER_RULE(using_declaration);
  640. using_declaration // optimize?
  641. = ch_p(T_USING) >> !ch_p(T_TYPENAME) >> !ch_p(T_COLON_COLON)
  642. >> nested_name_specifier >> unqualified_id
  643. >> ch_p(T_SEMICOLON)
  644. | ch_p(T_USING) >> ch_p(T_COLON_COLON) >> unqualified_id
  645. >> ch_p(T_SEMICOLON)
  646. ;
  647. HANNIBAL_REGISTER_RULE(using_directive);
  648. using_directive
  649. = ch_p(T_USING) >> ch_p(T_NAMESPACE) >> !ch_p(T_COLON_COLON)
  650. >> !nested_name_specifier >> namespace_name
  651. >> ch_p(T_SEMICOLON)
  652. ;
  653. HANNIBAL_REGISTER_RULE(explicit_specialization);
  654. explicit_specialization
  655. = ch_p(T_TEMPLATE) >> ch_p(T_LESS) >> ch_p(T_GREATER)
  656. >> declaration
  657. ;
  658. HANNIBAL_REGISTER_RULE(linkage_specification);
  659. linkage_specification
  660. = ch_p(T_EXTERN) >> ch_p(T_STRINGLIT)
  661. >> ( ch_p(T_LEFTBRACE) >> !declaration_seq >> ch_p(T_RIGHTBRACE)
  662. | declaration
  663. )
  664. ;
  665. HANNIBAL_REGISTER_RULE(namespace_definition);
  666. namespace_definition
  667. = named_namespace_definition
  668. | unnamed_namespace_definition // TODO: optimize?
  669. ;
  670. HANNIBAL_REGISTER_RULE(named_namespace_definition);
  671. named_namespace_definition
  672. = original_namespace_definition
  673. // | extension_namespace_definition // optimization: extension namespace is syntactically identical
  674. ;
  675. HANNIBAL_REGISTER_RULE(original_namespace_definition);
  676. original_namespace_definition
  677. = ch_p(T_NAMESPACE) >> ch_p(T_IDENTIFIER)
  678. >> ch_p(T_LEFTBRACE) >> namespace_body >> ch_p(T_RIGHTBRACE)
  679. ;
  680. HANNIBAL_REGISTER_RULE(extension_namespace_definition);
  681. extension_namespace_definition
  682. = ch_p(T_NAMESPACE) >> original_namespace_name
  683. >> ch_p(T_LEFTBRACE) >> namespace_body >> ch_p(T_RIGHTBRACE)
  684. ;
  685. HANNIBAL_REGISTER_RULE(original_namespace_name);
  686. original_namespace_name
  687. = ch_p(T_IDENTIFIER)
  688. ;
  689. HANNIBAL_REGISTER_RULE(unnamed_namespace_definition);
  690. unnamed_namespace_definition
  691. = ch_p(T_NAMESPACE)
  692. >> ch_p(T_LEFTBRACE) >> namespace_body >> ch_p(T_RIGHTBRACE)
  693. ;
  694. HANNIBAL_REGISTER_RULE(namespace_body);
  695. namespace_body
  696. = !declaration_seq
  697. ;
  698. HANNIBAL_REGISTER_RULE(function_definition);
  699. function_definition
  700. = function_definition_helper
  701. >> !ctor_initializer >> !function_body // removed semicolons
  702. | decl_specifier_seq >> declarator >> function_try_block
  703. | declarator >> function_try_block
  704. ;
  705. HANNIBAL_REGISTER_RULE(function_definition_helper);
  706. function_definition_helper
  707. = decl_specifier_seq >> declarator
  708. | +no_type_decl_specifier >> declarator
  709. | declarator
  710. ;
  711. HANNIBAL_REGISTER_RULE(function_try_block);
  712. function_try_block
  713. = ch_p(T_TRY)
  714. >> !ctor_initializer >> function_body >> handler_seq
  715. ;
  716. HANNIBAL_REGISTER_RULE(handler_seq);
  717. handler_seq
  718. = +handler
  719. ;
  720. HANNIBAL_REGISTER_RULE(handler);
  721. handler // TODO
  722. = ch_p(T_CATCH)
  723. >> comment_nest_p(ch_p(T_LEFTPAREN), ch_p(T_RIGHTPAREN))
  724. >> compound_statement
  725. ;
  726. HANNIBAL_REGISTER_RULE(declarator);
  727. declarator
  728. = *( ptr_operator
  729. | odd_language_extension
  730. )
  731. >> direct_declarator
  732. ;
  733. HANNIBAL_REGISTER_RULE(direct_declarator);
  734. direct_declarator
  735. = ( declarator_id
  736. | ch_p(T_LEFTPAREN) >> declarator >> ch_p(T_RIGHTPAREN)
  737. )
  738. >> *parameters_or_array_spec
  739. ;
  740. HANNIBAL_REGISTER_RULE(parameters_or_array_spec);
  741. parameters_or_array_spec
  742. = ch_p(T_LEFTPAREN) >> parameter_declaration_clause >> ch_p(T_RIGHTPAREN)
  743. >> !cv_qualifier_seq >> !exception_specification
  744. | pp(T_LEFTBRACKET) >> !constant_expression >> pp(T_RIGHTBRACKET)
  745. ;
  746. HANNIBAL_REGISTER_RULE(exception_specification);
  747. exception_specification // TODO
  748. = ch_p(T_THROW)
  749. >> comment_nest_p(ch_p(T_LEFTPAREN), ch_p(T_RIGHTPAREN))
  750. ;
  751. HANNIBAL_REGISTER_RULE(abstract_declarator);
  752. abstract_declarator
  753. = +( ptr_operator
  754. | odd_language_extension
  755. )
  756. >> !direct_abstract_declarator
  757. | direct_abstract_declarator
  758. ;
  759. HANNIBAL_REGISTER_RULE(direct_abstract_declarator);
  760. direct_abstract_declarator
  761. = ch_p(T_LEFTPAREN) >> abstract_declarator >> ch_p(T_RIGHTPAREN)
  762. >> *direct_abstract_declarator_helper
  763. ;
  764. HANNIBAL_REGISTER_RULE(direct_abstract_declarator_helper);
  765. direct_abstract_declarator_helper
  766. = ch_p(T_LEFTPAREN) >> parameter_declaration_clause >> ch_p(T_RIGHTPAREN)
  767. >> !cv_qualifier_seq >> !exception_specification
  768. | pp(T_LEFTBRACKET) >> !constant_expression >> pp(T_RIGHTBRACKET)
  769. ;
  770. HANNIBAL_REGISTER_RULE(parameter_declaration_clause);
  771. parameter_declaration_clause
  772. = parameter_declaration_list >> ch_p(T_COMMA)
  773. >> ch_p(T_ELLIPSIS)
  774. | !parameter_declaration_list >> !ch_p(T_ELLIPSIS)
  775. ;
  776. HANNIBAL_REGISTER_RULE(parameter_declaration_list);
  777. parameter_declaration_list
  778. = parameter_declaration % ch_p(T_COMMA)
  779. ;
  780. HANNIBAL_REGISTER_RULE(parameter_declaration);
  781. parameter_declaration
  782. = decl_specifier_seq
  783. >> !(declarator | abstract_declarator)
  784. >> !(ch_p(T_ASSIGN) >> assignment_expression)
  785. ;
  786. HANNIBAL_REGISTER_RULE(declarator_id);
  787. declarator_id
  788. = !ch_p(T_COLON_COLON)
  789. >> ( id_expression
  790. | !nested_name_specifier >> type_name
  791. )
  792. ;
  793. HANNIBAL_REGISTER_RULE(id_expression);
  794. id_expression
  795. = qualified_id
  796. | unqualified_id
  797. ;
  798. HANNIBAL_REGISTER_RULE(qualified_id);
  799. qualified_id
  800. = nested_name_specifier >> !ch_p(T_TEMPLATE) >> unqualified_id
  801. ;
  802. HANNIBAL_REGISTER_RULE(unqualified_id);
  803. unqualified_id
  804. = operator_function_id
  805. | conversion_function_id
  806. | ch_p(T_COMPL) >> class_name
  807. | template_id
  808. | ch_p(T_IDENTIFIER)
  809. ;
  810. HANNIBAL_REGISTER_RULE(operator_function_id);
  811. operator_function_id
  812. = ch_p(T_OPERATOR) >> operator_sym // this is called 'operator' in the std grammar
  813. ;
  814. HANNIBAL_REGISTER_RULE(operator_sym);
  815. operator_sym
  816. = ch_p(T_DELETE) >> !(pp(T_LEFTBRACKET) >> pp(T_RIGHTBRACKET))
  817. | ch_p(T_NEW) >> !(pp(T_LEFTBRACKET) >> pp(T_RIGHTBRACKET))
  818. | pp(T_LEFTBRACKET) >> pp(T_RIGHTBRACKET)
  819. | ch_p(T_LEFTPAREN) >> ch_p(T_RIGHTPAREN)
  820. | pattern_p(OperatorTokenType, TokenTypeMask)
  821. ;
  822. HANNIBAL_REGISTER_RULE(conversion_function_id);
  823. conversion_function_id
  824. = ch_p(T_OPERATOR) >> conversion_type_id
  825. ;
  826. HANNIBAL_REGISTER_RULE( conversion_type_id);
  827. conversion_type_id
  828. = type_specifier_seq >> !conversion_declarator
  829. ;
  830. HANNIBAL_REGISTER_RULE(type_id);
  831. type_id
  832. = type_specifier_seq >> !abstract_declarator
  833. ;
  834. HANNIBAL_REGISTER_RULE(conversion_declarator);
  835. conversion_declarator
  836. = ptr_operator >> !conversion_declarator
  837. ;
  838. HANNIBAL_REGISTER_RULE(function_body);
  839. function_body
  840. = compound_statement
  841. ;
  842. HANNIBAL_REGISTER_RULE(compound_statement);
  843. compound_statement
  844. = comment_nest_p(ch_p(T_LEFTBRACE), ch_p(T_RIGHTBRACE))
  845. ; // TODO later
  846. HANNIBAL_REGISTER_RULE(ptr_operator);
  847. ptr_operator
  848. = ch_p(T_STAR) >> !cv_qualifier_seq
  849. | ch_p(T_AND)
  850. | !ch_p(T_COLON_COLON) >> nested_name_specifier
  851. >> ch_p(T_STAR) >> !cv_qualifier_seq
  852. ;
  853. HANNIBAL_REGISTER_RULE(decl_specifier);
  854. decl_specifier
  855. = no_type_decl_specifier
  856. | type_specifier
  857. ;
  858. HANNIBAL_REGISTER_RULE(no_type_decl_specifier);
  859. no_type_decl_specifier
  860. = storage_class_specifier
  861. | function_specifier
  862. | ch_p(T_FRIEND)
  863. | ch_p(T_TYPEDEF)
  864. | cv_qualifier
  865. | odd_language_extension
  866. ;
  867. HANNIBAL_REGISTER_RULE(type_specifier_seq);
  868. type_specifier_seq
  869. = +type_specifier
  870. ;
  871. HANNIBAL_REGISTER_RULE(type_specifier);
  872. type_specifier
  873. = enum_specifier
  874. | class_specifier
  875. | elaborated_type_specifier
  876. | simple_type_specifier
  877. | cv_qualifier
  878. ;
  879. HANNIBAL_REGISTER_RULE(cv_qualifier_seq);
  880. cv_qualifier_seq
  881. = cv_qualifier >> !cv_qualifier_seq
  882. ;
  883. HANNIBAL_REGISTER_RULE(cv_qualifier);
  884. cv_qualifier
  885. = ch_p(T_CONST)
  886. | ch_p(T_VOLATILE)
  887. ;
  888. HANNIBAL_REGISTER_RULE(enum_specifier);
  889. enum_specifier
  890. = enum_keyword >> !ch_p(T_IDENTIFIER)
  891. >> ch_p(T_LEFTBRACE) >> !enumerator_list >> ch_p(T_RIGHTBRACE)
  892. ;
  893. HANNIBAL_REGISTER_RULE(enum_keyword);
  894. enum_keyword
  895. = ch_p(T_ENUM)
  896. ;
  897. HANNIBAL_REGISTER_RULE(enumerator_list);
  898. enumerator_list
  899. = enumerator_definition % ch_p(T_COMMA)
  900. >> !ch_p(T_COMMA)
  901. // TODO find out if this last COMMA_T is an MS-"extension"?
  902. // it seems not to be in the grammar but MSVC 7.0 accepts it.
  903. ;
  904. HANNIBAL_REGISTER_RULE(enumerator_definition);
  905. enumerator_definition
  906. = enumerator >> !(ch_p(T_ASSIGN) >> constant_expression)
  907. ;
  908. HANNIBAL_REGISTER_RULE(enumerator);
  909. enumerator
  910. = ch_p(T_IDENTIFIER)
  911. ;
  912. HANNIBAL_REGISTER_RULE(simple_type_specifier);
  913. simple_type_specifier
  914. = !ch_p(T_COLON_COLON) >> !nested_name_specifier
  915. >> ch_p(T_TEMPLATE) >> template_id
  916. | +simple_type_name
  917. | !ch_p(T_COLON_COLON) >> !nested_name_specifier >> type_name
  918. ;
  919. HANNIBAL_REGISTER_RULE(class_head);
  920. class_head // DH changed the order because otherwise it would always parse the (!IDENTIFIER) part.
  921. = !access_specifier >> *odd_language_extension
  922. >> class_key >> *odd_language_extension
  923. >> (
  924. !nested_name_specifier >> template_id
  925. | nested_name_specifier >> ch_p(T_IDENTIFIER)
  926. | !ch_p(T_IDENTIFIER)
  927. )
  928. >> !base_clause
  929. ;
  930. HANNIBAL_REGISTER_RULE(type_name);
  931. type_name
  932. = class_name
  933. | enum_name
  934. | typedef_name
  935. ;
  936. HANNIBAL_REGISTER_RULE(elaborated_type_specifier);
  937. elaborated_type_specifier
  938. = class_key >> *odd_language_extension
  939. >> !ch_p(T_COLON_COLON)
  940. >> !nested_name_specifier
  941. >> (
  942. !ch_p(T_TEMPLATE) >> template_id
  943. | ch_p(T_IDENTIFIER)
  944. )
  945. | ch_p(T_ENUM) >> !ch_p(T_COLON_COLON)
  946. >> !nested_name_specifier
  947. >> ch_p(T_IDENTIFIER)
  948. | ch_p(T_TYPENAME)
  949. >> !ch_p(T_COLON_COLON)
  950. >> nested_name_specifier
  951. >> (
  952. !ch_p(T_TEMPLATE) >> template_id
  953. | ch_p(T_IDENTIFIER)
  954. )
  955. ;
  956. HANNIBAL_REGISTER_RULE(template_argument_list);
  957. template_argument_list
  958. = template_argument % ch_p(T_COMMA)
  959. ;
  960. HANNIBAL_REGISTER_RULE(template_argument);
  961. template_argument
  962. = longest_d
  963. [
  964. type_id
  965. | ta_assignment_expression
  966. | template_name
  967. ]
  968. ;
  969. HANNIBAL_REGISTER_RULE(class_key);
  970. class_key
  971. = class_keywords
  972. ;
  973. HANNIBAL_REGISTER_RULE(class_keywords);
  974. class_keywords
  975. = ch_p(T_CLASS)
  976. | ch_p(T_STRUCT)
  977. | ch_p(T_UNION)
  978. ;
  979. HANNIBAL_REGISTER_RULE(nested_name_specifier);
  980. nested_name_specifier
  981. = class_or_namespace_name >> ch_p(T_COLON_COLON)
  982. >> ch_p(T_TEMPLATE) >> nested_name_specifier
  983. | class_or_namespace_name >> ch_p(T_COLON_COLON)
  984. >> !nested_name_specifier
  985. ;
  986. HANNIBAL_REGISTER_RULE(class_or_namespace_name);
  987. class_or_namespace_name
  988. = class_name
  989. | namespace_name
  990. ;
  991. HANNIBAL_REGISTER_RULE(class_name);
  992. class_name
  993. = template_id
  994. | ch_p(T_IDENTIFIER)
  995. ;
  996. HANNIBAL_REGISTER_RULE(enum_name);
  997. enum_name
  998. = ch_p(T_IDENTIFIER)
  999. ;
  1000. HANNIBAL_REGISTER_RULE(typedef_name);
  1001. typedef_name
  1002. = ch_p(T_IDENTIFIER)
  1003. ;
  1004. HANNIBAL_REGISTER_RULE(namespace_name);
  1005. namespace_name // TODO
  1006. = ch_p(T_IDENTIFIER)
  1007. ;
  1008. HANNIBAL_REGISTER_RULE(template_id);
  1009. template_id
  1010. = template_name
  1011. >> ch_p(T_LESS) >> template_argument_list >> ch_p(T_GREATER)
  1012. ;
  1013. //
  1014. // This is kind of a HACK. We want to prevent the decl_specifier_seq
  1015. // from eating the whole declaration, including the ch_p(T_IDENTIFIER).
  1016. // Therefore in the sequence, we only allow one 'unknown' word
  1017. // (the type_specifier), the rest of the decl_specifier sequence
  1018. // must consist of known keywords or constructs (the
  1019. // no_type_decl_specifier).
  1020. // This means that a declaration like:
  1021. // MYDLL_EXPORT int f();
  1022. // will not be accepted unless the MYDLL_EXPORT is properly
  1023. // expanded by the preprocessor first.
  1024. //
  1025. // This should not cause any problems normally, it just means that
  1026. // this rule is not very robust in the case where not all symbols
  1027. // are known.
  1028. //
  1029. HANNIBAL_REGISTER_RULE(decl_specifier_seq);
  1030. decl_specifier_seq
  1031. = *no_type_decl_specifier >> type_specifier >> *no_type_decl_specifier
  1032. ;
  1033. // The following rule is more according to the standard grammar
  1034. // decl_specifier_seq // adapted
  1035. // = decl_specifier >> decl_specifier_seq
  1036. // | (decl_specifier - (declarator_id >> parameters_or_array_spec ))
  1037. // ;
  1038. HANNIBAL_REGISTER_RULE( storage_class_specifier);
  1039. storage_class_specifier
  1040. = ch_p(T_AUTO)
  1041. | ch_p(T_REGISTER)
  1042. | ch_p(T_STATIC)
  1043. | ch_p(T_EXTERN)
  1044. | ch_p(T_MUTABLE)
  1045. ;
  1046. HANNIBAL_REGISTER_RULE( function_specifier);
  1047. function_specifier
  1048. = ch_p(T_INLINE)
  1049. | ch_p(T_VIRTUAL)
  1050. | ch_p(T_EXPLICIT)
  1051. ;
  1052. HANNIBAL_REGISTER_RULE(class_specifier);
  1053. class_specifier
  1054. = class_head
  1055. >> ch_p(T_LEFTBRACE) >> !member_specification >> ch_p(T_RIGHTBRACE)
  1056. ;
  1057. HANNIBAL_REGISTER_RULE(member_specification);
  1058. member_specification
  1059. = +( access_specifier >> ch_p(T_COLON)
  1060. | member_declaration HANNIBAL_TRACE_ACTION("member declaration")
  1061. )
  1062. ;
  1063. // member_specification
  1064. // = access_specifier >> COLON_T >> !member_specification
  1065. // | member_declaration >> !member_specification
  1066. // ;
  1067. HANNIBAL_REGISTER_RULE(member_declaration);
  1068. member_declaration
  1069. = using_declaration
  1070. | template_declaration
  1071. | !decl_specifier_seq >> !member_declarator_list
  1072. >> ch_p(T_SEMICOLON)
  1073. | function_definition >>
  1074. !ch_p(T_SEMICOLON)
  1075. | qualified_id
  1076. >> ch_p(T_SEMICOLON)
  1077. ;
  1078. HANNIBAL_REGISTER_RULE(member_declarator_list);
  1079. member_declarator_list
  1080. = member_declarator % ch_p(T_COMMA)
  1081. ;
  1082. HANNIBAL_REGISTER_RULE(member_declarator);
  1083. member_declarator
  1084. = !ch_p(T_IDENTIFIER) >> ch_p(T_COLON) >> constant_expression
  1085. | declarator >> !(pure_specifier | constant_initializer)
  1086. ;
  1087. HANNIBAL_REGISTER_RULE(pure_specifier);
  1088. pure_specifier
  1089. = ch_p(T_ASSIGN) >> ch_p(T_INTLIT)
  1090. ;
  1091. HANNIBAL_REGISTER_RULE(constant_initializer);
  1092. constant_initializer
  1093. = ch_p(T_ASSIGN) >> constant_expression
  1094. ;
  1095. HANNIBAL_REGISTER_RULE(access_specifier);
  1096. access_specifier
  1097. = ch_p(T_PUBLIC)
  1098. | ch_p(T_PROTECTED)
  1099. | ch_p(T_PRIVATE)
  1100. ;
  1101. HANNIBAL_REGISTER_RULE(base_clause);
  1102. base_clause
  1103. = ch_p(T_COLON) >> base_specifier_list
  1104. ;
  1105. HANNIBAL_REGISTER_RULE(base_specifier_list);
  1106. base_specifier_list
  1107. = base_specifier % ch_p(T_COMMA)
  1108. ;
  1109. HANNIBAL_REGISTER_RULE(base_specifier);
  1110. base_specifier
  1111. = ch_p(T_VIRTUAL) >> !access_specifier >> !ch_p(T_COLON_COLON)
  1112. >> !nested_name_specifier >> class_name
  1113. | access_specifier >> !ch_p(T_VIRTUAL) >> !ch_p(T_COLON_COLON)
  1114. >> !nested_name_specifier >> class_name
  1115. | !ch_p(T_COLON_COLON) >> !nested_name_specifier >> class_name
  1116. ;
  1117. HANNIBAL_REGISTER_RULE(extension_type_decorator);
  1118. extension_type_decorator
  1119. = ch_p(T_MSEXT_CDECL)
  1120. | ch_p(T_MSEXT_DECLSPEC)
  1121. | ch_p(T_MSEXT_BASED)
  1122. | ch_p(T_MSEXT_FASTCALL)
  1123. | ch_p(T_MSEXT_INLINE)
  1124. ;
  1125. HANNIBAL_REGISTER_RULE(simple_type_name);
  1126. simple_type_name
  1127. = ch_p(T_CHAR)
  1128. | ch_p(T_WCHART)
  1129. | ch_p(T_BOOL)
  1130. | ch_p(T_SHORT)
  1131. | ch_p(T_INT)
  1132. | ch_p(T_LONG)
  1133. | ch_p(T_UNSIGNED)
  1134. | ch_p(T_SIGNED)
  1135. | ch_p(T_FLOAT)
  1136. | ch_p(T_DOUBLE)
  1137. | ch_p(T_VOID)
  1138. | ch_p(T_MSEXT_INT64)
  1139. | ch_p(T_MSEXT_INT8)
  1140. | ch_p(T_MSEXT_INT16)
  1141. | ch_p(T_MSEXT_INT32)
  1142. ;
  1143. }
  1144. rule_type const& start() const { return translation_unit; }
  1145. // Helper function wrapping pattern_p
  1146. static inline boost::wave::util::pattern_and< boost::wave::token_id>
  1147. pp (boost::wave::token_id id)
  1148. {
  1149. using namespace boost::wave;
  1150. return util::pattern_p(id, MainTokenMask);
  1151. }
  1152. };
  1153. #if HANNIBAL_DUMP_PARSE_TREE != 0
  1154. private:
  1155. template<typename Rule>
  1156. void declare_rule(Rule const& rule, std::string const& rule_name) const
  1157. {
  1158. if (rule_map_ptr)
  1159. (*rule_map_ptr)[rule.id()] = rule_name;
  1160. }
  1161. rule_map_type *rule_map_ptr;
  1162. #endif
  1163. };
  1164. #undef HANNIBAL_REGISTER_RULE
  1165. #undef HANNIBAL_TRACE_TRANSLATION_UNIT_GRAMMAR
  1166. #endif // HANNIBAL_TRANSLATION_UNIT_GRAMMAR_H_INCLUDED