X-Git-Url: http://andersk.mit.edu/gitweb/splint.git/blobdiff_plain/1b8ae6904556859bbe91aadf35b8adcc1a0611ce..abd7f89523564e5e238e5852585b98f72c3b48f4:/src/cgrammar.y diff --git a/src/cgrammar.y b/src/cgrammar.y index eb78741..b9073ba 100644 --- a/src/cgrammar.y +++ b/src/cgrammar.y @@ -17,8 +17,8 @@ ** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, ** MA 02111-1307, USA. ** -** For information on splint: splint@cs.virginia.edu -** To report a bug: splint-bug@cs.virginia.edu +** For information on splint: info@splint.org +** To report a bug: splint-bug@splint.org ** For more information: http://www.splint.org */ %{ @@ -136,7 +136,7 @@ extern void yyerror (char *); %token TSEMI TLBRACE TRBRACE TCOMMA TCOLON TASSIGN TLPAREN %token TRPAREN TLSQBR TRSQBR TDOT TAMPERSAND TEXCL TTILDE %token TMINUS TPLUS TMULT TDIV TPERCENT TLT TGT TCIRC TBAR TQUEST -%token CSIZEOF CALIGNOF ARROW_OP CTYPEDEF COFFSETOF +%token CSIZEOF CALIGNOF CTYPEOF ARROW_OP CTYPEDEF COFFSETOF %token INC_OP DEC_OP LEFT_OP RIGHT_OP %token LE_OP GE_OP EQ_OP NE_OP AND_OP OR_OP %token MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN SUB_ASSIGN @@ -156,7 +156,8 @@ extern void yyerror (char *); %token QSETS %token QRELEASES %token QPRECLAUSE -%token QPOSTCLAUSE +%token QPOSTCLAUSE +%token QINVARIANT %token QALT %token QUNDEF QKILLED %token QENDMACRO @@ -195,7 +196,6 @@ extern void yyerror (char *); %token CGCHAR CBOOL CINT CGFLOAT CDOUBLE CVOID %token QANYTYPE QINTEGRALTYPE QUNSIGNEDINTEGRALTYPE QSIGNEDINTEGRALTYPE -%type nullterminatedQualifier %token QNULLTERMINATED %token QSETBUFFERSIZE %token QSETSTRINGLENGTH @@ -278,8 +278,13 @@ extern void yyerror (char *); %type BufConstraintList +%type optStructInvariant + %type BufUnaryOp +/*drl 1/6/2002 either /\ or && */ +%type constraintSeperator + %type enumeratorList %type fieldDesignator @@ -302,7 +307,10 @@ extern void yyerror (char *); %type compoundStmt compoundStmtAux compoundStmtRest compoundStmtAuxErr %type expressionStmt selectionStmt iterationStmt jumpStmt iterDefIterationStmt %type stmtErr stmtListErr compoundStmtErr expressionStmtErr -%type iterationStmtErr initializerList initializer ifPred whilePred forPred iterWhilePred +%type iterationStmtErr initializerList typeInitializerList initializer +%type ifPred whilePred forPred iterWhilePred typeInitializer + +%type designator designatorList designation %type storageSpecifier typeQualifier typeModifier globQual %type optGlobQuals @@ -328,6 +336,7 @@ externalDef | iterDecl { uentry_clearDecl (); } | macroDef { uentry_clearDecl (); } | initializer { uentry_checkDecl (); exprNode_free ($1); } + | TSEMI { uentry_clearDecl (); /* evans 2002-02-08: okay to have a null statement */ } | error { uentry_clearDecl (); } constantDecl @@ -366,10 +375,13 @@ namedDeclBase { $$ = idDecl_replaceCtype ($1, ctype_makeArray (idDecl_getCtype ($1))); } | namedDeclBase TLSQBR IsType constantExpr TRSQBR NotType { - exprNode_findValue($4); + exprNode_findValue ($4); + idDecl_notExpectingFunction ($1); + if (exprNode_hasValue ($4)) { - $$ = idDecl_replaceCtype ($1, ctype_makeFixedArray (idDecl_getCtype ($1), exprNode_getLongValue ($4))); + $$ = idDecl_replaceCtype ($1, ctype_makeInnerFixedArray (idDecl_getCtype ($1), + exprNode_getLongValue ($4))); } else { @@ -478,8 +490,12 @@ metaStateName /*drl*/ +constraintSeperator +: TCAND +| AND_OP + BufConstraintList -: BufConstraint TCAND BufConstraintList { $$ = constraintList_add ($3, $1); } +: BufConstraint constraintSeperator BufConstraintList { $$ = constraintList_add ($3, $1); } | BufConstraint { $$ = constraintList_single ($1); } BufConstraint @@ -779,6 +795,9 @@ primaryExpr | TLPAREN expr TRPAREN { $$ = exprNode_addParens ($1, $2); } | TYPE_NAME_OR_ID { $$ = exprNode_fromIdentifier (coerceId ($1)); } | QEXTENSION { $$ = exprNode_makeError (); } + | TLPAREN { exprChecks_inCompoundStatementExpression (); } + compoundStmt TRPAREN + { exprChecks_leaveCompoundStatementExpression (); $$ = exprNode_compoundStatementExpression ($1, $3); } postfixExpr : primaryExpr @@ -790,7 +809,9 @@ postfixExpr | postfixExpr NotType ARROW_OP newId IsType { $$ = exprNode_arrowAccess ($1, $3, $4); } | postfixExpr INC_OP { $$ = exprNode_postOp ($1, $2); } | postfixExpr DEC_OP { $$ = exprNode_postOp ($1, $2); } - + | TLPAREN typeExpression TRPAREN TLBRACE typeInitializerList optComma TRBRACE + { /* added for C99 */ $$ = exprNode_undefined; /*@i87 no checking */ } + argumentExprList : assignExpr { $$ = exprNodeList_singleton ($1); } | argumentExprList TCOMMA assignExpr { $$ = exprNodeList_push ($1, $3); } @@ -1005,7 +1026,24 @@ init : assignExpr | TLBRACE initList TRBRACE { $$ = exprNode_makeInitBlock ($1, $2); } | TLBRACE initList TCOMMA TRBRACE { $$ = exprNode_makeInitBlock ($1, $2); } + | designation init { $$ = exprNode_undefined; } + +/* +** Splint parses these (added in ISO C99), but no checking yet... +*/ + +designation + : designatorList TASSIGN { $$ = $1; } + | newId TCOLON { $$ = exprNode_undefined; + /* gcc extension, obsolete since 2.5 */ } +designatorList + : designator { $$ = exprNode_undefined; } + | designatorList designator { $$ = exprNode_undefined; } + +designator + : TLSQBR constantExpr TRSQBR { $$ = exprNode_undefined; } + | TDOT newId { $$ = exprNode_undefined; } initList : init @@ -1025,9 +1063,6 @@ storageSpecifier | QAUTO { $$ = qual_createAuto (); } | QREGISTER { $$ = qual_createRegister (); } -nullterminatedQualifier: - QNULLTERMINATED IsType { $$ = qual_createNullTerminated (); } - stateClause : stateClausePlain QENDMACRO { $$ = $1; } @@ -1228,12 +1263,20 @@ optCompleteType : /* empty */ { $$ = qtype_unknown (); } | completeTypeSpecifier { $$ = $1; } + +optStructInvariant +: /* empty */ { $$ = constraintList_undefined; } +/* don't want to have support for structure invariant until we're + sure it's stable + | QINVARIANT BufConstraintList QENDMACRO { $$ = $2 } +*/ + suSpc : NotType CSTRUCT newId IsType TLBRACE { sRef_setGlobalScopeSafe (); } CreateStructInnerScope - structDeclList DeleteStructInnerScope { sRef_clearGlobalScopeSafe (); } + structDeclList DeleteStructInnerScope { sRef_clearGlobalScopeSafe (); } TRBRACE - { $$ = declareStruct ($3, $8); } + optStructInvariant { {ctype ct; ct = declareStruct ($3, $8); /* setGlobalStructInfo(ct, $12);*/ $$ = ct;} } | NotType CUNION newId IsType TLBRACE { sRef_setGlobalScopeSafe (); } CreateStructInnerScope structDeclList DeleteStructInnerScope { sRef_clearGlobalScopeSafe (); } @@ -1415,7 +1458,7 @@ abstractDeclBase { $$ = ctype_makeFixedArray (ctype_unknown, exprNode_getLongValue ($2)); } | abstractDeclBase TLSQBR TRSQBR { $$ = ctype_makeArray ($1); } | abstractDeclBase TLSQBR constantExpr TRSQBR - { $$ = ctype_makeFixedArray ($1, exprNode_getLongValue ($3)); } + { $$ = ctype_makeInnerFixedArray ($1, exprNode_getLongValue ($3)); } | IsType TLPAREN TRPAREN { $$ = ctype_makeFunction (ctype_unknown, uentryList_makeMissingParams ()); } | IsType TLPAREN paramTypeList TRPAREN @@ -1438,6 +1481,7 @@ stmt | iterStmt | jumpStmt + iterBody : iterDefStmtList { $$ = $1; } @@ -1605,6 +1649,14 @@ initializerList : initializer { $$ = $1; } | initializerList initializer { $$ = exprNode_concat ($1, $2); } +typeInitializerList + : typeInitializer { $$ = $1; } + | typeInitializerList TCOMMA typeInitializer { $$ = exprNode_concat ($1, $3); } + +typeInitializer + : assignExpr { $$ = $1; } + | TLBRACE typeInitializerList optComma TRBRACE { $$ = $2; } + stmtList : stmt { $$ = $1; } | stmtList stmt { $$ = exprNode_concat ($1, $2); } @@ -1833,6 +1885,10 @@ optSemi : | TSEMI { ; } +optComma + : + | TCOMMA { ; } + id : IDENTIFIER @@ -1846,6 +1902,8 @@ newId typeName : TYPE_NAME | TYPE_NAME_OR_ID { $$ = ctype_unknown; } + | CTYPEOF TLPAREN expr TRPAREN { $$ = exprNode_getType ($3); exprNode_free ($3); } + | CTYPEOF TLPAREN typeExpression TRPAREN { $$ = qtype_getType ($3); } %%