这个是书上的例子,
%{
#include <stdio.h>
#include <stdlib.h>
#define STRSIZE
64
#include
"
y.tab.h
"
#include
"
intall.h
"
extern void lexerror()
;
int strcnt
=
0
;
char string
[
STRSIZE + 1
]
=
{
0
}
;
%}
%start STR1 COMM
%%
<INITIAL>
"
+
"
{return(ADDOP)
;
}
<INITIAL>
"
-
"
{return(SUBOP)
;
}
<INITIAL>
"
*
"
{return(MULOP)
;
}
<INITIAL>
"
/
"
{return(DIVOP)
;
}
<INITIAL>
"
=
"
{return(ASGNOP)
;
}
<INITIAL>
"
==
"
{return(EQOP)
;
}
<INITIAL>
"
>
"
{return(GTOP)
;
}
<INITIAL>
"
>=
"
{return(GEOP)
;
}
<INITIAL>
"
<
"
{return(LSOP)
;
}
<INITIAL>
"
<=
"
{return(LEOP)
;
}
<INITIAL>
"
!=
"
{return(NTOP)
;
}
<INITIAL>
"
{
"
{return(LC)
;
}
<INITIAL>
"
}
"
{return(RC)
;
}
<INITIAL>
"
(
"
{return(LP)
;
}
<INITIAL>
"
)
"
{return(RP)
;
}
<INITIAL>
"
;
"
{return(SM)
;
}
<INITIAL>
"
,
"
{return(CM)
;
}
<INITIAL>
"
{
strcnt = 0;
BEGIN STR1;
}
<INITIAL>
"
/*
"
BEGIN COMM;
<INITIAL>if {return(IF);}
<INITIAL>else {return(ELSE);}
<INITIAL>while {return(WHILE);}
<INITIAL>put {return(PUT);}
<INITIAL>get {return(GET);}
<INITIAL>[a-z] {
yylval.idno = yytext[0] -'a';
return(IDENT);
}
<INITIAL>[0-9]+ {
yylval.num = atoi((char*)yytext);
return(NUMBER);
}
<INITIAL>[ ] ;
<INITIAL>[a-z0-9]+ {lexerror(
"
word invalid
"
);}
<INITIAL>. {lexerror(
"
character invalid
"
);}
<STR1>
"
{
if (strcnt>
=
STRSIZE)lexerror(
"
string too long
"
)
;
string
[
strcnt
]
=
'
0
'
;
yylval.addr
=
pool(string)
;
BEGIN INITIAL
;
return(STRING)
;
}
<STR1>/
"
{
if (strcnt < STRSIZE)
string[strcnt++] = '
"
'
;
}
<STR1>/n {
if (strcnt < STRSIZE)
string
[
strcnt++
]
=
' '
;
}
<STR1> {
lexerror(
"
string not closed
"
)
;
string
[
strcnt
]
=
'
0
'
;
yylval.addr
=
pool(string)
;
BEGIN INITIAL
;
return(STRING)
;
}
<STR1>. {
if (strcnt <STRSIZE)string
[
strcnt++
]
=
yytext
[
0
]
;
}
<COMM>
"
*/
"
{
BEGIN INITIAL
;
}
<COMM>
;
<COMM>.
;
%%
void lexerror(char *s)
{
extern int yynerrs
,
yylineno
;
++yynerrs
;
fprintf(stderr
,
"
%d:%s
"
,
yylineno
,
s)
;
}
这个文件应该多留心 字符串和注释的写法
%
...
{
#include <stdio.h>
#include "intall.h"
#define ID 100
#define NUM 101
#define STR 102
#define NODESIZE 100
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
int nodecnt = 0;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
struct node...{
int ntype;
int nvalue;
struct node *left;
struct node *right;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
}nodearea[NODESIZE] = ...{0};
%}
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
%
union
...
{
int idno;
int num;
int addr;
int label;
struct node *nodep;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
%
token
<
idno
>
IDENT
%
token
<
num
>
NUMBER
%
token
<
addr
>
STRING
%
token IF ELSE WHILE GET PUT
%
token LP RP
%
token LC RC
%
token CM SM
%
token ASGNOP
%
token EQOP GTOP GEOP LSOP LEOP NTOP
%
left ADDOP SUBOP
%
left MULOP DIVOP
%
right MINUS
%
type
<
label
>
if
.prefix
while
.prefix
%
type
<
nodep
>
expr cond
%%
s :stmt.list
;
stmt.list
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
:
/**/
/*empty*/
|
stmt.list stmt
;
stmt :IDENT ASGNOP expr SM
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
genexpr($3);
clearnode();
gencode(OP_POP, $1);
}
|
if
.prefix stmt
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{gencode(OP_LBL,$1);}
|
if
.prefix stmt ELSE
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
gencode(OP_JMP, $<label>$ = newlbl());
gencode(OP_LBL,$1);
}
stmt
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{gencode(OP_LBL, $<label>$);}
|
while
.prefix
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
gencode(OP_JPF, $<label>4 = newlbl());
}
stmt
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
gencode(OP_JMP, $1);
gencode(OP_LBL, $<label>2);
}
|
PUT LP put.list RP SM
|
GET LP IDENT RP SM
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{gencode(OP_GET,$3);}
|
LC stmt.list RC
|
SM
|
error SM
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{//可以使用一?机制来?制解析器相信??已?被完全修?了
yyerrok;
clearnode();
}
|
error RC
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
yyerrok;
clearnode();
}
;
if
.prefix
:IF LP cond RP
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
genexpr($3);
clearnode();
gencode(OP_JPF,$$ = newlbl());
}
;
while
.prefix
:WHILE LP cond RP
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
gencode(OP_LBL,$$ = newlbl());
genexpr($3);
clearnode();
}
;
put.list
:id.num.or.str
|
put.list CM id.num.or.str
;
id.num.or.str
:IDENT
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{gencode(OP_PUTI, $1);}
|
NUMBER
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{gencode(OP_PUTN, $1);}
|
STRING
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{gencode(OP_PUTS, $1);}
;
cond :expr EQOP expr
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{$$ = makeexpr(EQ, $1, $3);}
|
expr GTOP expr
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{$$ = makeexpr(GT, $1, $3);}
|
expr GEOP expr
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{$$ = makeexpr(GE, $1, $3);}
|
expr LSOP expr
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{$$ = makeexpr(LS, $1, $3);}
|
expr LEOP expr
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{$$ = makeexpr(LE, $1, $3);}
|
expr NTOP expr
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{$$ = makeexpr(NT, $1, $3);}
;
expr :expr ADDOP expr
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{$$ = makeexpr(ADD, $1, $3);}
|
expr SUBOP expr
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{$$ = makeexpr(SUB, $1, $3);}
|
expr MULOP expr
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{$$ = makeexpr(MUL, $1, $3);}
|
expr DIVOP expr
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{$$ = makeexpr(DIV, $1, $3);}
|
SUBOP expr
%
prec MINUS
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{$$ = makeexpr(MIN, $2, 0);}
|
LP expr RP
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{$$ = $2;}
|
IDENT
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{$$ = makenode(ID, $1);}
|
NUMBER
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{$$ = makenode(NUM, $1);}
;
%%
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
int
yyerror(
char
*
str)
...
{
printf("%s ", str);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
clearnode()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
nodecnt = 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
struct
node
*
getnode()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (nodecnt > NODESIZE)...{
fatal("nodearea overflow");
}
return (&nodearea[nodecnt++]);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
struct
node
*
makenode(
int
type ,
int
value)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
struct node *p;
p = getnode();
p->ntype = type;
p->nvalue = value;
p->left = NULL;
p->right = NULL;
return(p);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
struct
node
*
makeexpr(
int
type,
struct
node
*
left,
struct
node
*
right)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
struct node *p;
p = makenode(type ,0);
p->left = left;
p->right = right;
return(p);
}
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/*式のとリーから中間コードを生成する*/
void
genexpr(
struct
node
*
p)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(p == NULL)...{
return;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(p->left)...{
genexpr(p->left);
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(p->right)...{
genexpr(p->right);
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
switch (p->ntype)...{
case ID:
gencode(OP_PSHI, p->nvalue);
break;
case NUM:
gencode(OP_PSHN, p->nvalue);
break;
default:
gencode(OP_CAL, p->ntype);
break;
}
}
接下来是intmain.c
#include
<
stdio.h
>
#include
<
string
.h
>
#include
<
stdlib.h
>
#include
"
intall.h
"
extern
int
yynerrs;
extern
FILE
*
yyin;
int
dmpFlag
=
0
;
#ifdef YYDEBUG
extern
int
yydebug;
#endif
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
main(
int
ac,
char
*
av[])
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(ac < 2)...{
fatal("option error");
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(!(yyin = fopen(av[1],"r")))...{
fatal("open error");
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(ac >= 3 && !strcmp(av[2],"-d"))...{
dmpFlag = 1;
#ifdef YYDEBUG
yydebug = 1;
#endif
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(yyparse() || yynerrs)...{
fatal("not executed");
}
defref();
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (dmpFlag)...{
dumpcode();
}
execute();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
fatal(
char
*
s)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
fprintf(stderr, "%s!!!. ", s);
exit(0);
}
intgen.c
#include
<
stdio.h
>
#include
<
string
.h
>
#include
"
intall.h
"
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
#define
CODESIZE 1000
#define
POOLSIZE 200
#define
LBLSIZE 100
int
codecnt
=
0
;
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
struct
code_t codearea[CODESIZE]
=
...
{0}
;
int
poolcnt
=
0
;
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
char
poolarea[POOLSIZE]
=
...
{0}
;
int
labelno
=
0
;
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
int
lbltable[LBLSIZE]
=
...
{0}
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/*中間コードを中間コード領域に出力する*/
void
gencode(
int
op,
int
sub)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (codecnt >=CODESIZE)...{
fatal("codearea overflow");
}
codearea[codecnt].opcode = op;
codearea[codecnt++].subcode = sub;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/*文字列プール領域に文字列をプールする*/
int
pool(
char
*
p)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int i,j;
j = poolcnt;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if ((i = poolcnt + strlen(p) + 1) > POOLSIZE)...{
fatal("poolarea overflow");
}
strcpy(&poolarea[poolcnt],p);
poolcnt = i;
return (j);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
newlbl()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(labelno >= LBLSIZE)...{
fatal("label overflow");
}
return (labelno++);
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
defref()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int i;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for (i = 0; i < codecnt; ++i)...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (codearea[i].opcode == OP_LBL)...{
lbltable[codearea[i].subcode] = i;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for (i = 0;i < codecnt; ++i)...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if(codearea[i].opcode == OP_JMP || codearea[i].opcode == OP_JPF)...{
codearea[i].subcode = lbltable[codearea[i].subcode];
}
}
}
intexec.c,这个才是真正的ACTION...
#include
<
stdio.h
>
#include
"
intall.h
"
#define
STKSIZE 100
extern
int
codecnt;
extern
char
poolarea[];
extern
struct
code_t codearea[];
int
sp
=
-
1
;
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
int
stack[STKSIZE]
=
...
{0}
;
int
pc
=
0
;
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
int
valarea[
'
z
'
-
'
a
'
+
1
]
=
...
{0}
;
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/*
中間コードを実行する
*/
void
execute()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int sub;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
while (pc < codecnt)...{
sub = codearea[pc].subcode;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
switch (codearea[pc].opcode)...{
case OP_POP:
valarea[sub] = stack[sp--];
break;
case OP_PSHI:
if (++sp >= STKSIZE)fatal("stack overflow!!");
stack[sp] = valarea[sub];
break;
case OP_PSHN:
if (++sp >= STKSIZE)fatal("stack overflow!!");
stack[sp] = sub;
break;
case OP_JMP:
pc = sub;
break;
case OP_JPF:
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if (stack[sp--] == 0)...{
pc = sub;
}
break;
case OP_GET:
scanf("%d", &valarea[sub]);
break;
case OP_PUTI:
printf("%d", valarea[sub]);
break;
case OP_PUTN:
printf("%d",sub);
break;
case OP_PUTS:
printf("%s", &poolarea[sub]);
break;
case OP_CAL:
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
switch (sub)...{
case ADD:
--sp;
stack[sp] = stack[sp] + stack[sp + 1];
break;
case SUB:
--sp;
stack[sp] = stack[sp] - stack[sp + 1];
break;
case MUL:
--sp;
stack[sp] = stack[sp] * stack[sp + 1];
break;
case DIV:
--sp;
stack[sp] = stack[sp] / stack[sp + 1];
break;
case MIN:
--sp;
stack[sp] = -stack[sp];
break;
case EQ:
--sp;
stack[sp] = stack[sp] == stack[sp + 1];
break;
case GT:
--sp;
stack[sp] = stack[sp] > stack[sp + 1];
break;
case GE:
--sp;
stack[sp] = stack[sp] >= stack[sp + 1];
break;
case LS:
--sp;
stack[sp] = stack[sp] < stack[sp + 1];
break;
case LE:
--sp;
stack[sp] = stack[sp] <= stack[sp + 1];
break;
case NT:
--sp;
stack[sp] = stack[sp] != stack[sp + 1];
break;
}
}
++pc;
}
}
intall.h
#ifndef INTALL_H__
#define
INTALL_H__
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
#define
OP_POP 1 /*give valarea to value */
#define
OP_PSHI 2 /*変数の値をスタックにプッシュする*/
#define
OP_PSHN 3 /*定数の値をスタックにプッシュする*/
#define
OP_CAL 4 /*演算子*/
#define
OP_LBL 5 /*ラベル*/
#define
OP_JMP 6 /*ラベル*/
#define
OP_JPF 7 /*ラベル*/
#define
OP_GET 8 /*scanf*/
#define
OP_PUTI 9 /*変量名IDENT,valareaの値を出力*/
#define
OP_PUTN 10 /*NUM数字定数の値*/
#define
OP_PUTS 11 /*文字列出力*/
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
/**/
/*演算子*/
#define
ADD 1
#define
SUB 2
#define
MUL 3
#define
DIV 4
#define
MIN 5
#define
EQ 6
#define
GT 7
#define
GE 8
#define
LS 9
#define
LE 10
#define
NT 11
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
struct
code_t
...
{
int opcode;
int subcode;
}
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
void
fatal(
char
*
);
#endif
没有什么好说的,我是拿书上的例子在学习,这里应该注意的是中间CODE这个概念,,,先保存在出力,这在和我之前用
面向对象是一样的效果,但是代码的理解就.....