]> git.sur5r.net Git - cc65/commitdiff
Add := assignment op, define some currently unused keywords
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 17 Oct 2003 00:38:21 +0000 (00:38 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 17 Oct 2003 00:38:21 +0000 (00:38 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@2542 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ca65/main.c
src/ca65/pseudo.c
src/ca65/scanner.c
src/ca65/scanner.h
src/ca65/symtab.c
src/ca65/symtab.h

index 047c37b02529e7157e6d0b84944147f31b41d615..972a8869ca1229ede2c12d29d5c2d4fc85e5e3da 100644 (file)
@@ -183,7 +183,7 @@ static void DefineSymbol (const char* Def)
     }
 
     /* Define the symbol */
-    SymDef (SymName, GenLiteralExpr (Val), 0, 0);
+    SymDef (SymName, GenLiteralExpr (Val), SYM_DEFAULT);
 }
 
 
@@ -373,16 +373,20 @@ static void OneLine (void)
            /* If a colon follows, this is a label definition. If there
             * is no colon, it's an assignment.
             */
-                   if (Tok == TOK_EQ) {
+                   if (Tok == TOK_EQ || Tok == TOK_ASSIGN) {
+                /* If it's an assign token, we have a label */
+                unsigned Flags = (Tok == TOK_ASSIGN)? SYM_LABEL : SYM_DEFAULT;
                /* Skip the '=' */
                NextTok ();
                /* Define the symbol with the expression following the '=' */
-               SymDef (Ident, Expression(), 0, 0);
+               SymDef (Ident, Expression(), Flags);
                /* Don't allow anything after a symbol definition */
                Done = 1;
            } else {
+                /* Define the symbol flags */
+                unsigned Flags = IsZPSeg ()? SYM_ZP | SYM_LABEL : SYM_LABEL;
                /* Define a label */
-               SymDef (Ident, GenCurrentPC(), IsZPSeg(), 1);
+               SymDef (Ident, GenCurrentPC (), Flags);
                /* Skip the colon. If NoColonLabels is enabled, allow labels
                 * without a colon if there is no whitespace before the
                 * identifier.
index 41d259abadba4d2ebba934d8d3b623f6280ea214..20dfe2e0cf57357b0786fcf4e61a778b15da1868 100644 (file)
@@ -1243,7 +1243,11 @@ static void DoProc (void)
 {
     if (Tok == TOK_IDENT) {
        /* The new scope has a name */
-       SymDef (SVal, GenCurrentPC (), IsZPSeg (), 1);
+        unsigned Flags = SYM_LABEL;
+        if (IsZPSeg ()) {
+            Flags |= SYM_ZP;
+        }
+       SymDef (SVal, GenCurrentPC (), Flags);
        NextTok ();
     }
     SymEnterLevel ();
@@ -1418,6 +1422,14 @@ static void DoSmart (void)
 
 
 
+static void DoStruct (void)
+/* Struct definition */
+{
+    Error (ERR_NOT_IMPLEMENTED);
+}
+
+
+
 static void DoSunPlus (void)
 /* Switch to the SUNPLUS CPU */
 {
@@ -1426,6 +1438,14 @@ static void DoSunPlus (void)
 
 
 
+static void DoUnion (void)
+/* Union definition */
+{
+    Error (ERR_NOT_IMPLEMENTED);
+}
+
+
+
 static void DoUnexpected (void)
 /* Got an unexpected keyword */
 {
@@ -1525,6 +1545,7 @@ static CtrlDesc CtrlCmdTab [] = {
     { ccNone,          DoUnexpected    },      /* .ENDMACRO */
     { ccNone,          DoEndProc       },
     { ccNone,          DoUnexpected    },      /* .ENDREPEAT */
+    { ccNone,           DoUnexpected    },      /* .ENDSTRUCT */
     { ccNone,          DoError         },
     { ccNone,          DoExitMacro     },
     { ccNone,          DoExport        },
@@ -1589,9 +1610,12 @@ static CtrlDesc CtrlCmdTab [] = {
     { ccNone,          DoUnexpected    },      /* .STRAT */
     { ccNone,                  DoUnexpected    },      /* .STRING */
     { ccNone,          DoUnexpected    },      /* .STRLEN */
+    { ccNone,           DoStruct        },
     { ccNone,          DoSunPlus       },
+    { ccNone,           DoUnexpected    },      /* .TAG */
     { ccNone,          DoUnexpected    },      /* .TCOUNT */
     { ccNone,                  DoUnexpected    },      /* .TIME */
+    { ccNone,           DoUnion         },
     { ccNone,           DoUnexpected    },      /* .VERSION */
     { ccNone,          DoWarning       },
     { ccNone,          DoWord          },
index 12c92c86fc8274801bcd394677725c5a87fb8918..7ac09acdf0877802dcb9e16031e28c9a1e023af1 100644 (file)
@@ -159,6 +159,7 @@ struct DotKeyword {
     { ".ENDPROC",      TOK_ENDPROC     },
     { ".ENDREP",       TOK_ENDREP      },
     { ".ENDREPEAT",    TOK_ENDREP      },
+    { ".ENDSTRUCT",    TOK_ENDSTRUCT   },
     { ".ERROR",        TOK_ERROR       },
     { ".EXITMAC",      TOK_EXITMACRO   },
     { ".EXITMACRO",    TOK_EXITMACRO   },
@@ -233,9 +234,12 @@ struct DotKeyword {
     { ".STRAT",                TOK_STRAT       },
     { ".STRING",       TOK_STRING      },
     { ".STRLEN",       TOK_STRLEN      },
+    { ".STRUCT",        TOK_STRUCT      },
     { ".SUNPLUS",      TOK_SUNPLUS     },
+    { ".TAG",           TOK_TAG         },
     { ".TCOUNT",       TOK_TCOUNT      },
     { ".TIME",                 TOK_TIME        },
+    { ".UNION",         TOK_UNION       },
     { ".VERSION",       TOK_VERSION     },
     { ".WARNING",      TOK_WARNING     },
     { ".WORD",                 TOK_WORD        },
@@ -911,6 +915,11 @@ CharAgain:
                    Tok = TOK_ULABEL;
                    break;
 
+                case '=':
+                    NextChar ();
+                    Tok = TOK_ASSIGN;
+                    break;
+
                default:
                    Tok = TOK_COLON;
                    break;
index 1ac9ff69b6b13fe318d0ea7df7725c0ff2b26bf7..f65ecde76a3ad1d75c29b5a20416736e1b287d64 100644 (file)
@@ -59,57 +59,58 @@ enum Token {
     TOK_MNEMO,                 /* A mnemonic */
 
     TOK_INTCON,        /* Integer constant */
-    TOK_CHARCON,       /* Character constant */
-    TOK_STRCON,                /* String constant */
-
-    TOK_A,             /* A)ccu */
-    TOK_X,             /* X register */
-    TOK_Y,             /* Y register */
-    TOK_S,             /* S register */
-
-    TOK_ULABEL,                /* :++ or :-- */
-
-    TOK_EQ,            /* = */
-    TOK_NE,            /* <> */
-    TOK_LT,            /* < */
-    TOK_GT,            /* > */
-    TOK_LE,            /* <= */
-    TOK_GE,            /* >= */
-
-    TOK_BAND,                  /* .and */
-    TOK_BOR,           /* .or */
-    TOK_BXOR,                  /* .xor */
-    TOK_BNOT,          /* .not */
-
-    TOK_PLUS,          /* + */
-    TOK_MINUS,         /* - */
+    TOK_CHARCON,       /* Character constant */
+    TOK_STRCON,                /* String constant */
+
+    TOK_A,             /* A)ccu */
+    TOK_X,             /* X register */
+    TOK_Y,             /* Y register */
+    TOK_S,             /* S register */
+
+    TOK_ASSIGN,         /* := */
+    TOK_ULABEL,                /* :++ or :-- */
+
+    TOK_EQ,            /* = */
+    TOK_NE,            /* <> */
+    TOK_LT,            /* < */
+    TOK_GT,            /* > */
+    TOK_LE,            /* <= */
+    TOK_GE,            /* >= */
+
+    TOK_BAND,                  /* .and */
+    TOK_BOR,           /* .or */
+    TOK_BXOR,                  /* .xor */
+    TOK_BNOT,          /* .not */
+
+    TOK_PLUS,          /* + */
+    TOK_MINUS,         /* - */
     TOK_MUL,           /* * */
     TOK_STAR = TOK_MUL,        /* Alias */
-    TOK_DIV,           /* / */
-    TOK_MOD,           /* ! */
-    TOK_OR,            /* | */
-    TOK_XOR,           /* ^ */
-    TOK_AND,           /* & */
-    TOK_SHL,           /* << */
-    TOK_SHR,           /* >> */
-    TOK_NOT,           /* ~ */
-
-    TOK_PC,            /* $ if enabled */
+    TOK_DIV,           /* / */
+    TOK_MOD,           /* ! */
+    TOK_OR,            /* | */
+    TOK_XOR,           /* ^ */
+    TOK_AND,           /* & */
+    TOK_SHL,           /* << */
+    TOK_SHR,           /* >> */
+    TOK_NOT,           /* ~ */
+
+    TOK_PC,            /* $ if enabled */
     TOK_NAMESPACE,     /* :: */
-    TOK_DOT,           /* . */
-    TOK_COMMA,         /* , */
-    TOK_HASH,          /* # */
-    TOK_COLON,                 /* : */
-    TOK_LPAREN,                /* ( */
-    TOK_RPAREN,                /* ) */
-    TOK_LBRACK,                /* [ */
-    TOK_RBRACK,                /* ] */
+    TOK_DOT,           /* . */
+    TOK_COMMA,         /* , */
+    TOK_HASH,          /* # */
+    TOK_COLON,                 /* : */
+    TOK_LPAREN,                /* ( */
+    TOK_RPAREN,                /* ) */
+    TOK_LBRACK,                /* [ */
+    TOK_RBRACK,                /* ] */
 
     TOK_OVERRIDE_ZP,    /* z: */
     TOK_OVERRIDE_ABS,   /* a: */
     TOK_OVERRIDE_FAR,   /* f: */
 
-    TOK_MACPARAM,      /* Macro parameter, not generated by scanner */
+    TOK_MACPARAM,      /* Macro parameter, not generated by scanner */
     TOK_REPCOUNTER,    /* Repeat counter, not generated by scanner */
 
     /* The next ones are tokens for the pseudo instructions. Keep together! */
@@ -147,6 +148,7 @@ enum Token {
     TOK_ENDMACRO,
     TOK_ENDPROC,
     TOK_ENDREP,
+    TOK_ENDSTRUCT,
     TOK_ERROR,
     TOK_EXITMACRO,
     TOK_EXPORT,
@@ -211,9 +213,12 @@ enum Token {
     TOK_STRAT,
     TOK_STRING,
     TOK_STRLEN,
+    TOK_STRUCT,
     TOK_SUNPLUS,
+    TOK_TAG,
     TOK_TCOUNT,
     TOK_TIME,
+    TOK_UNION,
     TOK_VERSION,
     TOK_WARNING,
     TOK_WORD,
@@ -221,7 +226,7 @@ enum Token {
     TOK_ZEROPAGE,
     TOK_LASTPSEUDO     = TOK_ZEROPAGE,
 
-    TOK_COUNT                  /* Count of tokens */
+    TOK_COUNT                  /* Count of tokens */
 };
 
 
index a89113d2be042ffa4263f457dd80206fb5d9eb59..09837720c1f77001ead904efd8376eedb50f1fd1 100644 (file)
@@ -394,7 +394,7 @@ int SymIsLocalLevel (void)
 
 
 
-void SymDef (const char* Name, ExprNode* Expr, int ZP, int Label)
+void SymDef (const char* Name, ExprNode* Expr, unsigned Flags)
 /* Define a new symbol */
 {
     /* Do we have such a symbol? */
@@ -422,10 +422,10 @@ void SymDef (const char* Name, ExprNode* Expr, int ZP, int Label)
         S->V.Expr  = Expr;
     }
     S->Flags |= SF_DEFINED;
-    if (ZP) {
+    if (Flags & SYM_ZP) {
        S->Flags |= SF_ZP;
     }
-    if (Label) {
+    if (Flags & SYM_LABEL) {
        S->Flags |= SF_LABEL;
     }
 
index 71cc42977f50436960875989b43e4b307f3e9ef4..9c3c1987a3c010ce82f912ab82cd322cbc2876d6 100644 (file)
 #define SCOPE_GLOBAL    1
 #define SCOPE_LOCAL     2
 
+/* Flags used in SymDef */
+#define SYM_DEFAULT     0x00
+#define SYM_ZP          0x01
+#define SYM_LABEL       0x02
+
 
 
 /*****************************************************************************/
@@ -76,7 +81,7 @@ void SymLeaveLevel (void);
 int SymIsLocalLevel (void);
 /* Return true if we are on a local symbol table level. */
 
-void SymDef (const char* Name, ExprNode* Expr, int ZP, int Label);
+void SymDef (const char* Name, ExprNode* Expr, unsigned Flags);
 /* Define a new symbol */
 
 SymEntry* SymRef (const char* Name, int Scope);