| grammar Common; |
| |
| import ModuleLex, Action; |
| |
| unary_operator : '&' | '*' | '+'| '-' | '~' | '!'; |
| relational_operator: ('<'|'>'|'<='|'>='); |
| |
| constant |
| : HEX_LITERAL |
| | OCTAL_LITERAL |
| | DECIMAL_LITERAL |
| | BINARY_LITERAL |
| | STRING |
| | MULTILINE_STRING |
| | CHAR |
| | FLOATING_POINT_LITERAL |
| ; |
| |
| // keywords & operators |
| |
| function_decl_specifiers: ('inline' | 'virtual' | 'explicit' | 'friend' | 'static'); |
| ptr_operator: ('*' | '&'); |
| |
| access_specifier: ('public' | 'private' | 'protected'); |
| |
| operator: (('new' | 'delete' ) ('[' ']')?) |
| | '+' | '-' | '*' | '/' | '%' |'^' | '&' | '|' | '~' |
| | '!' | '=' | '<' | '>' | '+=' | '-=' | '*=' |
| | '/=' | '%=' | '^=' | '&=' | '|=' | '>>' |
| |'<<'| '>>=' | '<<=' | '==' | '!=' |
| | '<=' | '>=' | '&&' | '||' | '++' | '--' |
| | ',' | '->*' | '->' | '(' ')' | '[' ']' |
| ; |
| |
| assignment_operator: '=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' | '>>=' | '&=' | '^=' | '|='; |
| equality_operator: ('=='| '!='); |
| |
| // TODO: Does not support default types (e.g. template<typename N = int>). To achieve extend template_decl_param. |
| template_decl: TEMPLATE '<' template_decl_param_list? '>'; |
| template_decl_param_list: template_template template_decl_keyword template_name | |
| template_decl_param | |
| template_decl_param_list ',' template_decl_param; |
| template_template: TEMPLATE '<' (template_decl_keyword ','?)+ '>'; |
| template_decl_param: (template_decl_keyword | CV_QUALIFIER? identifier) template_name? ptr_operator?; |
| template_decl_keyword: 'typename' | 'class'; |
| template_name: ALPHA_NUMERIC+ ELLIPSIS? ; |
| |
| template_args: '<' template_args_param_list? '>'; |
| template_args_param_list: template_args_param | |
| template_args_param_list ',' template_args_param; |
| template_args_param: CV_QUALIFIER? base_type ptr_operator?; |
| |
| // water |
| |
| no_brackets: ~('(' | ')'); |
| no_brackets_curlies_or_squares: ~('(' | ')' | '{' | '}' | '[' | ']'); |
| no_brackets_or_semicolon: ~('(' | ')' | ';'); |
| no_angle_brackets_or_brackets : ~('<' | '>' | '(' | ')'); |
| no_curlies: ~('{' | '}'); |
| no_squares: ~('[' | ']'); |
| no_squares_or_semicolon: ~('[' | ']' | ';'); |
| no_comma_or_semicolon: ~(',' | ';'); |
| |
| assign_water: ~('(' | ')' | '{' | '}' | '[' | ']' | ';' | ','); |
| assign_water_l2: ~('(' | ')' | '{' | '}' | '[' | ']'); |
| |
| water: .; |
| |
| |
| |
| // operator-identifiers not implemented |
| identifier : (ALPHA_NUMERIC ('::' ALPHA_NUMERIC)*) | access_specifier; |
| number: HEX_LITERAL | DECIMAL_LITERAL | OCTAL_LITERAL; |
| |
| ptrs: (CV_QUALIFIER? ptr_operator 'restrict'?)+; |
| func_ptrs: ptrs; |
| rvalue_ref: '&&'; |
| |
| class_key: 'struct' | 'class' | 'union' | 'enum'; |
| |
| class_def: template_decl* class_key gcc_attribute? class_name? template_args? base_classes? OPENING_CURLY skip_to_end_of_object; |
| class_name: identifier; |
| base_classes: ':' base_class (',' base_class)*; |
| base_class: VIRTUAL? access_specifier? identifier template_args?; |
| |
| |
| type_name : (CV_QUALIFIER* (class_key | UNSIGNED | SIGNED)? |
| base_type template_args? ('::' base_type template_args? )*) CV_QUALIFIER? |
| | UNSIGNED |
| | SIGNED |
| ; |
| |
| base_type: ((ALPHA_NUMERIC | AUTO | VOID | LONG | LONG) ELLIPSIS?)+; |
| |
| gcc_attribute: GCC_ATTRIBUTE '(' '(' identifier ')' ')'; |
| |
| expr: assign_expr (',' expr)?; |
| |
| assign_expr: conditional_expression (assignment_operator assign_expr)?; |
| conditional_expression: or_expression #normOr |
| | or_expression ('?' expr ':' conditional_expression) #cndExpr; |
| |
| |
| or_expression : and_expression ('||' or_expression)?; |
| and_expression : inclusive_or_expression ('&&' and_expression)?; |
| inclusive_or_expression: exclusive_or_expression ('|' inclusive_or_expression)?; |
| exclusive_or_expression: bit_and_expression ('^' exclusive_or_expression)?; |
| bit_and_expression: equality_expression ('&' bit_and_expression)?; |
| equality_expression: relational_expression (equality_operator equality_expression)?; |
| relational_expression: shift_expression (relational_operator relational_expression)?; |
| shift_expression: additive_expression ( ('<<'|'>>') shift_expression)?; |
| additive_expression: multiplicative_expression (('+'| '-') additive_expression)?; |
| multiplicative_expression: cast_expression ( ('*'| '/'| '%') multiplicative_expression)?; |
| |
| cpp_cast_identifier: 'const_cast' | 'static_cast' | 'dynamic_cast' | 'reinterpret_cast'; |
| |
| cast_expression: ('(' cast_target ')' cast_expression) |
| | cpp_cast_identifier '<' cast_target '>' '(' cast_expression ')' |
| | unary_expression |
| ; |
| |
| cast_target: type_name ptr_operator*; |
| |
| unary_expression: inc_dec cast_expression |
| | unary_op_and_cast_expr |
| | sizeof_expression |
| | new_expression |
| | delete_expression |
| | postfix_expression |
| ; |
| |
| new_expression: '::'? NEW type_name '[' conditional_expression? ']' |
| | '::'? NEW type_name '(' expr? ')' |
| ; |
| |
| delete_expression: DELETE identifier | |
| DELETE '[' ']' identifier; |
| |
| unary_op_and_cast_expr: unary_operator cast_expression; |
| |
| sizeof_expression: sizeof sizeof_operand2 |
| | sizeof '(' sizeof_operand2 ')' |
| | sizeof '(' sizeof_operand ')'; |
| |
| sizeof: 'sizeof'; |
| |
| sizeof_operand: type_name ptr_operator *; |
| sizeof_operand2: unary_expression; |
| |
| inc_dec: ('--' | '++'); |
| |
| // this is a bit misleading. We're just allowing access_specifiers |
| // here because C programs can use 'public', 'protected' or 'private' |
| // as variable names. |
| |
| postfix_expression: postfix_expression '[' expr ']' #arrayIndexing |
| | postfix_expression '(' function_argument_list ')' #funcCall |
| | postfix_expression '.' TEMPLATE? (identifier) #memberAccess |
| | postfix_expression '->' TEMPLATE? (identifier) #ptrMemberAccess |
| | postfix_expression inc_dec #incDecOp |
| | primary_expression # primaryOnly |
| ; |
| |
| function_argument_list: ( function_argument (',' function_argument)* )?; |
| function_argument: assign_expr; |
| |
| |
| primary_expression: identifier | constant | '(' expr ')'; |