59
59
while ((current = token_provider->current ())) {
60
60
token = current->type ();
63
if (token == TOK_SEMI_COLON ||
65
// TODO: checking the AspectC++ tokens here is really bad style
66
token == TOK_ADVICE ||
67
token == TOK_POINTCUT ||
70
(! braces && token == TOK_ASSIGN)) {
73
} else if (token == TOK_OPERATOR) {
74
skip (TOK_OPEN_ROUND, false);
75
// function `try' block, function body..
76
} else if (token == TOK_TRY || (braces &&
77
(token == TOK_OPEN_CURLY || token == TOK_COLON))) {
80
// class definition in function return type
81
} else if (token == TOK_OPEN_CURLY && ! braces) {
62
// before function parameter list
65
if (token == TOK_SEMI_COLON ||
67
token == TOK_ASSIGN ||
68
token == TOK_TYPEDEF) {
70
// structure definition in function return type
71
} else if (token == TOK_OPEN_CURLY) {
73
// array delimiter in return type
74
} else if (token == TOK_OPEN_SQUARE) {
75
skip_block (TOK_OPEN_SQUARE, TOK_CLOSE_SQUARE);
76
// function parameter list
77
} else if (token == TOK_OPEN_ROUND) {
82
token_provider->next ();
85
// after function parameter list
88
if (token == TOK_SEMI_COLON ||
90
token == TOK_OPEN_ROUND) {
92
// asm declaration specifier
93
} else if (token == TOK_ASM) {
97
} else if (token == TOK_OPEN_CURLY) {
100
// K&R function parameter declaration
102
static int stop_tokens[] = { TOK_SEMI_COLON, 0 };
103
skip (stop_tokens, true);
108
token_provider->set_state (s);
112
bool CSyntax::is_ass_expr () {
114
static Token *last_token = 0;
115
static bool last_result = false;
117
Token *current = token_provider->current ();
121
// return the last result if we check the same token
122
if (last_token == current)
125
last_token = current;
128
State s = token_provider->get_state ();
130
while ((current = token_provider->current ())) {
131
token = current->type ();
133
if (token == TOK_SEMI_COLON || token == TOK_COMMA ||
134
token == TOK_CLOSE_CURLY || token == TOK_CLOSE_ROUND ||
135
token == TOK_CLOSE_SQUARE || token == TOK_COLON ||
136
token == TOK_QUESTION) {
138
} else if (token == TOK_OPEN_CURLY) {
82
139
skip_curly_block ();
83
// member initialization list
84
} else if (token == TOK_COLON && braces) {
85
skip (TOK_OPEN_CURLY, false);
140
} else if (token == TOK_OPEN_ROUND) {
87
142
} else if (token == TOK_OPEN_SQUARE) {
88
143
skip_block (TOK_OPEN_SQUARE, TOK_CLOSE_SQUARE);
90
} else if (token == TOK_LESS) {
91
skip_block (TOK_LESS, TOK_GREATER);
92
// function parameter list
93
} else if (token == TOK_OPEN_ROUND) {
97
} else if (token == TOK_THROW) {
144
} else if (token == TOK_ASSIGN || token == TOK_MUL_EQ ||
145
token == TOK_DIV_EQ || token == TOK_MOD_EQ ||
146
token == TOK_ADD_EQ || token == TOK_SUB_EQ ||
147
token == TOK_RSH_EQ || token == TOK_LSH_EQ ||
148
token == TOK_AND_EQ || token == TOK_XOR_EQ ||
149
token == TOK_IOR_EQ) {
102
token_provider->next ();
107
157
token_provider->set_state (s);
111
161
/*****************************************************************************/
381
432
CTree *CSyntax::cast_expr () {
383
// 2+: cast_expr1... unary_expr
384
return /* (parse (&CSyntax::unary_expr) || */
385
(opt (seq (&CSyntax::cast_expr1)) && parse (&CSyntax::unary_expr)) ?
435
return (parse (&CSyntax::cast_expr1) || parse (&CSyntax::unary_expr)) ?
386
436
builder ().cast_expr () : (CTree*)0;
389
439
CTree *CSyntax::cast_expr1 () {
391
return (parse (TOK_OPEN_ROUND) && parse (&CSyntax::type_id) &&
392
parse (TOK_CLOSE_ROUND)) ?
440
// 2+: cast_expr2... unary_expr
441
return (seq (&CSyntax::cast_expr2) && parse (&CSyntax::unary_expr)) ?
393
442
builder ().cast_expr1 () : (CTree*)0;
445
CTree *CSyntax::cast_expr2 () {
447
return (parse (TOK_OPEN_ROUND) && parse (&CSyntax::type_id) &&
448
parse (TOK_CLOSE_ROUND)) ?
449
builder ().cast_expr2 () : (CTree*)0;
396
452
CTree *CSyntax::mul_expr () {
398
454
// 3+: cast_expr any_mul_op cast_expr ...
490
546
static int any_ass_op[] = { TOK_ASSIGN, TOK_MUL_EQ, TOK_DIV_EQ, TOK_MOD_EQ,
491
547
TOK_ADD_EQ, TOK_SUB_EQ, TOK_RSH_EQ, TOK_LSH_EQ,
492
548
TOK_AND_EQ, TOK_XOR_EQ, TOK_IOR_EQ, 0 };
493
return (parse (&CSyntax::unary_expr) && parse (any_ass_op)) ?
549
return (is_ass_expr () && parse (&CSyntax::unary_expr) && parse (any_ass_op)) ?
494
550
builder ().ass_expr1 () : (CTree*)0;
668
724
return (is_fct_def () ? parse (&CSyntax::fct_def) :
669
(parse (&CSyntax::block_decl)/* ||
670
parse (&CSyntax::fct_def)*/)) ?
725
(parse (&CSyntax::block_decl) ||
726
parse (&CSyntax::fct_def))) ?
671
727
builder ().decl () : (CTree*)0;
674
730
CTree *CSyntax::block_decl () {
675
731
// 1: simple_decl
676
return parse (&CSyntax::simple_decl) ?
733
return (parse (&CSyntax::simple_decl) ||
734
parse (&CSyntax::asm_def))?
677
735
builder ().block_decl () : (CTree*)0;
682
740
// 2: decl_spec_seq ;
683
741
// 3: decl_spec_seq init_declarator_list ;
684
742
if (parse (TOK_SEMI_COLON) ||
685
((parse (&CSyntax::decl_spec_seq) ||
686
semantic ().implicit_int ()) &&
687
((!look_ahead (TOK_SEMI_COLON) &&
743
((parse (&CSyntax::decl_spec_seq) || semantic ().implicit_int ()) &&
744
((! look_ahead (TOK_SEMI_COLON) &&
688
745
parse (&CSyntax::init_declarator_list)),
689
746
parse (TOK_SEMI_COLON)))) {
690
semantic ().finish_decl ();
691
return builder ().simple_decl ();
747
semantic ().finish_decl ();
748
return builder ().simple_decl ();
697
753
void CSyntax::init_decl_spec () {
922
986
builder ().init_declarator_list () : (CTree*)0;
989
// this is only a hook for optional extension introduced by aspects
990
// TODO: better decouple syntax and semantic completely and weave advice
992
CTree *CSyntax::init_declarator_ext () {
925
996
CTree *CSyntax::init_declarator () {
927
998
// 2: declarator init
999
// 2: declarator init_declarator_ext_list
1000
// 3: declarator init_declarator_ext_list init
928
1001
if (! parse (&CSyntax::declarator)) {
929
1002
semantic ().finish_declarator ();
930
1003
return (CTree*)0;
1006
// parse optional init declarator extensions, such as GNU asm("symbol")
1007
parse (&CSyntax::init_declarator_ext);
933
1009
// first introduce the new name (if any)
934
1010
// before parsing the intializer