📄 myyacc.y
字号:
%{
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#define MSDOS
int linesCount;
int nextStat=0;
extern int yylex();
extern int yyerror();
extern char yytext[];
extern char lexeme[30];
extern char lexlogic[30];
extern char lexkey[30];
struct lexvalStack
{
union lex{ /*文法符号的属性值*/
char chr;
char *str;
int integer;
float real;
double dbl;
}lexValue;
char name[30];
char type;
};
struct lexvalStack tempVal,prevTempVal;
int tempVarCount=0;
void gen(char *opr,char *arg1,char *arg2);
void genjump(char *opr,int a,int b,char *arg);
void genrelation(char *opr,char *arg1,char *arg2,int next);
struct CSiYuan
{
char m_op[30];
char m_arg1[30];
char m_arg2[30];
char m_arg3[30];
};
struct CSiYuan JiLu[100];
int nCurrentPosition=0;
int rem_bool[30];
int rem_exit[30];
int nCurrentXunhuan=-1;
%}
%union{ /*单词值*/
char chr;
char *str;
int integer;
float real;
double dbl;
char name[30];
struct lexvalStack lexeme;
}
%token INUMBER FNUMBER ID AND OR NOT K_WHILE K_DO K_BEGIN K_END
%type <real> FNUMBER
%type <integer> INUMBER
%type <lexeme> expr
%right '='
%left OR
%left AND
%right NOT
%left '>' '<'
%left '+' '-'
%left '*' '/'
%right UMINUS
%left '[' ']'
%%
sentence: expr ';'
{
//printf("sentence\n");
}
| w4
{
}
| sentence expr ';'
{
}
| sentence w4
{
}
| sentence '\n'
{
}
;
expr: expr '+' expr
{
gen("+",$1.name,$3.name);
strcpy($$.name,tempVal.name);
}
|expr '-' expr
{
gen("-",$1.name,$3.name);
strcpy($$.name,tempVal.name);
}
|expr '*' expr
{
gen("*",$1.name,$3.name);
strcpy($$.name,tempVal.name);
}
| expr '/' expr
{
gen("/",$1.name,$3.name);
strcpy($$.name,tempVal.name);
}
| expr '=' expr
{
gen(":=",$3.name,$1.name);
strcpy($1.name,tempVal.name);
strcpy($$.name,tempVal.name);
}
| expr '>' expr
{
char t[10];
genrelation("j>",$1.name,$3.name,nextStat+3);
strcpy($$.name,tempVal.name);
genjump("ASSIGN",0,0,$$.name);
//printf("%10d\t(jmp,\t0,\t0,\t%d)\n",nextStat++,nextStat+1);
nextStat++;
sprintf(t, "(%d)", nextStat+1);
strcpy(JiLu[nCurrentPosition].m_op, "jmp");
strcpy(JiLu[nCurrentPosition].m_arg1, "0");
strcpy(JiLu[nCurrentPosition].m_arg2, "0");
strcpy(JiLu[nCurrentPosition].m_arg3, t);
nCurrentPosition++;
genjump("ASSIGN",1,0,$$.name);
}
| expr '<' expr
{
char t[10];
genrelation("j<",$1.name,$3.name,nextStat+3);
strcpy($$.name,tempVal.name);
genjump("ASSIGN",0,0,$$.name);
//printf("%10d\t(jmp,\t0,\t0,\t%d)\n",nextStat++,nextStat+1);
nextStat++;
sprintf(t, "(%d)", nextStat+1);
strcpy(JiLu[nCurrentPosition].m_op, "jmp");
strcpy(JiLu[nCurrentPosition].m_arg1, "0");
strcpy(JiLu[nCurrentPosition].m_arg2, "0");
strcpy(JiLu[nCurrentPosition].m_arg3, t);
nCurrentPosition++;
genjump("ASSIGN",1,0,$$.name);
}
| '(' expr ')'
{
strcpy($$.name,$2.name);
}
| '-' expr %prec UMINUS
{
gen("UMINUS",$2.name,(char *)(-1));
strcpy($$.name,tempVal.name);
}
|INUMBER
{
strcpy($$.name,lexeme);
}
|FNUMBER
{
strcpy($$.name,lexeme);
}
|ID
{
strcpy($$.name,lexeme);
}
| expr AND expr
{
gen("And",$1.name,$3.name);
strcpy($$.name,tempVal.name);
}
| expr OR expr
{
gen("Or",$1.name,$3.name);
strcpy($$.name,tempVal.name);
}
| NOT expr
{
gen("Not",$2.name,(char *)(-1));
strcpy($$.name,tempVal.name);
}
| expr '[' expr ']'
{
sprintf(tempVal.name,"temp%d",tempVarCount++);
strcpy(JiLu[nCurrentPosition].m_op, "[]");
strcpy(JiLu[nCurrentPosition].m_arg1, $1.name);
strcpy(JiLu[nCurrentPosition].m_arg2, $3.name);
strcpy(JiLu[nCurrentPosition].m_arg3, tempVal.name);
strcpy($$.name,tempVal.name);
nCurrentPosition++;
nextStat++;
}
;
w1: K_WHILE '('
{
nCurrentXunhuan++;
rem_bool[nCurrentXunhuan]=nCurrentPosition;
}
;
w2: w1 expr ')' K_DO '\n' K_BEGIN '\n'
{
rem_exit[nCurrentXunhuan]=nCurrentPosition;
strcpy(JiLu[nCurrentPosition].m_op, "bool");
strcpy(JiLu[nCurrentPosition].m_arg1, $2.name);
strcpy(JiLu[nCurrentPosition].m_arg2, "0");
strcpy(JiLu[nCurrentPosition].m_arg3, "NULL");
nCurrentPosition++;
nextStat++;
}
;
w3: w2 sentence
{
}
;
w4: w3 K_END
{
char t[10];
sprintf(t, "(%d)", rem_bool[nCurrentXunhuan]);
strcpy(JiLu[nCurrentPosition].m_op, "jmp");
strcpy(JiLu[nCurrentPosition].m_arg1, "0");
strcpy(JiLu[nCurrentPosition].m_arg2, "0");
strcpy(JiLu[nCurrentPosition].m_arg3, t);
nCurrentPosition++;
nextStat++;
sprintf(t, "(%d)", nCurrentPosition);
strcpy(JiLu[rem_exit[nCurrentXunhuan]].m_arg3, t);
nCurrentXunhuan--;
}
;
%%
int yyerror(char *s)
{
fprintf(stderr,"syntactic error:%s in %d\n",s,linesCount);
return 0;
}
void gen(char *opr,char *arg1,char *arg2)
{
sprintf(tempVal.name,"temp%d",tempVarCount++);
if((int)arg2 == -1)
{
//fprintf(stdout,"%10d\t(%s,\t%s,\t0,\t%s)\n",nextStat++,opr,arg1,tempVal.name);
strcpy(JiLu[nCurrentPosition].m_op, opr);
strcpy(JiLu[nCurrentPosition].m_arg1, arg1);
strcpy(JiLu[nCurrentPosition].m_arg2, "0");
strcpy(JiLu[nCurrentPosition].m_arg3, tempVal.name);
nCurrentPosition++;
nextStat++;
}
else
{
//fprintf(stdout,"%10d\t(%s,\t%s,\t%s,\t%s)\n",nextStat++,opr,arg1,arg2,tempVal.name);
strcpy(JiLu[nCurrentPosition].m_op, opr);
strcpy(JiLu[nCurrentPosition].m_arg1, arg1);
strcpy(JiLu[nCurrentPosition].m_arg2, arg2);
strcpy(JiLu[nCurrentPosition].m_arg3, tempVal.name);
nCurrentPosition++;
nextStat++;
}
}
void genjump(char *opr,int a,int b,char *arg)
{
//fprintf(stdout,"%10d\t(%s,\t%d,\t%d,\t%s)\n",nextStat++,opr,a,b,arg);
char t1[10];
char t2[10];
sprintf(t1, "%d", a);
sprintf(t2, "%d", b);
strcpy(JiLu[nCurrentPosition].m_op, opr);
strcpy(JiLu[nCurrentPosition].m_arg1, t1);
strcpy(JiLu[nCurrentPosition].m_arg2, t2);
strcpy(JiLu[nCurrentPosition].m_arg3, arg);
nCurrentPosition++;
nextStat++;
}
void genrelation(char *opr,char *arg1,char *arg2,int next)
{
char t[10];
sprintf(tempVal.name,"temp%d",tempVarCount++);
//fprintf(stdout,"%10d\t(%s,\t%s,\t%s,\t%d)\n",nextStat++,opr,arg1,arg2,next);
sprintf(t, "(%d)", next);
strcpy(JiLu[nCurrentPosition].m_op, opr);
strcpy(JiLu[nCurrentPosition].m_arg1, arg1);
strcpy(JiLu[nCurrentPosition].m_arg2, arg2);
strcpy(JiLu[nCurrentPosition].m_arg3, t);
nCurrentPosition++;
nextStat++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -