📄 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;
struct CShengming
{
char m_name[30];
char m_token[30]; //Array or Value
char m_type[30]; //int, float, char
int m_weishu;
int m_xiangqing;
};
struct CShengming JiLu[100];
struct CArrayInfo
{
char m_name[30];
int m_lenth;
};
struct CArrayInfo Array[100];
char CurrentType[30];
char CurrentValName[30];
int nCurrentWeishu;
int nTotalJiLu=0;
int nTotalArray=0;
%}
%union{ /*单词值*/
char chr;
char *str;
int integer;
float real;
double dbl;
char name[30];
struct lexvalStack lexeme;
}
%token INUMBER FNUMBER ID K_INT K_FLOAT K_BEGIN K_CHAR
%type <real> FNUMBER
%type <integer> INUMBER
%type <lexeme> expr
%left '[' ']'
%%
sentence: expr ';'
{
//printf("sentence\n");
}
| sentence expr ';'
{
}
| sentence '\n'
{
}
;
expr: K_INT ID
{
strcpy(CurrentType, "int");
strcpy(CurrentValName, lexeme);
nCurrentWeishu=0;
strcpy(JiLu[nTotalJiLu].m_name, CurrentValName);
strcpy(JiLu[nTotalJiLu].m_token, "Value");
strcpy(JiLu[nTotalJiLu].m_type, CurrentType);
JiLu[nTotalJiLu].m_weishu=0;
JiLu[nTotalJiLu].m_xiangqing=-1;
nTotalJiLu++;
}
| K_FLOAT ID
{
strcpy(CurrentType, "float");
strcpy(CurrentValName, lexeme);
nCurrentWeishu=0;
strcpy(JiLu[nTotalJiLu].m_name, CurrentValName);
strcpy(JiLu[nTotalJiLu].m_token, "Value");
strcpy(JiLu[nTotalJiLu].m_type, CurrentType);
JiLu[nTotalJiLu].m_weishu=0;
JiLu[nTotalJiLu].m_xiangqing=-1;
nTotalJiLu++;
}
| K_CHAR ID
{
strcpy(CurrentType, "char");
strcpy(CurrentValName, lexeme);
nCurrentWeishu=0;
strcpy(JiLu[nTotalJiLu].m_name, CurrentValName);
strcpy(JiLu[nTotalJiLu].m_token, "Value");
strcpy(JiLu[nTotalJiLu].m_type, CurrentType);
JiLu[nTotalJiLu].m_weishu=0;
JiLu[nTotalJiLu].m_xiangqing=-1;
nTotalJiLu++;
}
| expr '[' INUMBER ']'
{
strcpy(JiLu[nTotalJiLu-1].m_token, "Array");
JiLu[nTotalJiLu-1].m_weishu++;
if(JiLu[nTotalJiLu-1].m_xiangqing==-1){
JiLu[nTotalJiLu-1].m_xiangqing=nTotalArray;
}
nCurrentWeishu++;
strcpy(Array[nTotalArray].m_name, CurrentValName);
Array[nTotalArray].m_lenth=atoi(lexeme);
nTotalArray++;
}
| expr ',' ID
{
strcpy(CurrentValName, lexeme);
nCurrentWeishu=0;
strcpy(JiLu[nTotalJiLu].m_name, CurrentValName);
strcpy(JiLu[nTotalJiLu].m_token, "Value");
strcpy(JiLu[nTotalJiLu].m_type, CurrentType);
JiLu[nTotalJiLu].m_weishu=0;
JiLu[nTotalJiLu].m_xiangqing=-1;
nTotalJiLu++;
}
;
%%
int yyerror(char *s)
{
fprintf(stderr,"syntactic error:%s in %d\n",s,linesCount);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -