packages feed

ogma-language-c-1.0.6: grammar/C.cf

-- Copyright 2020 United States Government as represented by the Administrator
-- of the National Aeronautics and Space Administration. All Rights Reserved.
--
-- Disclaimers
--
-- No Warranty: THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY
-- OF ANY KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT
-- LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO
-- SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-- PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT THE
-- SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT DOCUMENTATION, IF
-- PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. THIS AGREEMENT DOES NOT, IN
-- ANY MANNER, CONSTITUTE AN ENDORSEMENT BY GOVERNMENT AGENCY OR ANY PRIOR
-- RECIPIENT OF ANY RESULTS, RESULTING DESIGNS, HARDWARE, SOFTWARE PRODUCTS OR
-- ANY OTHER APPLICATIONS RESULTING FROM USE OF THE SUBJECT SOFTWARE. FURTHER,
-- GOVERNMENT AGENCY DISCLAIMS ALL WARRANTIES AND LIABILITIES REGARDING
-- THIRD-PARTY SOFTWARE, IF PRESENT IN THE ORIGINAL SOFTWARE, AND DISTRIBUTES
-- IT "AS IS."
--
-- Waiver and Indemnity: RECIPIENT AGREES TO WAIVE ANY AND ALL CLAIMS AGAINST
-- THE UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS
-- ANY PRIOR RECIPIENT. IF RECIPIENT'S USE OF THE SUBJECT SOFTWARE RESULTS IN
-- ANY LIABILITIES, DEMANDS, DAMAGES, EXPENSES OR LOSSES ARISING FROM SUCH USE,
-- INCLUDING ANY DAMAGES FROM PRODUCTS BASED ON, OR RESULTING FROM, RECIPIENT'S
-- USE OF THE SUBJECT SOFTWARE, RECIPIENT SHALL INDEMNIFY AND HOLD HARMLESS THE
-- UNITED STATES GOVERNMENT, ITS CONTRACTORS AND SUBCONTRACTORS, AS WELL AS ANY
-- PRIOR RECIPIENT, TO THE EXTENT PERMITTED BY LAW. RECIPIENT'S SOLE REMEDY
-- FOR ANY SUCH MATTER SHALL BE THE IMMEDIATE, UNILATERAL TERMINATION OF THIS
-- AGREEMENT.
--
entrypoints TranslationUnit;

token Identifier ( ( letter | '_' ) (letter | digit | '_' )* ) ;
token IntegerConstant ( ( ["123456789"] digit*)
                      | ('0' ["01234567"]+)
                      | ('0' ('x' | 'X') ["01234567"]+)
                      )
                      ( ('u' | 'U' | 'l' | 'L')? ) ;

MkTranslationUnit . TranslationUnit ::= [ExternalDeclaration] ;

(:[]) . [ExternalDeclaration] ::= ExternalDeclaration ;
(:)   . [ExternalDeclaration] ::= ExternalDeclaration [ExternalDeclaration] ;

MkExternalDeclarationFunctionDefinition . ExternalDeclaration ::= FunctionDefinition ;
MkExternalDeclarationDeclaration        . ExternalDeclaration ::= Declaration ;

MkFunctionDefinition . FunctionDefinition ::= [DeclarationSpecifier] Declarator [Declaration] CompoundStatement ;

MkDeclaration . Declaration ::= DeclarationSpecifiers InitDeclarationListOpt ";" ;

[]  . [Declaration] ::= ;
(:) . [Declaration] ::= Declaration [Declaration];

[]  . [DeclarationSpecifier] ::= ;
(:) . [DeclarationSpecifier] ::= DeclarationSpecifier [DeclarationSpecifier] ;

DeclarationSpecifiers . DeclarationSpecifiers ::= DeclarationSpecifier [DeclarationSpecifier] ;

MkDeclarationSpecifierStorageClass  . DeclarationSpecifier ::= StorageClassSpecifier ;
MkDeclarationSpecifierTypeSpecifier . DeclarationSpecifier ::= TypeSpecifier ;
MkDeclarationSpecifierTypeQualifier . DeclarationSpecifier ::= TypeQualifier ;

