Added .SCOPE/.ENDSCOPE
git-svn-id: svn://svn.cc65.org/cc65/trunk@2624 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
@@ -7,7 +7,7 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 2000-2003 Ullrich von Bassewitz */
|
/* (C) 2000-2003 Ullrich von Bassewitz */
|
||||||
/* R<>merstrasse 52 */
|
/* R<>merstra<EFBFBD>e 52 */
|
||||||
/* D-70794 Filderstadt */
|
/* D-70794 Filderstadt */
|
||||||
/* EMail: uz@cc65.org */
|
/* EMail: uz@cc65.org */
|
||||||
/* */
|
/* */
|
||||||
@@ -265,3 +265,4 @@ void WriteFiles (void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -710,6 +710,19 @@ static void DoEndProc (void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void DoEndScope (void)
|
||||||
|
/* Leave a lexical level */
|
||||||
|
{
|
||||||
|
if (CurrentScope != RootScope) {
|
||||||
|
SymLeaveLevel ();
|
||||||
|
} else {
|
||||||
|
/* No local scope */
|
||||||
|
ErrorSkip ("No open lexical level");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void DoError (void)
|
static void DoError (void)
|
||||||
/* User error */
|
/* User error */
|
||||||
{
|
{
|
||||||
@@ -1396,6 +1409,35 @@ static void DoROData (void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void DoScope (void)
|
||||||
|
/* Start a local scope */
|
||||||
|
{
|
||||||
|
char Name[sizeof (SVal)];
|
||||||
|
|
||||||
|
if (Tok == TOK_IDENT) {
|
||||||
|
|
||||||
|
unsigned AddrSize;
|
||||||
|
|
||||||
|
/* The new scope has a name. Remember and skip it. */
|
||||||
|
strcpy (Name, SVal);
|
||||||
|
NextTok ();
|
||||||
|
|
||||||
|
/* Read an optional address size specifier */
|
||||||
|
AddrSize = OptionalAddrSize ();
|
||||||
|
|
||||||
|
/* Enter a new scope with the given name */
|
||||||
|
SymEnterLevel (Name, AddrSize);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
/* An unnamed scope */
|
||||||
|
SymEnterLevel (AnonName (Name, sizeof (Name), "Scope"), ADDR_SIZE_DEFAULT);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void DoSegment (void)
|
static void DoSegment (void)
|
||||||
/* Switch to another segment */
|
/* Switch to another segment */
|
||||||
{
|
{
|
||||||
@@ -1570,6 +1612,7 @@ static CtrlDesc CtrlCmdTab [] = {
|
|||||||
{ ccNone, DoUnexpected }, /* .ENDMACRO */
|
{ ccNone, DoUnexpected }, /* .ENDMACRO */
|
||||||
{ ccNone, DoEndProc },
|
{ ccNone, DoEndProc },
|
||||||
{ ccNone, DoUnexpected }, /* .ENDREPEAT */
|
{ ccNone, DoUnexpected }, /* .ENDREPEAT */
|
||||||
|
{ ccNone, DoEndScope },
|
||||||
{ ccNone, DoUnexpected }, /* .ENDSTRUCT */
|
{ ccNone, DoUnexpected }, /* .ENDSTRUCT */
|
||||||
{ ccNone, DoError },
|
{ ccNone, DoError },
|
||||||
{ ccNone, DoExitMacro },
|
{ ccNone, DoExitMacro },
|
||||||
@@ -1629,6 +1672,7 @@ static CtrlDesc CtrlCmdTab [] = {
|
|||||||
{ ccNone, DoRes },
|
{ ccNone, DoRes },
|
||||||
{ ccNone, DoInvalid }, /* .RIGHT */
|
{ ccNone, DoInvalid }, /* .RIGHT */
|
||||||
{ ccNone, DoROData },
|
{ ccNone, DoROData },
|
||||||
|
{ ccNone, DoScope },
|
||||||
{ ccNone, DoSegment },
|
{ ccNone, DoSegment },
|
||||||
{ ccNone, DoSetCPU },
|
{ ccNone, DoSetCPU },
|
||||||
{ ccNone, DoSmart },
|
{ ccNone, DoSmart },
|
||||||
|
|||||||
@@ -160,6 +160,7 @@ struct DotKeyword {
|
|||||||
{ ".ENDPROC", TOK_ENDPROC },
|
{ ".ENDPROC", TOK_ENDPROC },
|
||||||
{ ".ENDREP", TOK_ENDREP },
|
{ ".ENDREP", TOK_ENDREP },
|
||||||
{ ".ENDREPEAT", TOK_ENDREP },
|
{ ".ENDREPEAT", TOK_ENDREP },
|
||||||
|
{ ".ENDSCOPE", TOK_ENDSCOPE },
|
||||||
{ ".ENDSTRUCT", TOK_ENDSTRUCT },
|
{ ".ENDSTRUCT", TOK_ENDSTRUCT },
|
||||||
{ ".ERROR", TOK_ERROR },
|
{ ".ERROR", TOK_ERROR },
|
||||||
{ ".EXITMAC", TOK_EXITMACRO },
|
{ ".EXITMAC", TOK_EXITMACRO },
|
||||||
@@ -227,6 +228,7 @@ struct DotKeyword {
|
|||||||
{ ".RES", TOK_RES },
|
{ ".RES", TOK_RES },
|
||||||
{ ".RIGHT", TOK_RIGHT },
|
{ ".RIGHT", TOK_RIGHT },
|
||||||
{ ".RODATA", TOK_RODATA },
|
{ ".RODATA", TOK_RODATA },
|
||||||
|
{ ".SCOPE", TOK_SCOPE },
|
||||||
{ ".SEGMENT", TOK_SEGMENT },
|
{ ".SEGMENT", TOK_SEGMENT },
|
||||||
{ ".SETCPU", TOK_SETCPU },
|
{ ".SETCPU", TOK_SETCPU },
|
||||||
{ ".SHL", TOK_SHL },
|
{ ".SHL", TOK_SHL },
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ enum Token {
|
|||||||
TOK_ENDMACRO,
|
TOK_ENDMACRO,
|
||||||
TOK_ENDPROC,
|
TOK_ENDPROC,
|
||||||
TOK_ENDREP,
|
TOK_ENDREP,
|
||||||
|
TOK_ENDSCOPE,
|
||||||
TOK_ENDSTRUCT,
|
TOK_ENDSTRUCT,
|
||||||
TOK_ERROR,
|
TOK_ERROR,
|
||||||
TOK_EXITMACRO,
|
TOK_EXITMACRO,
|
||||||
@@ -207,6 +208,7 @@ enum Token {
|
|||||||
TOK_RES,
|
TOK_RES,
|
||||||
TOK_RIGHT,
|
TOK_RIGHT,
|
||||||
TOK_RODATA,
|
TOK_RODATA,
|
||||||
|
TOK_SCOPE,
|
||||||
TOK_SEGMENT,
|
TOK_SEGMENT,
|
||||||
TOK_SETCPU,
|
TOK_SETCPU,
|
||||||
TOK_SMART,
|
TOK_SMART,
|
||||||
|
|||||||
Reference in New Issue
Block a user