%token <yyint> MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN
%token <yyint> SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN
%token <yyint> XOR_ASSIGN OR_ASSIGN
-%token TYPEDEF EXTERN STATIC AUTO REGISTER CODE EEPROM INTERRUPT SFR AT SBIT
-%token REENTRANT USING XDATA DATA IDATA PDATA VAR_ARGS CRITICAL NONBANKED BANKED
+%token TYPEDEF EXTERN STATIC AUTO REGISTER CODE EEPROM INTERRUPT SFR SFR16 SFR32
+%token AT SBIT REENTRANT USING XDATA DATA IDATA PDATA VAR_ARGS CRITICAL
+%token NONBANKED BANKED SHADOWREGS WPARAM
%token CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE CONST VOLATILE VOID BIT
%token STRUCT UNION ENUM ELIPSIS RANGE FAR
%token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN
%token BITWISEAND UNARYMINUS IPUSH IPOP PCALL ENDFUNCTION JUMPTABLE
%token RRC RLC
%token CAST CALL PARAM NULLOP BLOCK LABEL RECEIVE SEND ARRAYINIT
-%token DUMMY_READ_VOLATILE ENDCRITICAL SWAP
+%token DUMMY_READ_VOLATILE ENDCRITICAL SWAP INLINE RESTRICT
%type <yyint> Interrupt_storage
%type <sym> identifier declarator declarator2 declarator3 enumerator_list enumerator
SPEC_EXTR($1->etype) = 1;
}
}
- addSymChain ($1);
+ addSymChain (&$1);
allocVariables ($1) ;
cleanUpLevel (SymbolTab,1);
}
werror(W_BANKED_WITH_NONBANKED);
}
}
+ | SHADOWREGS {$$ = newLink (SPECIFIER);
+ FUNC_ISSHADOWREGS($$) = 1;
+ }
+ | WPARAM {$$ = newLink (SPECIFIER);
+ FUNC_ISWPARAM($$) = 1;
+ }
| BANKED {$$ = newLink (SPECIFIER);
FUNC_BANKED($$) = 1;
if (FUNC_NONBANKED($$)) {
{
$$ = newNode (CALL,$1,$3) ; $$->left->funcName = 1;
}
- | postfix_expr '.' identifier
+ | postfix_expr '.' { ignoreTypedefType = 1; } identifier
{
- $3 = newSymbol($3->name,NestLevel);
- $3->implicit = 1;
- $$ = newNode(PTR_OP,newNode('&',$1,NULL),newAst_VALUE(symbolVal($3)));
-/* $$ = newNode('.',$1,newAst(EX_VALUE,symbolVal($3))) ; */
+ ignoreTypedefType = 0;
+ $4 = newSymbol($4->name,NestLevel);
+ $4->implicit = 1;
+ $$ = newNode(PTR_OP,newNode('&',$1,NULL),newAst_VALUE(symbolVal($4)));
+/* $$ = newNode('.',$1,newAst(EX_VALUE,symbolVal($4))) ; */
}
- | postfix_expr PTR_OP identifier
+ | postfix_expr PTR_OP { ignoreTypedefType = 1; } identifier
{
- $3 = newSymbol($3->name,NestLevel);
- $3->implicit = 1;
- $$ = newNode(PTR_OP,$1,newAst_VALUE(symbolVal($3)));
+ ignoreTypedefType = 0;
+ $4 = newSymbol($4->name,NestLevel);
+ $4->implicit = 1;
+ $$ = newNode(PTR_OP,$1,newAst_VALUE(symbolVal($4)));
}
| postfix_expr INC_OP
{ $$ = newNode(INC_OP,$1,NULL);}
assignment_expr
: conditional_expr
- | unary_expr assignment_operator assignment_expr
+ | cast_expr assignment_operator assignment_expr
{
switch ($2) {
$$ = newLink(SPECIFIER) ;
SPEC_NOUN($$) = V_SBIT;
SPEC_SCLS($$) = S_SBIT;
+ SPEC_BLEN($$) = 1;
+ SPEC_BSTR($$) = 0;
ignoreTypedefType = 1;
}
| sfr_attributes
}
;
+sfr_attributes
+ : SFR16 {
+ $$ = newLink(SPECIFIER) ;
+ FUNC_REGBANK($$) = 0;
+ SPEC_NOUN($$) = V_INT;
+ SPEC_SCLS($$) = S_SFR;
+ SPEC_USIGN($$) = 1 ;
+ ignoreTypedefType = 1;
+ }
+ ;
+
+sfr_attributes
+ : SFR32 {
+ $$ = newLink(SPECIFIER) ;
+ FUNC_REGBANK($$) = 0;
+ SPEC_NOUN($$) = V_INT;
+ SPEC_SCLS($$) = S_SFR;
+ SPEC_LONG($$) = 1;
+ SPEC_USIGN($$) = 1;
+ ignoreTypedefType = 1;
+ }
+ ;
+
struct_or_union_specifier
: struct_or_union opt_stag
{
// check for errors in structure members
for (sym=$5; sym; sym=sym->next) {
if (IS_ABSOLUTE(sym->etype)) {
- werrorfl(filename, sym->lineDef, E_NOT_ALLOWED, "'at'");
+ werrorfl(sym->fileDef, sym->lineDef, E_NOT_ALLOWED, "'at'");
SPEC_ABSA(sym->etype) = 0;
}
if (IS_SPEC(sym->etype) && SPEC_SCLS(sym->etype)) {
- werrorfl(filename, sym->lineDef, E_NOT_ALLOWED, "storage class");
+ werrorfl(sym->fileDef, sym->lineDef, E_NOT_ALLOWED, "storage class");
printTypeChainRaw (sym->type,NULL);
SPEC_SCLS(sym->etype) = 0;
}
for (dsym=sym->next; dsym; dsym=dsym->next) {
- if (strcmp(sym->name, dsym->name)==0) {
- werrorfl(filename, sym->lineDef, E_DUPLICATE_MEMBER,
+ if (*dsym->name && strcmp(sym->name, dsym->name)==0) {
+ werrorfl(sym->fileDef, sym->lineDef, E_DUPLICATE_MEMBER,
$1==STRUCT ? "struct" : "union", sym->name);
+ werrorfl(dsym->fileDef, dsym->lineDef, E_PREVIOUS_DEF);
}
}
}
sdef = $2 ;
sdef->fields = reverseSyms($5) ; /* link the fields */
sdef->size = compStructSize($1,sdef); /* update size of */
-
+ promoteAnonStructs ($1, sdef);
+
/* Create the specifier */
$$ = newLink (SPECIFIER) ;
SPEC_NOUN($$) = V_STRUCT;
else
$1->bitVar = bitsize;
}
+ | { $$ = newSymbol ("", NestLevel) ; }
+
;
enum_specifier
csym=findSym(enumTab,$2,$2->name);
if ((csym && csym->level == $2->level))
- werrorfl(filename, $2->lineDef, E_DUPLICATE_TYPEDEF,csym->name);
+ {
+ werrorfl($2->fileDef, $2->lineDef, E_DUPLICATE_TYPEDEF,csym->name);
+ werrorfl(csym->fileDef, csym->lineDef, E_PREVIOUS_DEF);
+ }
enumtype = newEnumType ($4); //copyLinkChain(cenum->type);
SPEC_SCLS(getSpec(enumtype)) = 0;
for (dsym=$1; dsym; dsym=dsym->next)
{
if (strcmp($3->name, dsym->name)==0)
- werrorfl(filename, $3->lineDef, E_DUPLICATE_MEMBER, "enum", $3->name);
+ {
+ werrorfl($3->fileDef, $3->lineDef, E_DUPLICATE_MEMBER, "enum", $3->name);
+ werrorfl(dsym->fileDef, dsym->lineDef, E_PREVIOUS_DEF);
+ }
}
$3->next = $1 ;
SPEC_ENUM($1->etype) = 1;
$$ = $1 ;
// do this now, so we can use it for the next enums in the list
- addSymChain($1);
+ addSymChain(&$1);
}
;
pointerTypes($2->type,$1);
addDecl ($2,0,$1);
for (loop=$2;loop;loop->_isparm=1,loop=loop->next);
- addSymChain ($2);
+ addSymChain (&$2);
$$ = symbolVal($2);
ignoreTypedefType = 0;
}
labeled_statement
// : identifier ':' statement { $$ = createLabel($1,$3); }
- : identifier ':' { $$ = createLabel($1,NULL); }
- | CASE constant_expr ':' statement
+ : identifier ':' { $$ = createLabel($1,NULL);
+ $1->isitmp = 0; }
+ | CASE constant_expr ':'
{
if (STACK_EMPTY(swStk))
- $$ = createCase(NULL,$2,$4);
+ $$ = createCase(NULL,$2,NULL);
else
- $$ = createCase(STACK_PEEK(swStk),$2,$4);
+ $$ = createCase(STACK_PEEK(swStk),$2,NULL);
}
- | DEFAULT { $<asts>$ = newNode(DEFAULT,NULL,NULL); } ':' statement
+ | DEFAULT { $<asts>$ = newNode(DEFAULT,NULL,NULL); } ':'
{
if (STACK_EMPTY(swStk))
- $$ = createDefault(NULL,$<asts>2,$4);
+ $$ = createDefault(NULL,$<asts>2,NULL);
else
- $$ = createDefault(STACK_PEEK(swStk),$<asts>2,$4);
+ $$ = createDefault(STACK_PEEK(swStk),$<asts>2,NULL);
}
;
: start_block end_block { $$ = createBlock(NULL,NULL); }
| start_block statement_list end_block { $$ = createBlock(NULL,$2) ; }
| start_block
- declaration_list { addSymChain($2); }
+ declaration_list { addSymChain(&$2); }
end_block { $$ = createBlock($2,NULL) ; }
| start_block
- declaration_list { addSymChain ($2); }
+ declaration_list { addSymChain (&$2); }
statement_list
end_block {$$ = createBlock($2,$4) ; }
| error ';' { $$ = NULL ; }