📄 myyacc.y.bak
字号:
%{
#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];
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);
struct CSanyuan
{
char m_op[30];
char m_arg1[30];
char m_arg2[30];
};
struct CSanyuan Jilu[100];
int nCurrentPosition=0;
%}
%union{ /*单词值*/
char chr;
char *str;
int integer;
float real;
double dbl;
char name[30];
struct lexvalStack lexeme;
}
%token INUMBER FNUMBER ID
%type <real> FNUMBER
%type <integer> INUMBER
%type <lexeme> expr
%right '='
%left '>' '<'
%left '+' '-'
%left '*' '/'
%right UMINUS
%%
lines: lines expr'\n'
{
linesCount++;
printf("line %d\n",linesCount);
}
|lines'\n'
{
linesCount++;
}
|
;
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 ')'
{
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);
}
;
%%
int yyerror(char *s)
{
fprintf(stderr,"syntactic error:%s in %d\n",s,linesCount);
return 0;
}
void gen(char *opr,char *arg1,char *arg2)
{
int i;
for(i=0; i<nCurrentPosition; ++i)
{
if(!strcmp(opr, Jilu[i].m_op)&&!strcmp(arg1, Jilu[i].m_arg1)&&!strcmp(arg2, Jilu[i].m_arg2))
break;
}
if(i<nCurrentPosition)
sprintf(tempVal.name,"(%d)", i+1);
else
sprintf(tempVal.name,"(%d)", nextStat+1);
if(i==nCurrentPosition)
{
if((int)arg2 == -1)
{
fprintf(stdout,"%10d\t(%s,\t%s,\t0)\t\t%d\t(%d)\n",nextStat+1,opr,arg1, nextStat, nextStat+14);
nextStat++;
}
else
{
fprintf(stdout,"%10d\t(%s,\t%s,\t%s)\t\t%d\t(%d)\n",nextStat+1,opr,arg1,arg2, nextStat, nextStat+14);
nextStat++;
}
strcpy(Jilu[nCurrentPosition].m_op, opr);
strcpy(Jilu[nCurrentPosition].m_arg1, arg1);
strcpy(Jilu[nCurrentPosition].m_arg2, arg2);
nCurrentPosition++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -