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:
parent
702e7f7c56
commit
459ef1b197
5
c02.c
5
c02.c
@ -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
|
||||
|
138
c02.ppx
138
c02.ppx
@ -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>
|
||||
|
19
label.c
19
label.c
@ -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 */
|
||||
|
2
label.h
2
label.h
@ -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
56
stmnt.c
@ -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")) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user