MkStorageClassSpecifierAuto     . StorageClassSpecifier ::= "auto" ;
MkStorageClassSpecifierRegister . StorageClassSpecifier ::= "register" ;
MkStorageClassSpecifierStatic   . StorageClassSpecifier ::= "static" ;
MkStorageClassSpecifierExtern   . StorageClassSpecifier ::= "extern" ;
MkStorageClassSpecifierTypedef  . StorageClassSpecifier ::= "typedef" ;

MkTypeSpecifierVoid          . TypeSpecifier ::= "void" ;
MkTypeSpecifierChar          . TypeSpecifier ::= "char" ;
MkTypeSpecifierShort         . TypeSpecifier ::= "short" ;
MkTypeSpecifierInt           . TypeSpecifier ::= "int" ;
MkTypeSpecifierInt8          . TypeSpecifier ::= "int8_t" ;
MkTypeSpecifierInt16         . TypeSpecifier ::= "int16_t" ;
MkTypeSpecifierInt32         . TypeSpecifier ::= "int32_t" ;
MkTypeSpecifierInt64         . TypeSpecifier ::= "int64_t" ;
MkTypeSpecifierUInt8         . TypeSpecifier ::= "uint8_t" ;
MkTypeSpecifierUInt16        . TypeSpecifier ::= "uint16_t" ;
MkTypeSpecifierUInt32        . TypeSpecifier ::= "uint32_t" ;
MkTypeSpecifierUInt64        . TypeSpecifier ::= "uint64_t" ;
MkTypeSpecifierLong          . TypeSpecifier ::= "long" ;
MkTypeSpecifierFloat         . TypeSpecifier ::= "float" ;
MkTypeSpecifierDouble        . TypeSpecifier ::= "double" ;
MkTypeSpecifierSigned        . TypeSpecifier ::= "signed" ;
MkTypeSpecifierUnsigned      . TypeSpecifier ::= "unsigned" ;
MkTypeSpecifierStructOrUnion . TypeSpecifier ::= StructOrUnionSpecifier ;
MkTypeSpecifierEnumSpecifier . TypeSpecifier ::= EnumSpecifier ;
-- MkTypeSpecifierTypedefName   . TypeSpecifier ::= TypedefName ;

MkTypeQualifierConst    . TypeQualifier ::= "const" ;
MkTypeQualifierVolatile . TypeQualifier ::= "volatile" ;

MkStructOrUnionSpecifierWithFields . StructOrUnionSpecifier ::= StructOrUnion IdentifierOpt "{" [StructDeclaration] "}" ;
MkStructOrUnionSpecifierEmpty      . StructOrUnionSpecifier ::= StructOrUnion Identifier ;

MkStructOrUnionStruct . StructOrUnion ::= "struct" ;
MkStructOrUnionUnion  . StructOrUnion ::= "union" ;

(:[]) . [StructDeclaration] ::= StructDeclaration ;
(:)   . [StructDeclaration] ::= StructDeclaration [StructDeclaration];

MkInitDeclarationListOptNothing . InitDeclarationListOpt ::= ;
MkInitDeclarationListOptJust    . InitDeclarationListOpt ::= [InitDeclarator] ;

(:[]) . [InitDeclarator] ::= InitDeclarator ;
(:)   . [InitDeclarator] ::= InitDeclarator "," [InitDeclarator];

MkInitDeclaratorUninitialized . InitDeclarator ::= Declarator ;
MkInitDeclaratorInitialized   . InitDeclarator ::= Declarator "=" Initializer ;

MkStructDeclaration . StructDeclaration ::= [SpecifierQualifier] [StructDeclarator] ";" ;

(:[]) . [SpecifierQualifier] ::= SpecifierQualifier ;
(:)   . [SpecifierQualifier] ::= SpecifierQualifier [SpecifierQualifier] ;

MkSpecifierQualifierTypeSpecifier . SpecifierQualifier ::= TypeSpecifier ;
MkSpecifierQualifierTypeQualifier . SpecifierQualifier ::= TypeQualifier ;

(:[]) . [StructDeclarator] ::= StructDeclarator ;
(:)   . [StructDeclarator] ::= StructDeclarator "," [StructDeclarator] ;

MkStructDeclaratorDeclarator . StructDeclarator ::= Declarator ;
MkStructDeclaratorConstant   . StructDeclarator ::= DeclaratorOpt ":" ConstantExpression ;

MkEnumSpecifierWithCases . EnumSpecifier ::= "enum" IdentifierOpt "{" EnumeratorList "}" ;
MkEnumSpecifierEmpty     . EnumSpecifier ::= "enum" Identifier ;

