構造体 テンプレート toppers::c_expr_parser_base< Derived >::definition< Scanner >

文法定義 [詳細]

#include "toppers/c_expr.hpp"

すべてのメンバ一覧

Public 型

typedef boost::spirit::rule<
Scanner > 
rule_t

Public メソッド

 definition (const Derived &self)
 コンストラクタ

Public 変数

rule_t primary_expression
rule_t expression
rule_t constant_expression
rule_t conditional_expression
rule_t assignment_expression
rule_t assignment_operator
rule_t postfix_expression
rule_t unary_expression
rule_t unary_operator
rule_t cast_expression
rule_t multiplicative_expression
rule_t additive_expression
rule_t shift_expression
rule_t relational_expression
rule_t equality_expression
rule_t AND_expression
rule_t exclusive_OR_expression
rule_t inclusive_OR_expression
rule_t logical_AND_expression
rule_t logical_OR_expression
rule_t string_literal
rule_t constant
rule_t floating_constant
rule_t decimal_floating_constant
rule_t hexadecimal_floating_constant
rule_t integer_constant
rule_t character_constant
rule_t declaration_specifiers
rule_t type_name
rule_t specifier_qualifier_list
rule_t storage_class_specifier
rule_t type_specifier
rule_t type_qualifier
rule_t declarator
rule_t direct_declarator
rule_t struct_or_union_specifier
rule_t struct_declaration
rule_t struct_declarator
rule_t enum_specifier
rule_t enumerator
rule_t abstract_declarator
rule_t pointer
rule_t parameter_type_list
rule_t parameter_list
rule_t parameter_declaration
rule_t direct_abstract_declarator
c_ident_parser_t identifier
c_strlit_parser_t c_strlit_p
c_chlit_parser_t c_chlit_p


説明

template<class Derived>
template<class Scanner>
struct toppers::c_expr_parser_base< Derived >::definition< Scanner >

文法定義

c_expr.hpp88 行で定義されています。


コンストラクタとデストラクタ

template<class Derived>
template<class Scanner>
toppers::c_expr_parser_base< Derived >::definition< Scanner >::definition const Derived &  self  )  [inline]
 

コンストラクタ

引数:
self 文法クラス( c_expr_parser_base<Derived> クラスからの継承)への参照

c_expr.hpp146 行で定義されています。

参照先 toppers::c_expr_parser_base< Derived >::definition< Scanner >::abstract_declaratortoppers::c_expr_parser_base< Derived >::definition< Scanner >::additive_expressiontoppers::c_expr_parser_base< Derived >::definition< Scanner >::AND_expressiontoppers::c_expr_parser_base< Derived >::definition< Scanner >::assignment_expressiontoppers::c_expr_parser_base< Derived >::definition< Scanner >::assignment_operatortoppers::c_expr_parser_base< Derived >::definition< Scanner >::c_chlit_ptoppers::c_expr_parser_base< Derived >::definition< Scanner >::c_strlit_ptoppers::c_expr_parser_base< Derived >::definition< Scanner >::cast_expressiontoppers::c_expr_parser_base< Derived >::definition< Scanner >::character_constanttoppers::c_expr_parser_base< Derived >::definition< Scanner >::conditional_expressiontoppers::c_expr_parser_base< Derived >::definition< Scanner >::constanttoppers::c_expr_parser_base< Derived >::definition< Scanner >::constant_expressiontoppers::c_expr_parser_base< Derived >::definition< Scanner >::decimal_floating_constanttoppers::c_expr_parser_base< Derived >::definition< Scanner >::declaration_specifierstoppers::c_expr_parser_base< Derived >::definition< Scanner >::declaratortoppers::c_expr_parser_base< Derived >::definition< Scanner >::direct_abstract_declaratortoppers::c_expr_parser_base< Derived >::definition< Scanner >::direct_declaratortoppers::c_expr_parser_base< Derived >::definition< Scanner >::enum_specifiertoppers::c_expr_parser_base< Derived >::definition< Scanner >::enumeratortoppers::c_expr_parser_base< Derived >::definition< Scanner >::equality_expressiontoppers::c_expr_parser_base< Derived >::definition< Scanner >::exclusive_OR_expressiontoppers::c_expr_parser_base< Derived >::definition< Scanner >::expressiontoppers::c_expr_parser_base< Derived >::definition< Scanner >::floating_constanttoppers::c_expr_parser_base< Derived >::definition< Scanner >::hexadecimal_floating_constanttoppers::c_expr_parser_base< Derived >::definition< Scanner >::identifiertoppers::c_expr_parser_base< Derived >::definition< Scanner >::inclusive_OR_expressiontoppers::c_expr_parser_base< Derived >::definition< Scanner >::integer_constanttoppers::c_expr_parser_base< Derived >::definition< Scanner >::logical_AND_expressiontoppers::c_expr_parser_base< Derived >::definition< Scanner >::logical_OR_expressiontoppers::c_expr_parser_base< Derived >::definition< Scanner >::multiplicative_expressiontoppers::c_expr_parser_base< Derived >::definition< Scanner >::parameter_declarationtoppers::c_expr_parser_base< Derived >::definition< Scanner >::parameter_listtoppers::c_expr_parser_base< Derived >::definition< Scanner >::parameter_type_listtoppers::c_expr_parser_base< Derived >::definition< Scanner >::pointertoppers::c_expr_parser_base< Derived >::definition< Scanner >::postfix_expressiontoppers::c_expr_parser_base< Derived >::definition< Scanner >::primary_expressiontoppers::c_expr_parser_base< Derived >::definition< Scanner >::relational_expressiontoppers::c_expr_parser_base< Derived >::definition< Scanner >::shift_expressiontoppers::c_expr_parser_base< Derived >::definition< Scanner >::specifier_qualifier_listtoppers::c_expr_parser_base< Derived >::definition< Scanner >::storage_class_specifiertoppers::c_expr_parser_base< Derived >::definition< Scanner >::string_literaltoppers::c_expr_parser_base< Derived >::definition< Scanner >::struct_declarationtoppers::c_expr_parser_base< Derived >::definition< Scanner >::struct_declaratortoppers::c_expr_parser_base< Derived >::definition< Scanner >::struct_or_union_specifiertoppers::c_expr_parser_base< Derived >::definition< Scanner >::type_nametoppers::c_expr_parser_base< Derived >::definition< Scanner >::type_qualifiertoppers::c_expr_parser_base< Derived >::definition< Scanner >::type_specifiertoppers::c_expr_parser_base< Derived >::definition< Scanner >::unary_expressiontoppers::c_expr_parser_base< Derived >::definition< Scanner >::unary_operator.

