Abstracted walk-comment

This commit is contained in:
Devine Lu Linvega 2024-03-26 13:35:37 -07:00
parent bcdd08bc4e
commit a197c24b2a
2 changed files with 24 additions and 15 deletions

View File

@ -1,5 +1,7 @@
( init ) ( init )
%emit { #18 DEO }
|0100 @program |0100 @program
#1234 SWP #1234 SWP
@ -11,8 +13,8 @@
;hello-word ;hello-word
&while &while
( send ) LDAk #18 DEO ( send ) LDAk emit
( loop ) INC2 LDAk ,&while JCN ( loop ) INC2 LDAk ?&while
POP2 POP2
#010f DEO #010f DEO

View File

@ -312,25 +312,32 @@ doinclude(char *filename)
return res; return res;
} }
static int
walkcomment(char *w, FILE *f)
{
int i = 1;
char word[0x40];
if(slen(w) != 1)
fprintf(stderr, "-- Malformed comment: %s\n", w);
while(fscanf(f, "%63s", word) == 1) {
if(slen(word) != 1)
continue;
else if(word[0] == '(')
i++;
else if(word[0] == ')' && --i < 1)
break;
}
return 1;
}
static int static int
parse(char *w, FILE *f) parse(char *w, FILE *f)
{ {
int i; int i;
char word[0x40], c; char c;
Macro *m; Macro *m;
switch(w[0]) { switch(w[0]) {
case '(': /* comment */ case '(': return walkcomment(w, f);
if(slen(w) != 1) fprintf(stderr, "-- Malformed comment: %s\n", w);
i = 1; /* track nested comment depth */
while(fscanf(f, "%63s", word) == 1) {
if(slen(word) != 1)
continue;
else if(word[0] == '(')
i++;
else if(word[0] == ')' && --i < 1)
break;
}
break;
case '~': return !doinclude(w + 1) ? error_asm("Invalid include") : 1; case '~': return !doinclude(w + 1) ? error_asm("Invalid include") : 1;
case '%': return !makemacro(w + 1, f) ? error_asm("Invalid macro") : 1; case '%': return !makemacro(w + 1, f) ? error_asm("Invalid macro") : 1;
case '@': return !makelabel(w + 1, 1) ? error_asm("Invalid label") : 1; case '@': return !makelabel(w + 1, 1) ? error_asm("Invalid label") : 1;