diff options
Diffstat (limited to 'lrparser/org.eclipse.cdt.core.lrparser/grammar/c99/C99Parser.g')
-rw-r--r-- | lrparser/org.eclipse.cdt.core.lrparser/grammar/c99/C99Parser.g | 1265 |
1 files changed, 1265 insertions, 0 deletions
diff --git a/lrparser/org.eclipse.cdt.core.lrparser/grammar/c99/C99Parser.g b/lrparser/org.eclipse.cdt.core.lrparser/grammar/c99/C99Parser.g new file mode 100644 index 00000000000..e313c24b6e6 --- /dev/null +++ b/lrparser/org.eclipse.cdt.core.lrparser/grammar/c99/C99Parser.g @@ -0,0 +1,1265 @@ +----------------------------------------------------------------------------------- +-- Copyright (c) 2006, 2008 IBM Corporation and others. +-- All rights reserved. This program and the accompanying materials +-- are made available under the terms of the Eclipse Public License v1.0 +-- which accompanies this distribution, and is available at +-- http://www.eclipse.org/legal/epl-v10.html +-- +-- Contributors: +-- IBM Corporation - initial API and implementation +----------------------------------------------------------------------------------- + +%options la=2 +%options package=org.eclipse.cdt.internal.core.dom.lrparser.c99 +%options template=TrialUndoParserTemplate.g + +--$Include +--../common.g +--$End + +$Notice +-- Copied into all files generated by LPG +/./******************************************************************************* + * Copyright (c) 2006, 2008 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + *********************************************************************************/ + + // This file was generated by LPG +./ +$End + +$Terminals + + -- Keywords + + auto break case char const continue default do + double else enum extern float for goto if + inline int long register restrict return short signed + sizeof static struct switch typedef union unsigned void + volatile while _Bool _Complex _Imaginary + + -- Literals + + integer floating charconst stringlit + + -- identifiers + -- Special token that represents identifiers that have been declared as typedefs (lexer feedback hack) + + identifier + TypedefName + + -- Special tokens used in content assist + + Completion + EndOfCompletion + + -- Unrecognized token + + Invalid + + -- Punctuation (with aliases to make grammar more readable) + + LeftBracket ::= '[' + LeftParen ::= '(' + LeftBrace ::= '{' + Dot ::= '.' + Arrow ::= '->' + PlusPlus ::= '++' + MinusMinus ::= '--' + And ::= '&' + Star ::= '*' + Plus ::= '+' + Minus ::= '-' + Tilde ::= '~' + Bang ::= '!' + Slash ::= '/' + Percent ::= '%' + RightShift ::= '>>' + LeftShift ::= '<<' + LT ::= '<' + GT ::= '>' + LE ::= '<=' + GE ::= '>=' + EQ ::= '==' + NE ::= '!=' + Caret ::= '^' + Or ::= '|' + AndAnd ::= '&&' + OrOr ::= '||' + Question ::= '?' + Colon ::= ':' + DotDotDot ::= '...' + Assign ::= '=' + StarAssign ::= '*=' + SlashAssign ::= '/=' + PercentAssign ::= '%=' + PlusAssign ::= '+=' + MinusAssign ::= '-=' + RightShiftAssign ::= '>>=' + LeftShiftAssign ::= '<<=' + AndAssign ::= '&=' + CaretAssign ::= '^=' + OrAssign ::= '|=' + Comma ::= ',' + + RightBracket -- these four have special rules for content assist + RightParen + RightBrace + SemiColon + + +$End + + +$Globals +/. + import java.util.*; + + import org.eclipse.cdt.core.dom.ast.*; + import org.eclipse.cdt.core.dom.lrparser.IParser; + import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; + import org.eclipse.cdt.core.dom.lrparser.action.c99.C99ASTNodeFactory; + import org.eclipse.cdt.core.dom.lrparser.action.c99.C99BuildASTParserAction; + import org.eclipse.cdt.core.dom.lrparser.action.c99.C99TypedefTrackerParserAction; + import org.eclipse.cdt.core.dom.lrparser.util.DebugUtil; +./ +$End + +-- TODO move this code into a common template + +$Define + $build_action_class /. C99BuildASTParserAction ./ + $resolve_action_class /. C99TypedefTrackerParserAction ./ + $node_factory_create_expression /. C99ASTNodeFactory.DEFAULT_INSTANCE ./ + $sym_class /. C99Parsersym ./ + $lexer_class /. C99Lexer ./ + $action_class /. C99ParserAction ./ +$End + + + + +$Define + -- These macros allow the template and header code to be customized by an extending parser. + $ast_class /.Object./ + $data_class /. Object ./ -- allow anything to be passed between actions + + --$additional_interfaces /. , IParserActionTokenProvider, IParser ./ + $additional_interfaces /. ./ + + --$build_action_class /. ./ + --$resolve_action_class /. ./ + --$node_factory_create_expression /. ./ + + + --$lexer_class /. ./ + --$action_class /. ./ + + + $UndoResolver /.$Undo action.resolver.undo(); $EndUndo./ + + $Resolve /. $BeginTrial $resolve. + ./ + $EndResolve /. $EndTrial + $UndoResolver + ./ -- undo actions are automatically generated for binding resolution actions + + $Builder /. $BeginFinal $builder. + ./ + $EndBuilder /. /*$builder.getASTStack().print();*/ $EndFinal ./ + + $Build /. $Action $Builder ./ + $EndBuild /. $EndBuilder $EndAction ./ + + $resolve /. action.resolver./ + $builder /. action.builder./ + + +-- comment out when using trial/undo + --$Action /. $BeginAction ./ + --$BeginFinal /. ./ + --$EndFinal /. ./ + --$BeginTrial /. ./ + --$EndTrial /. ./ + --$Undo /. ./ + --$EndUndo /. ./ +$End + + +$Headers +/. + private $action_class action; + + //public $action_type() { // constructor + //} + + private void initActions(IASTTranslationUnit tu) { + // binding resolution actions need access to IASTName nodes, temporary + action = new $action_class(); + action.resolver = new $resolve_action_class(this); + action.builder = new $build_action_class($node_factory_create_expression, this, tu); + action.builder.setTokenMap($sym_class.orderedTerminalSymbols); + setParserAction(action); + } + + + public void addToken(IToken token) { + token.setKind(mapKind(token.getKind())); + super.addToken(token); + } + + public void setTokens(List<IToken> tokens) { + resetTokenStream(); + for(IToken token : tokens) { + addToken(token); + } + } + + public IASTCompletionNode parse(IASTTranslationUnit tu) { + // this has to be done, or... kaboom! + setStreamLength(getSize()); + initActions(tu); + + final int errorRepairCount = -1; // -1 means full error handling + parser(null, errorRepairCount); // do the actual parse + super.resetTokenStream(); // allow tokens to be garbage collected + + // the completion node may be null + IASTCompletionNode compNode = action.builder.getASTCompletionNode(); + + action = null; + parserAction = null; + return compNode; + } + + + public int getKind(int i) { + int kind = super.getKind(i); + // lexer feedback hack! + if(kind == $sym_class.TK_identifier && action.resolver.isTypedef(getTokenText(i))) { + kind = $sym_class.TK_TypedefName; + } + return kind; + } + +./ +$End + +$Start + translation_unit +$End + + + +$Rules + +------------------------------------------------------------------------------------------- +-- AST and Symbol Table Scoping +------------------------------------------------------------------------------------------- + + +<openscope-ast> + ::= $empty + /.$Action $Builder openASTScope(); $EndBuilder $EndAction./ + +<openscope-symbol> + ::= $empty + /.$Action $Resolve openSymbolScope(); $EndResolve $EndAction./ + +<openscope-declaration> + ::= $empty + /.$Action $Resolve openDeclarationScope(); $EndResolve $EndAction./ + +------------------------------------------------------------------------------------------- +-- Content assist +------------------------------------------------------------------------------------------- + +-- The EndOfCompletion token is a special token that matches some punctuation. +-- These tokens allow the parse to complete successfully after a Completion token +-- is encountered. + + +']' ::=? 'RightBracket' + | 'EndOfCompletion' + +')' ::=? 'RightParen' + | 'EndOfCompletion' + +'}' ::=? 'RightBrace' + | 'EndOfCompletion' + +';' ::=? 'SemiColon' + | 'EndOfCompletion' + + + +------------------------------------------------------------------------------------------- +-- Expressions +------------------------------------------------------------------------------------------- + + +literal + ::= 'integer' + /. $Build consumeExpressionLiteral(IASTLiteralExpression.lk_integer_constant); $EndBuild ./ + | 'floating' + /. $Build consumeExpressionLiteral(IASTLiteralExpression.lk_float_constant); $EndBuild ./ + | 'charconst' + /. $Build consumeExpressionLiteral(IASTLiteralExpression.lk_char_constant); $EndBuild ./ + | 'stringlit' + /. $Build consumeExpressionLiteral(IASTLiteralExpression.lk_string_literal); $EndBuild ./ + + +primary_expression + ::= literal + | primary_expression_id + /. $Build consumeExpressionID(); $EndBuild ./ + | '(' expression ')' + /. $Build consumeExpressionBracketed(); $EndBuild ./ + + +primary_expression_id -- Typedefname not allowed as a variable name. + ::= 'identifier' + | 'Completion' + + +postfix_expression + ::= primary_expression + | postfix_expression '[' expression ']' + /. $Build consumeExpressionArraySubscript(); $EndBuild ./ + | postfix_expression '(' expression_list_opt ')' + /. $Build consumeExpressionFunctionCall(); $EndBuild ./ + | postfix_expression '.' member_name + /. $Build consumeExpressionFieldReference(false); $EndBuild ./ + | postfix_expression '->' member_name + /. $Build consumeExpressionFieldReference(true); $EndBuild ./ + | postfix_expression '++' + /. $Build consumeExpressionUnaryOperator(IASTUnaryExpression.op_postFixIncr); $EndBuild ./ + | postfix_expression '--' + /. $Build consumeExpressionUnaryOperator(IASTUnaryExpression.op_postFixDecr); $EndBuild ./ + | '(' type_name ')' '{' <openscope-ast> initializer_list comma_opt '}' + /. $Build consumeExpressionTypeIdInitializer(); $EndBuild ./ + + +comma_opt + ::= ',' | $empty + + +member_name + ::= 'identifier' + | 'TypedefName' + | 'Completion' + + +unary_expression + ::= postfix_expression + | '++' unary_expression + /. $Build consumeExpressionUnaryOperator(IASTUnaryExpression.op_prefixIncr); $EndBuild ./ + | '--' unary_expression + /. $Build consumeExpressionUnaryOperator(IASTUnaryExpression.op_prefixDecr); $EndBuild ./ + | '&' cast_expression + /. $Build consumeExpressionUnaryOperator(IASTUnaryExpression.op_amper); $EndBuild ./ + | '*' cast_expression + /. $Build consumeExpressionUnaryOperator(IASTUnaryExpression.op_star); $EndBuild ./ + | '+' cast_expression + /. $Build consumeExpressionUnaryOperator(IASTUnaryExpression.op_plus); $EndBuild ./ + | '-' cast_expression + /. $Build consumeExpressionUnaryOperator(IASTUnaryExpression.op_minus); $EndBuild ./ + | '~' cast_expression + /. $Build consumeExpressionUnaryOperator(IASTUnaryExpression.op_tilde); $EndBuild ./ + | '!' cast_expression + /. $Build consumeExpressionUnaryOperator(IASTUnaryExpression.op_not); $EndBuild ./ + | 'sizeof' unary_expression + /. $Build consumeExpressionUnaryOperator(IASTUnaryExpression.op_sizeof); $EndBuild ./ + | 'sizeof' '(' type_name ')' + /. $Build consumeExpressionTypeId(IASTTypeIdExpression.op_sizeof); $EndBuild ./ + + +cast_expression + ::= unary_expression + | '(' type_name ')' cast_expression + /. $Build consumeExpressionCast(IASTCastExpression.op_cast); $EndBuild ./ + + +multiplicative_expression + ::= cast_expression + | multiplicative_expression '*' cast_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_multiply); $EndBuild ./ + | multiplicative_expression '/' cast_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_divide); $EndBuild ./ + | multiplicative_expression '%' cast_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_modulo); $EndBuild ./ + + +additive_expression + ::= multiplicative_expression + | additive_expression '+' multiplicative_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_plus); $EndBuild ./ + | additive_expression '-' multiplicative_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_minus); $EndBuild ./ + + +shift_expression + ::= additive_expression + | shift_expression '<<' additive_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_shiftLeft); $EndBuild ./ + | shift_expression '>>' additive_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_shiftRight); $EndBuild ./ + + +relational_expression + ::= shift_expression + | relational_expression '<' shift_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_lessThan); $EndBuild ./ + | relational_expression '>' shift_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_greaterThan); $EndBuild ./ + | relational_expression '<=' shift_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_lessEqual); $EndBuild ./ + | relational_expression '>=' shift_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_greaterEqual); $EndBuild ./ + + +equality_expression + ::= relational_expression + | equality_expression '==' relational_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_equals); $EndBuild ./ + | equality_expression '!=' relational_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_notequals); $EndBuild ./ + + +AND_expression + ::= equality_expression + | AND_expression '&' equality_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_binaryAnd); $EndBuild ./ + + +exclusive_OR_expression + ::= AND_expression + | exclusive_OR_expression '^' AND_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_binaryXor); $EndBuild ./ + + +inclusive_OR_expression + ::= exclusive_OR_expression + | inclusive_OR_expression '|' exclusive_OR_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_binaryOr); $EndBuild ./ + + +logical_AND_expression + ::= inclusive_OR_expression + | logical_AND_expression '&&' inclusive_OR_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_logicalAnd); $EndBuild ./ + + +logical_OR_expression + ::= logical_AND_expression + | logical_OR_expression '||' logical_AND_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_logicalOr); $EndBuild ./ + + +conditional_expression + ::= logical_OR_expression + | logical_OR_expression '?' expression ':' conditional_expression + /. $Build consumeExpressionConditional(); $EndBuild ./ + + +assignment_expression + ::= conditional_expression + | unary_expression '=' assignment_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_assign); $EndBuild ./ + | unary_expression '*=' assignment_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_multiplyAssign); $EndBuild ./ + | unary_expression '/=' assignment_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_divideAssign); $EndBuild ./ + | unary_expression '%=' assignment_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_moduloAssign); $EndBuild ./ + | unary_expression '+=' assignment_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_plusAssign); $EndBuild ./ + | unary_expression '-=' assignment_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_minusAssign); $EndBuild ./ + | unary_expression '<<=' assignment_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_shiftLeftAssign); $EndBuild ./ + | unary_expression '>>=' assignment_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_shiftRightAssign); $EndBuild ./ + | unary_expression '&=' assignment_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_binaryAndAssign); $EndBuild ./ + | unary_expression '^=' assignment_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_binaryXorAssign); $EndBuild ./ + | unary_expression '|=' assignment_expression + /. $Build consumeExpressionBinaryOperator(IASTBinaryExpression.op_binaryOrAssign); $EndBuild ./ + + +-- special rule to avoid conflict between problem statements and problem expressions +expression_in_statement + ::= expression_list + + +expression + ::= expression_list + + +expression_list + ::= <openscope-ast> expression_list_actual + /. $Build consumeExpressionList(); $EndBuild ./ + + +expression_list_opt + ::= expression_list + | $empty + /. $Build consumeEmpty(); $EndBuild ./ + + +expression_list_actual + ::= assignment_expression + | expression_list_actual ',' assignment_expression + + +constant_expression + ::= conditional_expression + + +------------------------------------------------------------------------------------------- +-- Statements +------------------------------------------------------------------------------------------- + + + +statement + ::= labeled_statement + | compound_statement + | expression_statement + | selection_statement + | iteration_statement + | jump_statement + | ERROR_TOKEN + /. $Build consumeStatementProblem(); $EndBuild ./ + + +labeled_statement + ::= identifier_or_typedefname ':' statement + /. $Build consumeStatementLabeled(); $EndBuild ./ + | 'case' constant_expression ':' + /. $Build consumeStatementCase(); $EndBuild ./ + | 'default' ':' + /. $Build consumeStatementDefault(); $EndBuild ./ + + +compound_statement + ::= <openscope-symbol> '{' '}' + /. + $Action + $Resolve closeSymbolScope(); $EndResolve + $Builder consumeStatementCompoundStatement(false); $EndBuilder + $EndAction + ./ + | <openscope-symbol> '{' <openscope-ast> block_item_list '}' + /. + $Action + $Resolve closeSymbolScope(); $EndResolve + $Builder consumeStatementCompoundStatement(true); $EndBuilder + $EndAction + ./ + + +block_item_list + ::= block_item + | block_item_list block_item + + +block_item + ::= statement + | declaration + /. $Build consumeStatementDeclaration(); $EndBuild ./ + + +expression_statement + ::= ';' + /. $Build consumeStatementNull(); $EndBuild ./ + | expression_in_statement ';' + /. $Build consumeStatementExpression(); $EndBuild ./ + + +selection_statement + ::= 'if' '(' expression ')' statement + /. $Build consumeStatementIf(false); $EndBuild ./ + | 'if' '(' expression ')' statement 'else' statement + /. $Build consumeStatementIf(true); $EndBuild ./ + | 'switch' '(' expression ')' statement + /. $Build consumeStatementSwitch(); $EndBuild ./ + + +expression_opt + ::= expression + | $empty + /. $Build consumeEmpty(); $EndBuild ./ + + +iteration_statement + ::= 'do' statement 'while' '(' expression ')' ';' + /. $Build consumeStatementDoLoop(); $EndBuild ./ + | 'while' '(' expression ')' statement + /. $Build consumeStatementWhileLoop(); $EndBuild ./ + | <openscope-symbol> 'for' '(' expression_opt ';' expression_opt ';' expression_opt ')' statement + /. + $Action + $Resolve closeSymbolScope(); $EndResolve + $Builder consumeStatementForLoop(); $EndBuilder + $EndAction + ./ + | <openscope-symbol> 'for' '(' declaration expression_opt ';' expression_opt ')' statement + /. + $Action + $Resolve closeSymbolScope(); $EndResolve + $Builder consumeStatementForLoop(); $EndBuilder + $EndAction + ./ + + +jump_statement + ::= 'goto' identifier_or_typedefname ';' + /. $Build consumeStatementGoto(); $EndBuild ./ + | 'continue' ';' + /. $Build consumeStatementContinue(); $EndBuild ./ + | 'break' ';' + /. $Build consumeStatementBreak(); $EndBuild ./ + | 'return' ';' + /. $Build consumeStatementReturn(false); $EndBuild ./ + | 'return' expression ';' + /. $Build consumeStatementReturn(true); $EndBuild ./ + + + +------------------------------------------------------------------------------------------- +-- Declarations +------------------------------------------------------------------------------------------- + + + +declaration + ::= declaration_specifiers ';' + /. + $Action + $Resolve closeDeclarationScope(); $EndResolve + $Builder consumeDeclarationSimple(false); $EndBuilder + $EndAction + ./ + | declaration_specifiers <openscope-ast> init_declarator_list ';' + /. + $Action + $Resolve closeDeclarationScope(); $EndResolve + $Builder consumeDeclarationSimple(true); $EndBuilder + $EndAction + ./ + + +declaration_specifiers + ::= <openscope-declaration> <openscope-ast> simple_declaration_specifiers + /. $Build consumeDeclarationSpecifiersSimple(); $EndBuild ./ + | <openscope-declaration> <openscope-ast> struct_or_union_declaration_specifiers + /. $Build consumeDeclarationSpecifiersStructUnionEnum(); $EndBuild ./ + | <openscope-declaration> <openscope-ast> elaborated_declaration_specifiers + /. $Build consumeDeclarationSpecifiersStructUnionEnum(); $EndBuild ./ + | <openscope-declaration> <openscope-ast> enum_declaration_specifiers + /. $Build consumeDeclarationSpecifiersStructUnionEnum(); $EndBuild ./ + | <openscope-declaration> <openscope-ast> typdef_name_declaration_specifiers + /. $Build consumeDeclarationSpecifiersTypedefName(); $EndBuild ./ + + +no_type_declaration_specifier + ::= storage_class_specifier + | type_qualifier + | function_specifier + + +no_type_declaration_specifiers + ::= no_type_declaration_specifier + | no_type_declaration_specifiers no_type_declaration_specifier + + +simple_declaration_specifiers + ::= simple_type_specifier + | no_type_declaration_specifiers simple_type_specifier + | simple_declaration_specifiers simple_type_specifier + | simple_declaration_specifiers no_type_declaration_specifier + + +struct_or_union_declaration_specifiers + ::= struct_or_union_specifier + | no_type_declaration_specifiers struct_or_union_specifier + | struct_or_union_declaration_specifiers no_type_declaration_specifier + + +elaborated_declaration_specifiers + ::= elaborated_specifier + | no_type_declaration_specifiers elaborated_specifier + | elaborated_declaration_specifiers no_type_declaration_specifier + + +enum_declaration_specifiers + ::= enum_specifier + | no_type_declaration_specifiers enum_specifier + | enum_declaration_specifiers no_type_declaration_specifier + + +typdef_name_declaration_specifiers + ::= typedef_name_in_declspec + | no_type_declaration_specifiers typedef_name_in_declspec + | typdef_name_declaration_specifiers no_type_declaration_specifier + + +init_declarator_list + ::= init_declarator + | init_declarator_list ',' init_declarator + + +init_declarator + ::= complete_declarator + | complete_declarator '=' initializer + /. $Build consumeDeclaratorWithInitializer(true); $EndBuild ./ + + +complete_declarator + ::= declarator + /. + $Action + $Resolve consumeDeclaratorComplete(); $EndResolve + $EndAction + ./ + + +storage_class_specifier + ::= storage_class_specifier_token + /. + $Action + $Resolve consumeDeclSpecToken(); $EndResolve + $Builder consumeDeclSpecToken(); $EndBuilder + $EndAction + ./ + + +storage_class_specifier_token + ::= 'typedef' + | 'extern' + | 'static' + | 'auto' + | 'register' + + +simple_type_specifier + ::= simple_type_specifier_token + /. + $Action + $Resolve consumeDeclSpecToken(); $EndResolve + $Builder consumeDeclSpecToken(); $EndBuilder + $EndAction + ./ + +simple_type_specifier_token + ::= 'void' + | 'char' + | 'short' + | 'int' + | 'long' + | 'float' + | 'double' + | 'signed' + | 'unsigned' + | '_Bool' + | '_Complex' + | '_Imaginary' + + +typedef_name_in_declspec + ::= 'TypedefName' + /. + $Action + $Resolve consumeDeclSpecToken(); $EndResolve + $Builder consumeDeclSpecToken(); $EndBuilder + $EndAction + ./ + | 'Completion' + /. + $Action + $Resolve consumeDeclSpecToken(); $EndResolve + $Builder consumeDeclSpecToken(); $EndBuilder + $EndAction + ./ + + +identifier_or_typedefname + ::= 'identifier' + | 'TypedefName' + | 'Completion' + + +struct_or_union_specifier + ::= 'struct' '{' <openscope-ast> struct_declaration_list_opt '}' + /. $Build consumeTypeSpecifierComposite(false, IASTCompositeTypeSpecifier.k_struct); $EndBuild ./ + | 'union' '{' <openscope-ast> struct_declaration_list_opt '}' + /. $Build consumeTypeSpecifierComposite(false, IASTCompositeTypeSpecifier.k_union); $EndBuild ./ + | 'struct' identifier_or_typedefname '{' <openscope-ast> struct_declaration_list_opt '}' + /. $Build consumeTypeSpecifierComposite(true, IASTCompositeTypeSpecifier.k_struct); $EndBuild ./ + | 'union' identifier_or_typedefname '{' <openscope-ast> struct_declaration_list_opt '}' + /. $Build consumeTypeSpecifierComposite(true, IASTCompositeTypeSpecifier.k_union); $EndBuild ./ + + +elaborated_specifier + ::= 'struct' identifier_or_typedefname + /. $Build consumeTypeSpecifierElaborated(IASTCompositeTypeSpecifier.k_struct); $EndBuild ./ + | 'union' identifier_or_typedefname + /. $Build consumeTypeSpecifierElaborated(IASTCompositeTypeSpecifier.k_union); $EndBuild ./ + | 'enum' identifier_or_typedefname + /. $Build consumeTypeSpecifierElaborated(IASTElaboratedTypeSpecifier.k_enum); $EndBuild ./ + + +struct_declaration_list_opt + ::= struct_declaration_list + | $empty + +struct_declaration_list + ::= struct_declaration + | struct_declaration_list struct_declaration + + +struct_declaration + ::= specifier_qualifier_list <openscope-ast> struct_declarator_list ';' -- regular declarators plus bit fields + /. + $Action + $Resolve closeDeclarationScope(); $EndResolve + $Builder consumeStructDeclaration(true); $EndBuilder + $EndAction + ./ + | specifier_qualifier_list ';' + /. + $Action + $Resolve closeDeclarationScope(); $EndResolve + $Builder consumeStructDeclaration(false); $EndBuilder + $EndAction + ./ + + +-- just reuse declaration_specifiers, makes grammar a bit more lenient but thats OK +specifier_qualifier_list + ::= declaration_specifiers + + +struct_declarator_list + ::= complete_struct_declarator + | struct_declarator_list ',' complete_struct_declarator + + +complete_struct_declarator + ::= struct_declarator + /. + $Action + $Resolve consumeDeclaratorCompleteField(); $EndResolve + $EndAction + ./ + + +struct_declarator + ::= declarator + | ':' constant_expression + /. $Build consumeBitField(false); $EndBuild ./ + | declarator ':' constant_expression + /. $Build consumeBitField(true); $EndBuild ./ + + +enum_specifier + ::= 'enum' '{' <openscope-ast> enumerator_list_opt comma_opt '}' + /. $Build consumeTypeSpecifierEnumeration(false); $EndBuild ./ + | 'enum' identifier_or_typedefname '{' <openscope-ast> enumerator_list_opt comma_opt '}' + /. $Build consumeTypeSpecifierEnumeration(true); $EndBuild ./ + + +enumerator_list_opt + ::= enumerator_list + | $empty + + +enumerator_list + ::= enumerator + | enumerator_list ',' enumerator + + +enumerator + ::= identifier_or_typedefname + /. $Build consumeEnumerator(false); $EndBuild ./ + | identifier_or_typedefname '=' constant_expression + /. $Build consumeEnumerator(true); $EndBuild ./ + + +type_qualifier + ::= type_qualifier_token + /. + $Action + $Resolve consumeDeclSpecToken(); $EndResolve + $Builder consumeDeclSpecToken(); $EndBuilder + $EndAction + ./ + + +type_qualifier_token + ::= 'const' + | 'restrict' + | 'volatile' + + +function_specifier + ::= 'inline' + /.$Action + $Resolve consumeDeclSpecToken(); $EndResolve + $Builder consumeDeclSpecToken(); $EndBuilder + $EndAction + ./ + + +declarator + ::= direct_declarator + | <openscope-ast> pointer_seq direct_declarator + /. $Build consumeDeclaratorWithPointer(true); $EndBuild ./ + + +direct_declarator + ::= array_direct_declarator + | function_prototype_direct_declarator + | basic_direct_declarator + | knr_direct_declarator + + +basic_direct_declarator + ::= declarator_id_name + /. + $Action + $Resolve consumeDirectDeclaratorIdentifier(); $EndResolve + $Builder consumeDirectDeclaratorIdentifier(); $EndBuilder + $EndAction + ./ + | '(' declarator ')' + /. $Build consumeDirectDeclaratorBracketed(); $EndBuild ./ + + +declarator_id_name + ::= 'identifier' + /. $Build consumeIdentifierName(); $EndBuild ./ + + +array_direct_declarator + ::= basic_direct_declarator array_modifier + /. $Build consumeDirectDeclaratorArrayDeclarator(true); $EndBuild ./ + | array_direct_declarator array_modifier + /. $Build consumeDirectDeclaratorArrayDeclarator(true); $EndBuild ./ + + +function_prototype_direct_declarator + ::= function_direct_declarator + /.$Action $Resolve closeSymbolScope(); $EndResolve $EndAction./ + + +function_direct_declarator + ::= basic_direct_declarator '(' <openscope-symbol> <openscope-ast> parameter_type_list ')' + /. $Build consumeDirectDeclaratorFunctionDeclarator(true, true); $EndBuild ./ + | basic_direct_declarator '(' <openscope-symbol> ')' + /. $Build consumeDirectDeclaratorFunctionDeclarator(true, false); $EndBuild ./ + + +function_declarator + ::= function_direct_declarator + | <openscope-ast> pointer_seq function_direct_declarator + /. $Build consumeDeclaratorWithPointer(true); $EndBuild ./ + + +-- This is a hack because the parser cannot tell the difference between +-- plain identifiers and types. Because of this an identifier_list would +-- always be parsed as a parameter_type_list instead. In a KnR funciton +-- definition we can use the extra list of declarators to disambiguate. +-- This rule should be merged back into direct_declarator if type info is +-- added to the parser. + +knr_direct_declarator + ::= basic_direct_declarator '(' <openscope-symbol> <openscope-ast> identifier_list ')' + /. $Build consumeDirectDeclaratorFunctionDeclaratorKnR(); $EndBuild ./ + + +knr_function_declarator + ::= knr_direct_declarator + | <openscope-ast> pointer_seq knr_direct_declarator + /. $Build consumeDeclaratorWithPointer(true); $EndBuild ./ + + +identifier_list + ::= 'identifier' + /. $Build consumeIdentifierKnR(); $EndBuild ./ + | identifier_list ',' 'identifier' + /. $Build consumeIdentifierKnR(); $EndBuild ./ + + +array_modifier + ::= '[' ']' + /. $Build consumeDirectDeclaratorArrayModifier(false); $EndBuild ./ + | '[' <openscope-ast> array_modifier_type_qualifiers ']' + /. $Build consumeDirectDeclaratorModifiedArrayModifier(false, false, true, false); $EndBuild ./ + | '[' assignment_expression ']' + /. $Build consumeDirectDeclaratorArrayModifier(true); $EndBuild ./ + | '[' <openscope-ast> array_modifier_type_qualifiers assignment_expression ']' + /. $Build consumeDirectDeclaratorModifiedArrayModifier(false, false, true, true); $EndBuild ./ + | '[' 'static' assignment_expression ']' + /. $Build consumeDirectDeclaratorModifiedArrayModifier(true, false, false, true); $EndBuild ./ + | '[' 'static' <openscope-ast> array_modifier_type_qualifiers assignment_expression ']' + /. $Build consumeDirectDeclaratorModifiedArrayModifier(true, false, true, true); $EndBuild ./ + | '[' <openscope-ast> array_modifier_type_qualifiers 'static' assignment_expression ']' + /. $Build consumeDirectDeclaratorModifiedArrayModifier(true, false, true, true); $EndBuild ./ + | '[' '*' ']' + /. $Build consumeDirectDeclaratorModifiedArrayModifier(false, true, false, false); $EndBuild ./ + | '[' <openscope-ast> array_modifier_type_qualifiers '*' ']' + /. $Build consumeDirectDeclaratorModifiedArrayModifier(false, true, true, false); $EndBuild ./ + + +array_modifier_type_qualifiers + ::= type_qualifier_list + + +pointer_seq + ::= '*' + /. $Build consumePointer(); $EndBuild ./ + | pointer_seq '*' + /. $Build consumePointer(); $EndBuild ./ + | '*' <openscope-ast> type_qualifier_list + /. $Build consumePointerTypeQualifierList(); $EndBuild ./ + | pointer_seq '*' <openscope-ast> type_qualifier_list + /. $Build consumePointerTypeQualifierList(); $EndBuild ./ + + +type_qualifier_list + ::= type_qualifier + | type_qualifier_list type_qualifier + + +parameter_type_list + ::= parameter_list + /. $Build consumeEmpty(); $EndBuild ./ + | parameter_list ',' '...' + /. $Build consumePlaceHolder(); $EndBuild ./ + | '...' -- not spec + /. $Build consumePlaceHolder(); $EndBuild ./ + + +parameter_list + ::= parameter_declaration + | parameter_list ',' parameter_declaration + + +parameter_declaration + ::= declaration_specifiers complete_parameter_declarator + /. $Build consumeParameterDeclaration(); $EndBuild ./ + | declaration_specifiers + /. + $Action + $Resolve consumeParameterDeclarationWithoutDeclarator(); $EndResolve + $Builder consumeParameterDeclarationWithoutDeclarator(); $EndBuilder + $EndAction + ./ + + +complete_parameter_declarator + ::= declarator + /. + $Action + $Resolve consumeDeclaratorCompleteParameter(); $EndResolve + $EndAction + ./ + | abstract_declarator + /. + $Action + $Resolve consumeDeclaratorCompleteParameter(); $EndResolve + $EndAction + ./ + + +-- only used in expressions, eg) sizeof, casts etc... +type_name + ::= specifier_qualifier_list + /. + $Action + $Resolve consumeTypeId(); $EndResolve + $Builder consumeTypeId(false); $EndBuilder + $EndAction + ./ + | specifier_qualifier_list abstract_declarator + /. + $Action + $Resolve consumeTypeId(); $EndResolve + $Builder consumeTypeId(true); $EndBuilder + $EndAction + ./ + + +abstract_declarator -- a declarator that does not include an identifier + ::= direct_abstract_declarator + | <openscope-ast> pointer_seq + /. $Build consumeDeclaratorWithPointer(false); $EndBuild ./ + | <openscope-ast> pointer_seq direct_abstract_declarator + /. $Build consumeDeclaratorWithPointer(false); $EndBuild ./ + + +direct_abstract_declarator + ::= basic_direct_abstract_declarator + | array_direct_abstract_declarator + | function_direct_abstract_declarator + + +basic_direct_abstract_declarator + ::= '(' abstract_declarator ')' + /. $Build consumeDirectDeclaratorBracketed(); $EndBuild ./ + + +array_direct_abstract_declarator + ::= array_modifier + /. $Build consumeDirectDeclaratorArrayDeclarator(false); $EndBuild ./ + | array_direct_abstract_declarator array_modifier + /. $Build consumeDirectDeclaratorArrayDeclarator(true); $EndBuild ./ + | basic_direct_abstract_declarator array_modifier + /. $Build consumeDirectDeclaratorArrayDeclarator(true); $EndBuild ./ + + +function_direct_abstract_declarator + ::= '(' ')' + /. $Build consumeDirectDeclaratorFunctionDeclarator(false, false); $EndBuild ./ + | basic_direct_abstract_declarator '(' ')' + /. $Build consumeDirectDeclaratorFunctionDeclarator(true, false); $EndBuild ./ + | '(' <openscope-ast> parameter_type_list ')' + /. $Build consumeDirectDeclaratorFunctionDeclarator(false, true); $EndBuild ./ + | basic_direct_abstract_declarator '(' <openscope-ast> parameter_type_list ')' + /. $Build consumeDirectDeclaratorFunctionDeclarator(true, true); $EndBuild ./ + + +initializer + ::= assignment_expression + /. $Build consumeInitializer(); $EndBuild ./ + | '{' <openscope-ast> initializer_list comma_opt '}' + /. $Build consumeInitializerList(); $EndBuild ./ + +initializer_list + ::= initializer + | designated_initializer + | initializer_list ',' initializer + | initializer_list ',' designated_initializer + + +designated_initializer + ::= <openscope-ast> designation '=' initializer + /. $Build consumeInitializerDesignated(); $EndBuild ./ + + +designation + ::= designator_list + + +designator_list + ::= designator_base + | designator_list designator + + +designator_base + ::= '[' constant_expression ']' + /. $Build consumeDesignatorArray(); $EndBuild ./ + | '.' identifier_or_typedefname + /. $Build consumeDesignatorField(); $EndBuild ./ + +designator + ::= '[' constant_expression ']' + /. $Build consumeDesignatorArray(); $EndBuild ./ + | '.' identifier_or_typedefname + /. $Build consumeDesignatorField(); $EndBuild ./ + + +------------------------------------------------------------------------------------------- +-- External Definitions +------------------------------------------------------------------------------------------- + +translation_unit + ::= external_declaration_list + /. $Build consumeTranslationUnit(); $EndBuild ./ + | $empty + /. $Build consumeTranslationUnit(); $EndBuild ./ + + +external_declaration_list + ::= external_declaration + | external_declaration_list external_declaration + + +external_declaration + ::= function_definition + | declaration + | ';' + /. $Build consumeDeclarationEmpty(); $EndBuild ./ + | ERROR_TOKEN + /. $Build consumeDeclarationProblem(); $EndBuild ./ + + +-- Used by KnR +declaration_list + ::= declaration + | declaration_list declaration + + +-- The extra <openscope-ast> nonterminal before declarator in this rule is only there +-- to avoid a shift/reduce error with the rule for declaration. +-- The symbol table scoped is opened in the rule for function_direct_declarator +function_definition + ::= declaration_specifiers <openscope-ast> function_declarator function_body + /. + $Action + $Resolve consumeFunctionDefinition(); $EndResolve + $Builder consumeFunctionDefinition(true); $EndBuilder + $EndAction + ./ + + -- this rule is here as a special case (its not C99 spec) just to support implicit int in function definitions + | <openscope-declaration> <openscope-ast> function_declarator function_body + /. + $Action + $Resolve consumeFunctionDefinition(); $EndResolve + $Builder consumeFunctionDefinition(false); $EndBuilder + $EndAction + ./ + + | declaration_specifiers <openscope-ast> knr_function_declarator <openscope-ast> declaration_list compound_statement + /. + $Action + $Resolve consumeFunctionDefinition(); $EndResolve + $Builder consumeFunctionDefinitionKnR(); $EndBuilder + $EndAction + ./ + + +-- same syntax as compound_statement but a symbol table scope isn't opened +function_body + ::= '{' '}' + /. $Build consumeStatementCompoundStatement(false); $EndBuild ./ + | '{' <openscope-ast> block_item_list '}' + /. $Build consumeStatementCompoundStatement(true); $EndBuild ./ + +$End + + + + + + + + + + + + + + + + |