00147         : identifier( c_ident_parser( self.ucn_, self.c_plus_plus_ ) ),
00148           c_strlit_p( c_strlit_parser( self.codeset_ ) ),
00149           c_chlit_p( c_chlit_parser( self.codeset_ ) )
00150       {
00151         using namespace boost::spirit;
00152         static const functor_parser<detail::c_integer_constant_parse_functor<boost::uintmax_t> > c_int_const_p;
00153         static const functor_parser<detail::c_integer_suffix_parse_functor> c_int_suffix_p;
00154 
00155         primary_expression =  // 複合リテラル未対応
00156             identifier
00157           | constant
00158           | string_literal
00159           | ( '(' >> expression >> ')' );
00160         expression =
00161             assignment_expression % ',';
00162         constant_expression = 
00163             conditional_expression;
00164         conditional_expression =
00165             logical_OR_expression >> *( '\?' >> expression >> ':' >> logical_OR_expression );
00166         assignment_expression =
00167            *( unary_expression >> assignment_operator ) >> conditional_expression;
00168         assignment_operator =
00169             ch_p( '=' ) | "*=" | "/=" | "%=" | "+=" | "?=" | "<<=" | ">>=" | "&=" | "^=" | "|=";
00170         postfix_expression =
00171             primary_expression >>
00172           *(
00173                 ( '[' >> expression >> ']' )
00174               | ( '(' >> list_p( assignment_expression, ',' ) >> ')' )
00175               | ( '.' >> identifier )
00176               | ( "->" >> identifier )
00177               | "++"
00178               | "--"
00179             );
00180         unary_expression =
00181            *( str_p( "++" ) || "--" ) >>
00182             (
00183                 ( "sizeof" >> unary_expression )
00184               | ( str_p( "sizeof" ) >> '(' >> type_name >> ')' )
00185               | postfix_expression
00186               | ( unary_operator >> cast_expression )
00187             );
00188         unary_operator =
00189             chset<>( "&*~!+-" );
00190         cast_expression =
00191            *( '(' >> type_name >> ')' ) >> unary_expression;
00192         multiplicative_expression =
00193             cast_expression >>
00194            *(
00195                 ( '*' >> cast_expression )
00196               | ( '/' >> cast_expression )
00197               | ( '%' >> cast_expression )
00198             );
00199         additive_expression =
00200             multiplicative_expression >>
00201            *(
00202                 ( '+' >> multiplicative_expression )
00203               | ( '-' >> multiplicative_expression )
00204             );
00205         shift_expression =
00206             additive_expression >>
00207            *(
00208                 ( "<<" >> additive_expression )
00209               | ( ">>" >> additive_expression )
00210             );
00211         relational_expression =
00212             shift_expression >>
00213            *(
00214                 ( '<' >> shift_expression )
00215               | ( '>' >> shift_expression )
00216               | ( "<=" >> shift_expression )
00217               | ( ">=" >> shift_expression )
00218             );
00219         equality_expression =
00220             relational_expression >>
00221            *(
00222                 ( "==" >> relational_expression )
00223               | ( "!=" >> relational_expression )
00224             );
00225         AND_expression =
00226             equality_expression >> *( '&' >> equality_expression );
00227         exclusive_OR_expression =
00228             AND_expression >> *( '^' >> AND_expression );
00229         inclusive_OR_expression =
00230             exclusive_OR_expression >> *( '|' >> exclusive_OR_expression );
00231         logical_AND_expression =
00232             inclusive_OR_expression >> *( "&&" >> inclusive_OR_expression );
00233         logical_OR_expression =
00234             logical_AND_expression >> *( "||" >> logical_AND_expression );
00235         string_literal =
00236             c_strlit_p
00237           | lexeme_d[ 'L' >> c_strlit_p ];
00238         constant =
00239             floating_constant
00240           | integer_constant
00241           | identifier  // 列挙定数
00242           | character_constant;
00243         floating_constant =
00244             decimal_floating_constant
00245           | hexadecimal_floating_constant;
00246         decimal_floating_constant =
00247             lexeme_d
00248             [
00249               as_lower_d
00250               [
00251                 ( ( *digit_p >> '.' >> +digit_p ) | ( +digit_p >> '.' ) ) >>
00252                 'e' >> !chset<>( "+-" ) >> +digit_p >>
00253                 !chset<>( "fl" )
00254               ]
00255             ];
00256         hexadecimal_floating_constant =
00257             lexeme_d
00258             [
00259               as_lower_d
00260               [
00261                 "0x" >>
00262                 ( ( *xdigit_p >> '.' >> +xdigit_p ) | ( +xdigit_p >> '.' ) ) >>
00263                 'p' >> !chset<>( "+-" ) >> +digit_p >>
00264                 !chset<>( "fl" )
00265               ]
00266             ];
00267         integer_constant =
00268             lexeme_d[ c_int_const_p >> !c_int_suffix_p ];
00269         character_constant =
00270             c_chlit_p
00271           | lexeme_d[ 'L' >> c_chlit_p ];
00272         declaration_specifiers =
00273            +( storage_class_specifier | type_specifier | type_qualifier );
00274         type_name =
00275             specifier_qualifier_list >> !abstract_declarator;
00276         specifier_qualifier_list =
00277            +( type_specifier | type_qualifier );
00278         storage_class_specifier =
00279             str_p( "auto" )
00280           | "register"
00281           | "static"
00282           | "extern"
00283           | "typedef";
00284         type_specifier =
00285             str_p( "void" ) | "char" | "short" | "int" | "long" | "float" | "double"
00286           | "signed" | "unsigned"
00287           | identifier
00288           | struct_or_union_specifier
00289           | enum_specifier;
00290         type_qualifier =
00291             str_p( "const" ) | "volatile" | "restrict";
00292         declarator =
00293             !pointer >> direct_declarator;
00294         direct_declarator = 
00295             ( identifier | ( '(' >> declarator >> ')' ) )
00296             >>
00297           *(
00298                 ( '[' >> !constant_expression >> ']' )
00299               | ( '(' >> parameter_type_list >> ')' )
00300               | ( '(' >> !( identifier % ',' ) >> ')' )
00301             );
00302         struct_or_union_specifier =
00303             lexeme_d[ ( str_p( "struct" ) | "union" ) >> +space_p >> identifier ]
00304           | ( lexeme_d[ ( str_p( "struct" ) | "union" ) >> +space_p >> !identifier ] >> '{' >> +struct_declaration >> '}' );
00305         struct_declaration =
00306             specifier_qualifier_list >> !list_p( struct_declarator, ',' ) >> ';';
00307             // lisp_p( struct_declarator, ',' )を省略可能としているのは、
00308             // struct_declaratorのidentifierをspecifier_qualifier_listが
00309             // typedef名と間違うことを回避するため
00310         struct_declarator =
00311             ( !declarator >> ':' >> constant_expression ) // ビットフィールド
00312           | declarator;
00313         enum_specifier =
00314             ( lexeme_d[ "enum" >> +space_p >> !identifier ] >> '{' >> list_p( enumerator, ',', ',' ) >> '}' )   // C99では末尾のカンマがあってもよい
00315           | lexeme_d[ "enum" >> +space_p >> identifier ];
00316         enumerator =
00317             identifier >> !( '=' >> constant_expression );
00318         abstract_declarator =
00319             ( !pointer >> direct_abstract_declarator )
00320           | pointer;
00321         pointer =
00322            +( '*' >> *type_qualifier );
00323         parameter_type_list =
00324             parameter_list >> !( ch_p( ',' ) >> "..." );  // 可変個引数
00325         parameter_list =
00326             parameter_declaration % ',';
00327         parameter_declaration = 
00328             ( declaration_specifiers >> declarator )
00329           | ( declaration_specifiers >> !abstract_declarator );
00330         direct_abstract_declarator =
00331             (
00332              !( '(' >> abstract_declarator >> ')' ) >>
00333              +(
00334                   ( '[' >> !constant_expression >> ']' )
00335                 | ( '(' >> !parameter_type_list >> ')' ) 
00336               )
00337             )
00338           | ( '(' >> abstract_declarator >> ')' );
00339       }


この構造体の説明は次のファイルから生成されました:
Copyright © 2006 by TAKAGI Nobuhisa.
このページは Wed Apr 12 16:32:02 2006 に Doxygen によって生成されました。