-- 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 "#" ;