1
0
mirror of https://github.com/RevCurtisP/C02.git synced 2025-02-22 10:29:10 +00:00

Implemented SELECT, CASE, and DEFAULT statements

This commit is contained in:
Curtis F Kaylor 2018-02-05 21:51:30 -05:00
parent 702e7f7c56
commit 459ef1b197
7 changed files with 179 additions and 41 deletions

5
c02.c
View File

@ -54,10 +54,7 @@ void pword()
getwrd();
ACMNT(word);
DEBUG("Parsing Word '%s'\n", word);
if (xstmnt[0])
if (wordis(xstmnt))
xstmnt[0] = 0;
else
if (xstmnt[0] && !wordis(xstmnt))
ERROR("Expected '%s' statement\n", xstmnt, EXIT_FAILURE);
if (!pmodfr() && !ptype(MTNONE))
pstmnt(); //Parse Statement

BIN
c02.exe

Binary file not shown.

138
c02.ppx
View File

@ -2,32 +2,7 @@
<settings version="1.0">
<category name="expr.h" />
<category name="cond.h" />
<category name="asm.h" />
<category name="c02.c" />
<category name="stmnt.c">
<category name="Window">
<property name="Left" type="integer">-8</property>
<property name="Top" type="integer">-31</property>
<property name="Right" type="integer">952</property>
<property name="Bottom" type="integer">422</property>
<property name="Maximized" type="integer">1</property>
<property name="Active" type="integer">1</property>
</category>
</category>
<category name="asm.c" />
<category name="vars.c" />
<category name="parse.c">
<category name="Window">
<property name="Left" type="integer">52</property>
<property name="Top" type="integer">52</property>
<property name="Right" type="integer">760</property>
<property name="Bottom" type="integer">362</property>
<property name="Maximized" type="integer">0</property>
<property name="Active" type="integer">0</property>
</category>
</category>
<category name="include.c" />
<category name="expr.c">
<category name="asm.h">
<category name="Window">
<property name="Left" type="integer">78</property>
<property name="Top" type="integer">78</property>
@ -37,7 +12,116 @@
<property name="Active" type="integer">0</property>
</category>
</category>
<category name="c02.c">
<category name="Window">
<property name="Left" type="integer">0</property>
<property name="Top" type="integer">0</property>
<property name="Right" type="integer">952</property>
<property name="Bottom" type="integer">310</property>
<property name="Maximized" type="integer">0</property>
<property name="Active" type="integer">0</property>
</category>
</category>
<category name="stmnt.c">
<category name="Window">
<property name="Left" type="integer">26</property>
<property name="Top" type="integer">26</property>
<property name="Right" type="integer">978</property>
<property name="Bottom" type="integer">336</property>
<property name="Maximized" type="integer">0</property>
<property name="Active" type="integer">0</property>
</category>
</category>
<category name="asm.c">
<category name="Window">
<property name="Left" type="integer">52</property>
<property name="Top" type="integer">52</property>
<property name="Right" type="integer">760</property>
<property name="Bottom" type="integer">362</property>
<property name="Maximized" type="integer">0</property>
<property name="Active" type="integer">0</property>
</category>
</category>
<category name="vars.c">
<category name="Window">
<property name="Left" type="integer">52</property>
<property name="Top" type="integer">52</property>
<property name="Right" type="integer">1004</property>
<property name="Bottom" type="integer">362</property>
<property name="Maximized" type="integer">0</property>
<property name="Active" type="integer">0</property>
</category>
</category>
<category name="parse.c">
<category name="Window">
<property name="Left" type="integer">78</property>
<property name="Top" type="integer">78</property>
<property name="Right" type="integer">1030</property>
<property name="Bottom" type="integer">388</property>
<property name="Maximized" type="integer">0</property>
<property name="Active" type="integer">0</property>
</category>
</category>
<category name="include.c">
<category name="Window">
<property name="Left" type="integer">104</property>
<property name="Top" type="integer">104</property>
<property name="Right" type="integer">1056</property>
<property name="Bottom" type="integer">414</property>
<property name="Maximized" type="integer">0</property>
<property name="Active" type="integer">0</property>
</category>
</category>
<category name="expr.c">
<category name="Window">
<property name="Left" type="integer">130</property>
<property name="Top" type="integer">130</property>
<property name="Right" type="integer">1082</property>
<property name="Bottom" type="integer">440</property>
<property name="Maximized" type="integer">0</property>
<property name="Active" type="integer">0</property>
</category>
</category>
<category name="parse.h" />
<category name="common.h" />
<category name="common.h">
<category name="Window">
<property name="Left" type="integer">-8</property>
<property name="Top" type="integer">-31</property>
<property name="Right" type="integer">952</property>
<property name="Bottom" type="integer">422</property>
<property name="Maximized" type="integer">1</property>
<property name="Active" type="integer">1</property>
</category>
</category>
<category name="files.c" />
<category name="common.c">
<category name="Window">
<property name="Left" type="integer">26</property>
<property name="Top" type="integer">26</property>
<property name="Right" type="integer">978</property>
<property name="Bottom" type="integer">336</property>
<property name="Maximized" type="integer">0</property>
<property name="Active" type="integer">0</property>
</category>
</category>
<category name="label.c">
<category name="Window">
<property name="Left" type="integer">104</property>
<property name="Top" type="integer">104</property>
<property name="Right" type="integer">812</property>
<property name="Bottom" type="integer">414</property>
<property name="Maximized" type="integer">0</property>
<property name="Active" type="integer">0</property>
</category>
</category>
<category name="cond.c">
<category name="Window">
<property name="Left" type="integer">130</property>
<property name="Top" type="integer">130</property>
<property name="Right" type="integer">838</property>
<property name="Bottom" type="integer">440</property>
<property name="Maximized" type="integer">0</property>
<property name="Active" type="integer">0</property>
</category>
</category>
</settings>