MkEnumeratorList1 . EnumeratorList ::= Enumerator ;
MkEnumeratorListN . EnumeratorList ::= EnumeratorList "," Enumerator ;

MkEnumeratorUninitialized . Enumerator ::= Identifier ;
MkEnumeratorInitialized   . Enumerator ::= Identifier "=" ConstantExpression ;

MkDeclaratorOptNothing . DeclaratorOpt ::= ;
MkDeclaratorOptJust    . DeclaratorOpt ::= Declarator ;

MkDeclarator . Declarator ::= PointerOpt DirectDeclarator ;

MkDirectDeclaratorIdentifier            . DirectDeclarator ::= Identifier ;
MkDirectDeclaratorParDeclarator         . DirectDeclarator ::= "(" Declarator ")" ;
MkDirectDeclaratorConstantExpressionOpt . DirectDeclarator ::= DirectDeclarator "[" ConstantExpressionOpt "]" ;
MkDirectDeclaratorParameterTypeList     . DirectDeclarator ::= DirectDeclarator "(" ParameterTypeList ")" ;
MkDirectDeclaratorIdentifierListOpt     . DirectDeclarator ::= DirectDeclarator "(" IdentifierListOpt ")" ;

MkPointerOptNothing . PointerOpt ::= ;
MkPointerOptJust    . PointerOpt ::= Pointer ;

MkPointer1 . Pointer ::= "*" TypeQualifierListOpt ;
MkPointerN . Pointer ::= "*" TypeQualifierListOpt Pointer ;

MkTypeQualifierListOptNothing . TypeQualifierListOpt ::= ;
MkTypeQualifierListOptJust    . TypeQualifierListOpt ::= TypeQualifierList ;

MkTypeQualifierList1 . TypeQualifierList ::= TypeQualifier ;
MkTypeQualifierListN . TypeQualifierList ::= TypeQualifierList TypeQualifier ;

MkParameterTypeList         . ParameterTypeList ::= ParameterList ;
MkParameterTypeListEllipsis . ParameterTypeList ::= ParameterList "," "..." ;

MkParameterList1 . ParameterList ::= ParameterDeclaration ;
MkParameterListN . ParameterList ::= ParameterList "," ParameterDeclaration ;

MkParameterDeclarationDeclarator            . ParameterDeclaration ::= DeclarationSpecifiers Declarator ;
MkParameterDeclarationAbstractDeclaratorOpt . ParameterDeclaration ::= DeclarationSpecifiers AbstractDeclaratorOpt ;

MkIdentifierListOptNothing . IdentifierListOpt ::= ;
MkIdentifierListOptJust    . IdentifierListOpt ::= IdentifierList ;

MkIdentifierList1 . IdentifierList ::= Identifier ;
MkIdentifierListN . IdentifierList ::= IdentifierList "," Identifier ;

MkInitializerAssignment        . Initializer ::= Expression ;
MkInitializerIniutializerList  . Initializer ::= "{" InitializerList "}" ;
MkInitializerIniutializerListC . Initializer ::= "{" InitializerList "," "}" ;

MkInitializerList1 . InitializerList ::= Initializer ;
MkInitializerListN . InitializerList ::= InitializerList "," Initializer ;

MkTypeName . TypeName ::= [SpecifierQualifier] AbstractDeclaratorOpt  ;

MkAbstractDeclaratorOptNothing . AbstractDeclaratorOpt ::= ;
MkAbstractDeclaratorOptJust    . AbstractDeclaratorOpt ::= AbstractDeclarator ;

MkAbstractDeclaratorPointer . AbstractDeclarator ::= Pointer ;
MkAbstractDeclaratorDirect  . AbstractDeclarator ::= PointerOpt DirectAbstractDeclarator ;

MkDirectAbstractDeclaratorOptNothing . DirectAbstractDeclaratorOpt ::= ;
MkDirectAbstractDeclaratorOptJust    . DirectAbstractDeclaratorOpt ::= DirectAbstractDeclarator ;

MkDirectAbstractDeclaratorPar                   . DirectAbstractDeclarator ::= "(" AbstractDeclarator ")" ;
MkDirectAbstractDeclaratorConstantExpressionOpt . DirectAbstractDeclarator ::= DirectAbstractDeclaratorOpt "[" ConstantExpressionOpt "]" ;
MkDirectAbstractDeclaratorParameterTypeList     . DirectAbstractDeclarator ::= DirectAbstractDeclaratorOpt "(" ParameterTypeList ")" ;

