Browse Source

* accept several previously refused syntax, still uncomplete

pierre 26 years ago
parent
commit
66422d18ba
1 changed files with 15 additions and 5 deletions
  1. 15 5
      compiler/ra386int.pas

+ 15 - 5
compiler/ra386int.pas

@@ -2650,7 +2650,7 @@ end;
 
 
 
 
 
 
-Procedure BuildReference(var instr: TInstruction);
+Procedure BuildReference(var instr: TInstruction;allow_segreg : boolean);
 {*********************************************************************}
 {*********************************************************************}
 { EXIT CONDITION:  On exit the routine should point to either the     }
 { EXIT CONDITION:  On exit the routine should point to either the     }
 {       AS_COMMA or AS_SEPARATOR token.                               }
 {       AS_COMMA or AS_SEPARATOR token.                               }
@@ -2678,12 +2678,19 @@ Begin
      if actasmtoken = AS_COLON then
      if actasmtoken = AS_COLON then
       begin
       begin
         segreg := TRUE;
         segreg := TRUE;
-        Message(assem_e_expression_form_not_supported);
+        if not allow_segreg then
+          Message(assem_e_expression_form_not_supported);
         if instr.operands[operandnum].ref.segment <> R_NO then
         if instr.operands[operandnum].ref.segment <> R_NO then
           Message(assem_e_defining_seg_more_than_once);
           Message(assem_e_defining_seg_more_than_once);
         instr.operands[operandnum].ref.segment := findsegment(reg);
         instr.operands[operandnum].ref.segment := findsegment(reg);
         { Here we should process the syntax of the form   }
         { Here we should process the syntax of the form   }
         { [reg:reg...]                                    }
         { [reg:reg...]                                    }
+        consume(AS_COLON);
+        if actasmtoken=AS_REGISTER then
+          BuildReference(instr,false)
+        else
+          instr.operands[operandnum].ref.offset:=BuildRefExpression;
+        exit;
       end
       end
      else { SREG:[REG...] where SReg: is optional.    }
      else { SREG:[REG...] where SReg: is optional.    }
       Begin
       Begin
@@ -2880,7 +2887,7 @@ end;
                    Consume(AS_PLUS);
                    Consume(AS_PLUS);
                    Case actasmtoken of
                    Case actasmtoken of
                      AS_REGISTER: Begin
                      AS_REGISTER: Begin
-                                   BuildReference(instr);
+                                   BuildReference(instr,false);
                                  end;
                                  end;
                      AS_ID: Begin
                      AS_ID: Begin
                              if actasmpattern[1] = '@' then
                              if actasmpattern[1] = '@' then
@@ -2976,7 +2983,7 @@ end;
                           Message(assem_e_invalid_operand_in_bracket_expression);
                           Message(assem_e_invalid_operand_in_bracket_expression);
                    end;
                    end;
          { Variable reference expression }
          { Variable reference expression }
-         AS_REGISTER: BuildReference(instr);
+         AS_REGISTER: BuildReference(instr,true);
      else
      else
        Begin
        Begin
          Message(assem_e_invalid_reference_syntax);
          Message(assem_e_invalid_reference_syntax);
@@ -3622,7 +3629,10 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.28  1999-04-18 00:32:23  pierre
+  Revision 1.29  1999-04-19 09:44:26  pierre
+   * accept several previously refused syntax, still uncomplete
+
+  Revision 1.28  1999/04/18 00:32:23  pierre
    * fix for bug0124 and better error position info
    * fix for bug0124 and better error position info
 
 
   Revision 1.27  1999/04/17 22:16:58  pierre
   Revision 1.27  1999/04/17 22:16:58  pierre