📄 myyacc.y
字号:
%{
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#define MSDOS
int linesCount;
int nextStat=0;
int i;
extern int yylex();
extern int yyerror();
extern char yytext[];
extern char lexeme[30];
extern char lexlogic[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);
void treegen(char *opr,char *arg1,char *arg2);
%}
%union{ /*单词值*/
char chr;
char *str;
int integer;
float real;
double dbl;
char name[30];
struct lexvalStack lexeme;
}
%token INUMBER FNUMBER ID AND OR NOT
%type <real> FNUMBER
%type <integer> INUMBER
%type <lexeme> expr
%left '='
%left OR
%left AND
%right NOT
%left '>' '<'
%left '+' '-'
%left '*' '/'
%right UMINUS
%%
lines: lines expr'\n'
{
tempVarCount=0;
linesCount++;
printf("line %d\n",linesCount);
}
|lines'\n'
{
linesCount++;
/*printf("line %d\n",linesCount); */
}
|
;
expr: expr '+' expr
{
treegen("+",$1.name,$3.name);
strcpy($$.name,tempVal.name);
}
|expr '-' expr
{
treegen("-",$1.name,$3.name);
strcpy($$.name,tempVal.name);
}
|expr '*' expr
{
treegen("*",$1.name,$3.name);
strcpy($$.name,tempVal.name);
}
| expr '/' expr
{
treegen("/",$1.name,$3.name);
strcpy($$.name,tempVal.name);
}
| expr '=' expr
{
treegen("=",$3.name,$1.name);
strcpy($1.name,tempVal.name);
strcpy($$.name,tempVal.name);
}
/*| expr '>' expr
{
genrelation("j>",$1.name,$3.name,nextStat+3);
strcpy($$.name,tempVal.name);
genjump("ASSIGN",0,0,$$.name);
printf("%d\t(jmp,0,0,%d)\n",nextStat++,nextStat+2);
genjump("ASSIGN",1,0,$$.name);
}
| expr '<' expr
{
genrelation("j<",$1.name,$3.name,nextStat+3);
strcpy($$.name,tempVal.name);
genjump("ASSIGN",0,0,$$.name);
printf("%d\t(jmp,0,0,%d)\n",nextStat++,nextStat+2);
genjump("ASSIGN",1,0,$$.name);
}*/
| '(' expr ')'
{
strcpy($$.name,$2.name);
}
| '-' expr %prec UMINUS
{
treegen("UMINUS",$2.name,(char *)(-1));
strcpy($$.name,tempVal.name);
}
|INUMBER
{
strcpy($$.name,lexeme);
}
|FNUMBER
{
strcpy($$.name,lexeme);
}
|ID
{
strcpy($$.name,lexeme);
}
| expr AND expr
{
treegen("And",$1.name,$3.name);
strcpy($$.name,tempVal.name);
}
| expr OR expr
{
treegen("Or",$1.name,$3.name);
strcpy($$.name,tempVal.name);
}
| NOT expr
{
treegen("Not",$2.name,(char *)(-1));
strcpy($$.name,tempVal.name);
}
;
%%
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,%s,0,%s)\n",nextStat++,opr,arg1,tempVal.name);
else
fprintf(stdout,"%10d\t(%s,%s,%s,%s)\n",nextStat++,opr,arg1,arg2,tempVal.name);
}
void genjump(char *opr,int a,int b,char *arg)
{
fprintf(stdout,"%10d\t(%s,%d,%d,%s)\n",nextStat++,opr,a,b,arg);
}
void genrelation(char *opr,char *arg1,char *arg2,int next)
{
sprintf(tempVal.name,"temp%d",tempVarCount++);
fprintf(stdout,"%10d\t(%s,%s,%s,%d)\n",nextStat++,opr,arg1,arg2,next);
}
void treegen(char *opr,char *arg1,char *arg2)
{
sprintf(tempVal.name,"",tempVarCount++);
if((int)arg2 == -1)
{
fprintf(stdout,"\t%s\n",arg1);
for(i=0;i<=tempVarCount;i++)
fprintf(stdout,"\t");
fprintf(stdout,"%s",opr);
}
else
fprintf(stdout,"\t\t%s%s\n",arg1,arg2);
for(i=0;i<tempVarCount+1;i++)
fprintf(stdout,"\t");
fprintf(stdout,"%s",opr);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -