Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.g1265
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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

Back to the top