From ab8dd7a27bec0ef5629bfc61e70bc20366dad9bc Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 14 Jun 2000 16:52:09 +0000 Subject: [PATCH] * fixed reference parsing --- compiler/ra386int.pas | 44 ++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/compiler/ra386int.pas b/compiler/ra386int.pas index 30318eec0e..15cc589725 100644 --- a/compiler/ra386int.pas +++ b/compiler/ra386int.pas @@ -842,18 +842,11 @@ Begin tempstr:=actasmpattern; prevtok:=prevasmtoken; consume(AS_ID); - if actasmtoken=AS_DOT then + if SearchIConstant(tempstr,l) then begin - BuildRecordOffsetSize(tempstr,l,k); str(l, tempstr); expr:=expr + tempstr; end - else - if SearchIConstant(tempstr,l) then - begin - str(l, tempstr); - expr:=expr + tempstr; - end else begin hs:=''; @@ -900,14 +893,23 @@ Begin Message(asmr_e_cant_have_multiple_relocatable_symbols); if (expr='') or (expr[length(expr)]='+') then begin - delete(expr,length(expr),1); - if not(actasmtoken in [AS_MINUS,AS_PLUS,AS_COMMA,AS_SEPARATOR,AS_END,AS_RBRACKET]) then - Message(asmr_e_only_add_relocatable_symbol); + { don't remove the + if there could be a record field } + if actasmtoken<>AS_DOT then + delete(expr,length(expr),1); end else Message(asmr_e_only_add_relocatable_symbol); end; end; + if actasmtoken=AS_DOT then + begin + BuildRecordOffsetSize(tempstr,l,k); + str(l, tempstr); + expr:=expr + tempstr; + end; + { check if there are wrong operator used like / or mod etc. } + if (hs<>'') and not(actasmtoken in [AS_MINUS,AS_PLUS,AS_COMMA,AS_SEPARATOR,AS_END,AS_RBRACKET]) then + Message(asmr_e_only_add_relocatable_symbol); end; AS_END, AS_RBRACKET, @@ -1187,9 +1189,16 @@ Begin begin if not GotPlus then Message(asmr_e_invalid_reference_syntax); - l:=BuildRefConstExpression; - GotPlus:=(prevasmtoken=AS_PLUS); - GotStar:=(prevasmtoken=AS_STAR); + BuildConstSymbolExpression(true,true,l,tempstr); + if tempstr<>'' then + begin + if GotStar then + Message(asmr_e_only_add_relocatable_symbol); + if not assigned(opr.ref.symbol) then + opr.ref.symbol:=newasmsymbol(tempstr) + else + Message(asmr_e_cant_have_multiple_relocatable_symbols); + end; if GotStar then opr.ref.scalefactor:=l else @@ -1199,6 +1208,8 @@ Begin else Inc(opr.ref.offset,l); end; + GotPlus:=(prevasmtoken=AS_PLUS); + GotStar:=(prevasmtoken=AS_STAR); end; AS_RBRACKET : @@ -1878,7 +1889,10 @@ begin end. { $Log$ - Revision 1.71 2000-05-23 20:36:28 peter + Revision 1.72 2000-06-14 16:52:09 peter + * fixed reference parsing + + Revision 1.71 2000/05/23 20:36:28 peter + typecasting support for variables, but be carefull as word,byte can't be used because they are reserved assembler keywords