Bläddra i källkod

New tokens for new record operators: Initialize, Copy and Finalize. Small adjustments in compiler for new tokens.

git-svn-id: branches/maciej/smart_pointers@33115 -
maciej-izak 9 år sedan
förälder
incheckning
4122fbd3b7
5 ändrade filer med 29 tillägg och 5 borttagningar
  1. 6 2
      compiler/pdecvar.pas
  2. 2 2
      compiler/pstatmnt.pas
  3. 4 1
      compiler/ptconst.pas
  4. 3 0
      compiler/symtable.pas
  5. 14 0
      compiler/tokens.pas

+ 6 - 2
compiler/pdecvar.pas

@@ -1384,7 +1384,8 @@ implementation
                end;
 
              { Check for EXTERNAL etc directives before a semicolon }
-             if (idtoken in [_EXPORT,_EXTERNAL,_WEAKEXTERNAL,_PUBLIC,_CVAR]) then
+             if (idtoken in [_EXPORT,_EXTERNAL,_PUBLIC,_CVAR]) or
+                (idtoken = _WEAKEXTERNAL) then
                begin
                  read_public_and_external_sc(sc);
                  allowdefaultvalue:=false;
@@ -1445,7 +1446,10 @@ implementation
              { Check for EXTERNAL etc directives or, in macpas, if cs_external_var is set}
              if (
                  (
-                  (idtoken in [_EXPORT,_EXTERNAL,_WEAKEXTERNAL,_PUBLIC,_CVAR]) and
+                  (
+                   (idtoken in [_EXPORT,_EXTERNAL,_PUBLIC,_CVAR]) or
+                   (idtoken = _WEAKEXTERNAL)
+                  ) and
                   (m_cvar_support in current_settings.modeswitches)
                  ) or
                  (

+ 2 - 2
compiler/pstatmnt.pas

@@ -1360,7 +1360,7 @@ implementation
          filepos:=current_tokenpos;
          consume(starttoken);
 
-         while not(token in [_END,_FINALIZATION]) do
+         while not((token = _END) or (token = _FINALIZATION)) do
            begin
               if first=nil then
                 begin
@@ -1372,7 +1372,7 @@ implementation
                    tstatementnode(last).right:=cstatementnode.create(statement,nil);
                    last:=tstatementnode(last).right;
                 end;
-              if (token in [_END,_FINALIZATION]) then
+              if ((token = _END) or (token = _FINALIZATION)) then
                 break
               else
                 begin

+ 4 - 1
compiler/ptconst.pas

@@ -92,7 +92,10 @@ implementation
            (
             (
              (token = _ID) and
-             (idtoken in [_EXPORT,_EXTERNAL,_WEAKEXTERNAL,_PUBLIC,_CVAR]) and
+             (
+              (idtoken in [_EXPORT,_EXTERNAL,_PUBLIC,_CVAR]) or
+              (idtoken = _WEAKEXTERNAL)
+             ) and
              (m_cvar_support in current_settings.modeswitches)
             ) or
             (

+ 3 - 0
compiler/symtable.pas

@@ -421,6 +421,9 @@ interface
     { _ASSIGNMENT    }  'assign',
     { _OP_EXPLICIT   }  'explicit',
     { _OP_ENUMERATOR }  'enumerator',
+    { _OP_INITIALIZE }  'initialize',
+    { _OP_COPY       }  'copy',
+    { _OP_FINALIZE   }  'finalize',    
     { _OP_INC        }  'inc',
     { _OP_DEC        }  'dec');
 

+ 14 - 0
compiler/tokens.pas

@@ -56,6 +56,9 @@ type
     _ASSIGNMENT,
     _OP_EXPLICIT,
     _OP_ENUMERATOR,
+    _OP_INITIALIZE,
+    _OP_COPY,
+    _OP_FINALIZE,    
     _OP_INC,
     _OP_DEC,
     { special chars }
@@ -129,6 +132,7 @@ type
     _VAR,
     _XOR,
     _CASE,
+    _COPY,
     _CVAR,
     _ELSE,
     _EXIT,
@@ -219,6 +223,7 @@ type
     _CPPCLASS,
     _EXPLICIT,
     _EXTERNAL,
+    _FINALIZE,
     _FUNCTION,
     _IMPLICIT,
     _LESSTHAN,
@@ -268,6 +273,7 @@ type
     _DESTRUCTOR,
     _ENUMERATOR,
     _IMPLEMENTS,
+    _INITIALIZE,
     _INTERNPROC,
     _LOGICALAND,
     _LOGICALNOT,
@@ -317,6 +323,8 @@ const
   first_overloaded = succ(NOTOKEN);
   last_overloaded  = _OP_DEC;
   last_operator = _GENERICSPECIALTOKEN;
+  first_managment_operator = _OP_INITIALIZE;
+  last_managment_operator = _OP_FINALIZE;
 
   highest_precedence = oppower;
 
@@ -376,6 +384,9 @@ const
       (str:':='            ;special:true ;keyword:[m_none];op:NOTOKEN),
       (str:'explicit'      ;special:true ;keyword:[m_none];op:NOTOKEN),
       (str:'enumerator'    ;special:true ;keyword:[m_none];op:NOTOKEN),
+      (str:'initialize'    ;special:true ;keyword:[m_none];op:NOTOKEN),
+      (str:'copy'          ;special:true ;keyword:[m_none];op:NOTOKEN),
+      (str:'finalize'      ;special:true ;keyword:[m_none];op:NOTOKEN),
       (str:'inc'           ;special:true ;keyword:[m_none];op:NOTOKEN),
       (str:'dec'           ;special:true ;keyword:[m_none];op:NOTOKEN),
     { Special chars }
@@ -449,6 +460,7 @@ const
       (str:'VAR'           ;special:false;keyword:alllanguagemodes;op:NOTOKEN),
       (str:'XOR'           ;special:false;keyword:alllanguagemodes;op:_OP_XOR),
       (str:'CASE'          ;special:false;keyword:alllanguagemodes;op:NOTOKEN),
+      (str:'COPY'          ;special:false;keyword:alllanguagemodes;op:NOTOKEN),
       (str:'CVAR'          ;special:false;keyword:[m_none];op:NOTOKEN),
       (str:'ELSE'          ;special:false;keyword:alllanguagemodes;op:NOTOKEN),
       (str:'EXIT'          ;special:false;keyword:[m_none];op:NOTOKEN),
@@ -539,6 +551,7 @@ const
       (str:'CPPCLASS'      ;special:false;keyword:[m_fpc];op:NOTOKEN),
       (str:'EXPLICIT'      ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name }
       (str:'EXTERNAL'      ;special:false;keyword:[m_none];op:NOTOKEN),
+      (str:'FINALIZE'      ;special:false;keyword:[m_none];op:NOTOKEN),
       (str:'FUNCTION'      ;special:false;keyword:alllanguagemodes;op:NOTOKEN),
       (str:'IMPLICIT'      ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name }
       (str:'LESSTHAN'      ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name }
@@ -588,6 +601,7 @@ const
       (str:'DESTRUCTOR'    ;special:false;keyword:alllanguagemodes-[m_iso,m_extpas];op:NOTOKEN),
       (str:'ENUMERATOR'    ;special:false;keyword:[m_none];op:_OP_ENUMERATOR),
       (str:'IMPLEMENTS'    ;special:false;keyword:[m_none];op:NOTOKEN),
+      (str:'INITIALIZE'    ;special:false;keyword:[m_none];op:NOTOKEN),
       (str:'INTERNPROC'    ;special:false;keyword:[m_none];op:NOTOKEN),
       (str:'LOGICALAND'    ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name }
       (str:'LOGICALNOT'    ;special:false;keyword:[m_none];op:NOTOKEN), { delphi operator name }