-- MkTypedefName . TypedefName ::= Identifier ;

MkStatementLabeled    . Statement ::= LabeledStatement ;
MkStatementExpression . Statement ::= ExpressionStatement ;
MkStatementCompound   . Statement ::= CompoundStatement ;
MkStatementSelection  . Statement ::= SelectionStatement ;
MkStatementIteration  . Statement ::= IterationStatement ;
MkStatementJump       . Statement ::= JumpStatement ;

MkLabeledStatementIdentifier . LabeledStatement ::= Identifier ":" Statement ;
MkLabeledStatementCase       . LabeledStatement ::= "case" ConstantExpression ":" Statement ;
MkLabeledStatementDefault    . LabeledStatement ::= "default" ":" Statement ;

MkExpressionStatement . ExpressionStatement ::= ExpressionOpt ";" ;

MkCompoundStatement . CompoundStatement ::= "{" [Declaration] [Statement] "}" ;

[]  . [Statement] ::=  ;
(:) . [Statement] ::= Statement [Statement] ;

MkSelectionStatementIfThen     . SelectionStatement ::= "if" "(" Expression ")" Statement ;
MkSelectionStatementIfThenElse . SelectionStatement ::= "if" "(" Expression ")" Statement "else" Statement ;
MkSelectionStatementSwitch     . SelectionStatement ::= "switch" "(" Expression ")" Statement ;

MkIterationStatementWhile . IterationStatement ::= "while" "(" Expression ")" Statement ;
MkIterationStatementDo    . IterationStatement ::= "do" Statement "while" "(" Expression ")" ";" ;
MkIterationStatementFor   . IterationStatement ::= "for" "(" ExpressionOpt ";" ExpressionOpt ";" ExpressionOpt ")" Statement ;

MkJumpStatementGoto     . JumpStatement ::= "goto" Identifier ";" ;
MkJumpStatementContinue . JumpStatement ::= "continue" ";" ;
MkJumpStatementBreak    . JumpStatement ::= "break" ";" ;
MkJumpStatementReturn   . JumpStatement ::= "return" ExpressionOpt ";" ;

MkExpressionOptNothing . ExpressionOpt ::= ;
MkExpressionOptJust    . ExpressionOpt ::= Expression ;

coercions Expression 12 ;
Expression12 . Expression12 ::= CastExpression ;
Expression11 . Expression11 ::= Expression11 MultOp Expression12 ;
Expression10 . Expression10 ::= Expression10 AddOp Expression11 ;
Expression9  . Expression9  ::= Expression9 ShiftOp Expression10 ;
Expression8  . Expression8  ::= Expression8 RelOp Expression9 ;
Expression7  . Expression7  ::= Expression7 EqOp Expression8 ;
Expression6  . Expression6  ::= Expression6 "^" Expression7 ;
Expression5  . Expression5  ::= Expression5 "|" Expression6 ;
Expression4  . Expression4  ::= Expression4 "&&" Expression5 ;
Expression3  . Expression3  ::= Expression3 "||" Expression4 ;
Expression2  . Expression2  ::= Expression3 "?" Expression ":" Expression2 ;
Expression1  . Expression1  ::= UnaryExpression AssignmentOperator Expression2 ;
Expression   . Expression   ::= Expression "," Expression1;

(:[]) . [Expression1] ::= Expression1 ;
(:)   . [Expression1] ::= Expression1 "," [Expression1] ;

MkAssignmentOperatorAssign . AssignmentOperator ::= "=" ;
MkAssignmentOperatorTimes  . AssignmentOperator ::= "*=" ;
MkAssignmentOperatorDiv    . AssignmentOperator ::= "/=" ;
MkAssignmentOperatorMod    . AssignmentOperator ::= "%=" ;
MkAssignmentOperatorPlus   . AssignmentOperator ::= "+=" ;
MkAssignmentOperatorMinus  . AssignmentOperator ::= "-=" ;
MkAssignmentOperatorShiftL . AssignmentOperator ::= "<<=" ;
MkAssignmentOperatorShiftR . AssignmentOperator ::= ">>=" ;
MkAssignmentOperatorAnd    . AssignmentOperator ::= "&=" ;
MkAssignmentOperatorXOr    . AssignmentOperator ::= "^=" ;
MkAssignmentOperatorOr     . AssignmentOperator ::= "|=" ;

