blob: bc9e9ab8711b8c0877afeed4c2ce9a5b92d4c4c3 [file] [log] [blame]
-----------------------------------------------------------------------------------
-- Copyright (c) 2008, 2009 IBM Corporation and others.
-- This program and the accompanying materials
-- are made available under the terms of the Eclipse Public License 2.0
-- which accompanies this distribution, and is available at
-- https://www.eclipse.org/legal/epl-2.0/
--
-- SPDX-License-Identifier: EPL-2.0
--
-- Contributors:
-- IBM Corporation - initial API and implementation
-----------------------------------------------------------------------------------
-- These are additional rules that allow for parsing of GNU extensions.
-- This file is intended to be mixed-in with C99Parser.g or GPPParser.g
$Terminals
-- additional GCC only tokens as defined in IGCCToken
typeof
__alignof__
__attribute__
__declspec
MAX
MIN
MAX ::= '>?'
MIN ::= '<?'
$End
$Headers
/.
private $gnu_action_class gnuAction;
./
$End
$Globals
/.
import org.eclipse.cdt.core.dom.lrparser.action.gnu.GNUBuildASTParserAction;
./
$End
$Define
$gnu_action_class /. GNUBuildASTParserAction ./ -- overridable
$action_initializations /.
gnuAction = new $gnu_action_class (this, astStack, $node_factory_create_expression);
gnuAction.setParserProperties(properties);
./
$End
$Rules
------------------------------------------------------------------------------------
-- Support for __attribute__ and __declspec
------------------------------------------------------------------------------------
attribute_or_decl_specifier
::= attribute_specifier
| decl_specifier
| asm_label
attribute_or_decl_specifier_seq
::= attribute_or_decl_specifier
| attribute_or_decl_specifier_seq attribute_or_decl_specifier
attribute_specifier
::= '__attribute__' '(' '(' attribute_list ')' ')'
| '__attribute__' '(' ')'
attribute_list
::= attribute
| attribute_list ',' attribute
attribute
::= word
| word '(' attribute_parameter_list ')'
| $empty
word
::= 'identifier'
| 'const'
attribute_parameter_list
::= attribute_parameter
| attribute_parameter_list ',' attribute_parameter
attribute_parameter
::= assignment_expression
/. $Build consumeIgnore(); $EndBuild ./
| $empty
decl_specifier
::= '__declspec' '(' extended_decl_modifier_seq ')'
| '__declspec' '(' ')'
extended_decl_modifier_seq
::= extended_decl_modifier
| extended_decl_modifier_seq extended_decl_modifier
extended_decl_modifier
::= 'identifier'
| 'identifier' '(' ')'
| 'identifier' '(' 'identifier' ')'
| 'identifier' '(' 'stringlit' ')'
------------------------------------------------------------------------------------
-- Other stuff
------------------------------------------------------------------------------------
asm_label
::= 'asm' '(' 'stringlit' ')'
extended_asm_declaration
::= 'asm' volatile_opt '(' extended_asm_param_seq ')' ';'
/. $BeginAction gnuAction.consumeDeclarationASM(); $EndAction ./
volatile_opt ::= 'volatile' | $empty
extended_asm_param_seq
::= extended_asm_param_with_operand
| extended_asm_param_seq ':' extended_asm_param_with_operand
extended_asm_param_with_operand
::= extended_asm_param
| extended_asm_param ',' extended_asm_param
| $empty
extended_asm_param
::= 'stringlit'
| 'stringlit' '(' 'identifier' ')'
| 'stringlit' '(' '*' 'identifier' ')'
unary_expression
::= '__alignof__' unary_expression
/. $Build consumeExpressionUnaryOperator(IASTUnaryExpression.op_alignOf); $EndBuild ./
| '__alignof__' '(' type_id ')'
/. $Build consumeExpressionTypeId(IASTTypeIdExpression.op_alignof); $EndBuild ./
| 'typeof' unary_expression
/. $Build consumeExpressionUnaryOperator(IASTUnaryExpression.op_typeof); $EndBuild ./
| 'typeof' '(' type_id ')'
/. $Build consumeExpressionTypeId(IASTTypeIdExpression.op_typeof); $EndBuild ./
relational_expression
::= relational_expression '>?' shift_expression
/. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_max); $EndBuild ./
| relational_expression '<?' shift_expression
/. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_min); $EndBuild ./
conditional_expression
::= logical_or_expression '?' <empty> ':' assignment_expression
/. $Build consumeExpressionConditional(); $EndBuild ./
primary_expression
::= '(' compound_statement ')'
/. $BeginAction gnuAction.consumeCompoundStatementExpression(); $EndAction ./
labeled_statement
::= 'case' case_range_expression ':' statement
/. $Build consumeStatementCase(); $EndBuild ./
case_range_expression
::= constant_expression '...' constant_expression
/. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_assign); $EndBuild ./
typeof_declaration_specifiers
::= typeof_type_specifier
| no_type_declaration_specifiers typeof_type_specifier
| typeof_declaration_specifiers no_type_declaration_specifier
typeof_type_specifier
::= 'typeof' unary_expression
/. $Build consumeExpressionUnaryOperator(IASTUnaryExpression.op_typeof); $EndBuild ./
| 'typeof' '(' type_id ')'
/. $Build consumeExpressionTypeId(IASTTypeIdExpression.op_typeof); $EndBuild ./
declaration_specifiers
::= <openscope-ast> typeof_declaration_specifiers
/. $Build consumeDeclarationSpecifiersTypeof(); $EndBuild ./
$End