BIN
c02.tag

Binary file not shown.

19
label.c
View File

@ -85,8 +85,6 @@ void reqlbl(char* lbname)
}
/* Pop Label from Stack and Emit on Next Line */
int poplbl()
{
@ -102,12 +100,27 @@ int poplbl()
else if (lbtype == LTDWHL)
strcpy(endlbl, lblnam[lblcnt]);
//strcpy(cndlbl, lblnam[lblcnt]);
else if (lbtype == LTCASE)
strcpy(cndlbl, lblnam[lblcnt]);
else
setlbl(lblnam[lblcnt]);
inblck = lblblk[lblcnt-1];
if (lbtype != LTCASE)
inblck = lblblk[lblcnt-1];
return lbtype;
}
/* Get Top Label and Return Type */
int toplbl(char *rtlbl)
{
if (lblcnt) {
strcpy(rtlbl, lblnam[lblcnt-1]);
DEBUG("Found top label %s\n", rtlbl);
return lbltyp[lblcnt-1];
}
rtlbl[0] = 0; //Clear Label
return LTNONE;
}
/* Push Label onto Stack *
* Args: lbltyp - Label type *
* Uses: curlbl - Label to push */

View File

@ -18,7 +18,7 @@ int lblcnt; //Number of Labels in stack
int lblnxt; //Sequence of next label to be generated
char lbltmp[LABLEN+1]; //Label Temporary Storage
enum ltypes {LTNONE, LTIF, LTLOOP, LTEND, LTDO, LTDWHL, LTFUNC}; //Label Types
enum ltypes {LTNONE, LTIF, LTLOOP, LTEND, LTDO, LTDWHL, LTSLCT, LTCASE, LTFUNC}; //Label Types
void prslbl(); //Parse Label From Code
void newlbl(char* lbname); //Generate New Block Label

56
stmnt.c
View File

@ -204,7 +204,7 @@ void pfor() {
/* parse and compile if statement */
void pif() {
DEBUG("Parsing IF statement '%c'\n", nxtchr);
DEBUG("Parsing IF statement\n", 0);
expect('(');
newlbl(cndlbl); //Create New Label
pshlbl(LTIF,cndlbl); //Push Onto Stack
@ -214,7 +214,7 @@ void pif() {
/* parse and compile else statement */
void pelse() {
DEBUG("Parsing ELSE statement '%c'\n", nxtchr);
DEBUG("Parsing ELSE statement\n", 0);
strcpy(lbltmp, lblasm); //Save Line Label
lblasm[0] = 0; //and Clear It
newlbl(skplbl); //Create Skip Label
@ -306,6 +306,47 @@ void pretrn() {
lsrtrn = TRUE; //Set RETURN flag
}
/* parse and compile select statement */
void pslct() {
DEBUG("Parsing SELECT statement\n", 0);
expect('(');
prsxpr(')'); //Parse Expression
newlbl(endlbl); //Create New Label
pshlbl(LTSLCT,endlbl); //Push Onto Stack
bgnblk(TRUE); //Check For and Begin Block
strcpy(xstmnt, "CASE"); //Require Next Statement to be CASE
}
/* process end of case block */
void ecase() {
if (poplbl(cndlbl) != LTCASE)
ERROR("%s not at end of CASE block\n", word, EXIT_FAILURE);
if (toplbl(endlbl) != LTSLCT)
ERROR("Illegal nesting in SELECT statement\n", 0, EXIT_FAILURE);
asmlin("JMP", endlbl); //Emit jump over default case
setlbl(cndlbl); //Set entry point label to emit
}
/* parse and compile select statement */
void pcase() {
if (strcmp(xstmnt, "CASE") == 0)
xstmnt[0] = 0; //Clear xstmnt
else
ecase("CASE"); //Process end of case block
prstrm(); //Parse CASE argument
asmlin("CMP", term); //Emit Comparison
expect(':');
newlbl(cndlbl); //Create Conditional Label
pshlbl(LTCASE, cndlbl); //and Push onto Stack
asmlin("BNE", cndlbl); //Emit skip of CASE body
}
/* parse and compile default statement */
void pdflt() {
expect(':');
ecase(); //Process end of case block
}
/* parse and compile while statement */
void pwhile() {
DEBUG("Parsing WHILE statement '%c'\n", nxtchr);
@ -385,15 +426,18 @@ void pstmnt()
return;
}
if (wordis("SWITCH")) {
punimp();
return;
ERROR("SWITCH not implemented. Use SELECT.\n", word, EXIT_FAILURE);
}
if (wordis("SELECT")) {
pslct();
return;
}
if (wordis("CASE")) {
punimp();
pcase();
return;
}
if (wordis("DEFAULT")) {
punimp();
pdflt();
return;
}
if (wordis("WHILE")) {