MkConditionalExpressionNothing . ConstantExpressionOpt ::= ;
MkConditionalExpressionJust    . ConstantExpressionOpt ::= ConstantExpression ;

-- Should be Expression2
MkConstantExpression . ConstantExpression ::= Expression2 ;

EqOpEq  . EqOp ::= "==" ;
EqOpNeq . EqOp ::= "!=" ;

RelOpLT . RelOp ::= "<" ;
RelOpGT . RelOp ::= ">" ;
RelOpLE . RelOp ::= "<=" ;
RelOpGE . RelOp ::= ">=" ;

ShiftOpLeft  . ShiftOp ::= "<<" ;
ShiftOpRight . ShiftOp ::= ">>" ;

AddOpPlus  . AddOp ::= "+" ;
AddOpMinus . AddOp ::= "-" ;

MultOpTimes . MultOp ::= "*" ;
MultOpDiv   . MultOp ::= "/" ;
MultOpMod   . MultOp ::= "%" ;

MkCastExpression1 . CastExpression ::= UnaryExpression ;
MkCastExpressionN . CastExpression ::= "(" TypeName ")" CastExpression ;

MkUnaryExpressionPostfix   . UnaryExpression ::= PostfixExpression ;
MkUnaryExpressionPlus2     . UnaryExpression ::= "++" UnaryExpression ;
MkUnaryExpressionMinus2    . UnaryExpression ::= "--" UnaryExpression ;
MkUnaryExpressionUnaryOp   . UnaryExpression ::= UnaryOperator CastExpression ;
MkUnaryExpressionSizeof1   . UnaryExpression ::= "sizeof" UnaryExpression ;
MkUnaryExpressionSizeofPar . UnaryExpression ::= "sizeof" "(" TypeName ")" ;

MkUnaryOperatorAnd   . UnaryOperator ::= "&" ;
MkUnaryOperatorTimes . UnaryOperator ::= "*" ;
MkUnaryOperatorPlus  . UnaryOperator ::= "+" ;
MkUnaryOperatorMinus . UnaryOperator ::= "-" ;
MkUnaryOperatorTilde . UnaryOperator ::= "~" ;
MkUnaryOperatorBang  . UnaryOperator ::= "!" ;

MkPostfixExpression1                         . PostfixExpression ::= PrimaryExpression ;
MkPostfixExpressionBrackets                  . PostfixExpression ::= PostfixExpression "[" Expression "]" ;
MkPostfixExpressionArgumentExpressionListOpt . PostfixExpression ::= PostfixExpression "(" ArgumentExpressionListOpt ")" ;
MkPostfixExpressionDot                       . PostfixExpression ::= PostfixExpression "." Identifier ;
MkPostfixExpressionArrow                     . PostfixExpression ::= PostfixExpression "->" Identifier ;
MkPostfixExpressionPlus2                     . PostfixExpression ::= PostfixExpression "++" ;
MkPostfixExpressionMinus2                    . PostfixExpression ::= PostfixExpression "--" ;

MkPrimaryExpressionIdentifier    . PrimaryExpression ::= Identifier ;
MkPrimaryExpressionConstant      . PrimaryExpression ::= Constant ;
MkPrimaryExpressionString        . PrimaryExpression ::= String ;
MkPrimaryExpressionParExpression . PrimaryExpression ::= "(" Expression ")" ;

MkArgumentExpressionListOptNothing . ArgumentExpressionListOpt ::= ;
MkArgumentExpressionListOptJust    . ArgumentExpressionListOpt ::= [Expression1] ;

MkConstantInteger   . Constant ::= IntegerConstant ;
MkConstantCharacter . Constant ::= CharacterConstant ;
MkConstantFloating  . Constant ::= FloatingConstant ;
-- MkConstantEnumeration . Constant ::= EnumerationConstant ;

MkIdentifierOptNothing . IdentifierOpt ::= ;
MkIdentifierOptJust    . IdentifierOpt ::= Identifier ;

MkCharacterConstant . CharacterConstant ::= Char ;
MkFloatingConstant . FloatingConstant ::= Double ;

comment "/*" "*/" ;
comment "//" ;
comment "#" ;