📄 varproc.cpp
字号:
if (tok == ID) {//当前ID是变量
varname = token;
line_no = lineno;
if (varname == NULL) {
printf("[%s][%d]:error id\n", __FILE__, __LINE__);
exit(1);
}
//把变量插入到变量表中
{
VAR_USE_REC temp = {0};
temp.line = line_no;
temp.name = varname;
temp.use_type = REF_STATE;//USE_STATE;
VarInsert(temp);
}
varname = NULL;
return Expr_check_state3();
} else if (isnum(tok)) {
return Expr_check_state3();
}else if (tok == ')') {
return Expr_check_finish();
} else {//
return -1;
}
}
static int Expr_check_state3()
{
int tok = -1;
tok = gettok();
if(tok == EOI) {
return -5;
}
if (tok == ',') {
return Expr_check_state4();
} else if (tok == ')') {
return Expr_check_finish();
} else {
return -1;
}
}
static int Expr_check_state4()
{
int tok = -1;
tok = gettok();
if(tok == EOI) {
return -5;
}
if (tok == ID) {
varname = token;
line_no = lineno;
//加入变量表
{
VAR_USE_REC temp = {0};
temp.line = line_no;
temp.name = varname;
temp.use_type = REF_STATE;//USE_STATE;
VarInsert(temp);
}
varname = NULL;
line_no = 0;
return Expr_check_state3();
} else if (isnum(tok)) {
return Expr_check_state3();
} else {
return -1;
}
}
static int Expr_check_finish()
{
int tok = -1;
tok = gettok();
if( tok == EOI ) {
return -5;//END_OF_FILE
}
if (isoperator(tok)){//当前ID是变量名称,调用状态2处理
//把这个变量加入到变量表中
varname = token;
line_no = lineno;
{
VAR_USE_REC temp = {0};
temp.line = line_no;
temp.name = varname;
temp.use_type = REF_STATE;//USE_STATE;
VarInsert(temp);
}
varname = NULL;
line_no = 0;
return Expr_check_state1();
} else if (tok == '('){ //当前ID是函数名称,调用状态3处理
varname = NULL;
return Expr_check_state2();
} else {
if (varname) {
//把这个变量加入到变量表中
{
VAR_USE_REC temp = {0};
temp.line = line_no;
temp.name = varname;
temp.use_type = REF_STATE;//USE_STATE;
VarInsert(temp);
}
varname = NULL;
line_no = 0;
}
return tok;
}
}
/*
变量定义,函数声明,函数定义
[START]
|
| TYPE(int float double char ...)
\/
[S1]
|
| ID
\/ =
[S3]<--------------[S2]------------->[S9]<--------\
| | | |
|TYPE | , | |
\/ | | ID/NUM |
[S12] | | |
| \/ , \/ |
|ID [S7]<------------[S10]<--\ |
{ \/ | | | | =
[FUN1}<-------[S6]<-------[S4]<-----\ | | | |
| | | | |ID |OP |ID |
| | | , |ID | | |NUM |
| | | | | \/ | |
| | | [S13] | [S11]---/ |
| | | /\ | |
| | | | [S8]---------------------------/
| | \/ |TYPE | ;
| | [S5]-----/ |
| | : \/
| \------->[FUN2]------------->[FINISH]
| /\
| |
\--------------------------------------------/
变量定义中没有数组,没有指针,没有自定义数据类型(只包含基本数据类型:int char long short )
*/
int Define_proc()
{
return Define_check_state1();
}
static int Define_check_state1()
{
int tok = -1;
tok = gettok();
if (tok == EOI) {
return -5; // end of file
}
if(tok == ID) {
//需要根据后一个符号决定是否保存到变量表中
varname = token;
line_no = lineno;
return Define_check_state2();
} else {
return -1;
}
}
static int Define_check_state2()
{
int tok = gettok();
if (tok == EOI) {
return -5; // end of file
}
switch(tok) {
case '(':
//函数定义,建立新的作用域
{
VAR_LVL_RECORD *temp = NULL;
temp = (VAR_LVL_RECORD*)malloc(sizeof (VAR_LVL_RECORD));
if(temp == NULL) {
printf("mem alloc fail!\n");
exit(0);
}
memset(temp, 0, sizeof (VAR_LVL_RECORD));
temp->parent = CurVarRec;
CurVarRec->child = temp;
CurVarRec = temp;
}
varname = NULL;
line_no = 0;
return Define_check_state3();
break;
case '=':
//变量定义,执行插入操作
{
VAR_USE_REC temp = {0};
temp.line = line_no;
temp.name = varname;
temp.use_type = DEFINE_STATE;
VarInsert(temp);
}
varname = NULL;
line_no = 0;
return Define_check_state9();
break;
case ',':
//变量定义,执行插入操作
{
VAR_USE_REC temp = {0};
temp.line = line_no;
temp.name = varname;
temp.use_type = DEFINE_STATE;
VarInsert(temp);
}
varname = NULL;
line_no = 0;
return Define_check_state7();
break;
case ';':
//变量定义,执行插入操作
{
VAR_USE_REC temp = {0};
temp.line = line_no;
temp.name = varname;
temp.use_type = DEFINE_STATE;
VarInsert(temp);
}
varname = NULL;
line_no = 0;
return Define_check_finish();
break;
default:
return -1;
}
}
static int Define_check_state3()
{
int tok = gettok();
if (tok == EOI) {
return -5; // end of file
} else if (istype(tok)) {
tok = TYPE;
}
switch(tok)
{
case ')':
return Define_check_state6();
break;
case TYPE:
tok = gettok();
if(tok == ID){
//此ID为函数定义中的函数参数,执行插入操作
varname = token;
line_no = lineno;
{
VAR_USE_REC temp = {0};
temp.line = line_no;
temp.name = varname;
temp.use_type = DEFINE_STATE;
VarInsert(temp);
}
varname = NULL;
line_no = 0;
return Define_check_state4();
}
else
return -1;
break;
default:
return -1;
break;
}
}
static int Define_check_state4()
{
int tok = gettok();
if (tok == EOI) {
return -5; // end of file
}
switch(tok)
{
case ')':
return Define_check_state6();
break;
case ',':
return Define_check_state5();
break;
default:
return -1;
}
}
static int Define_check_state5()
{
int tok = gettok();
if (tok == EOI) {
return -5; // end of file
}
if(istype(tok)) {
tok = gettok();
if(tok == ID) {
//此ID为函数定义中的函数参数,执行插入操作
varname = token;
line_no = lineno;
{
VAR_USE_REC temp = {0};
temp.line = line_no;
temp.name = varname;
temp.use_type = DEFINE_STATE;
VarInsert(temp);
}
varname = NULL;
line_no = 0;
return Define_check_state4();
}
else
return -1;
} else {
return -1;
}
}
static int Define_check_state6()
{
int tok = gettok();
if (tok == EOI) {
return -5; // end of file
}
switch(tok) {
case '{':
return Define_check_Fun1();
break;
case ';':
return Define_check_Fun2();
break;
default:
return -1;
}
}
static int Define_check_state7()
{
int tok = gettok();
if (tok == EOI) {
return -5; // end of file
}
switch(tok) {
case ID:
//变量定义,变量名存储在tok中,执行插入操作
varname = token;
line_no = lineno;
{
VAR_USE_REC temp = {0};
temp.line = line_no;
temp.name = varname;
temp.use_type = DEFINE_STATE;
VarInsert(temp);
}
varname = NULL;
line_no = 0;
return Define_check_state8();
break;
default:
return -1;
}
}
static int Define_check_state8()
{
int tok = gettok();
if (tok == EOI) {
return -5; // end of file
}
switch(tok) {
case ',':
return Define_check_state7();
break;
case '=':
return Define_check_state9();
break;
case ';':
return Define_check_finish();
break;
default:
return -1;
}
}
static int Define_check_state9()
{
int tok = gettok();
if (tok == EOI) {
return -5; // end of file
}
if (tok == ID) {
varname = token;
line_no = lineno;
{
VAR_USE_REC temp = {0};
temp.line = line_no;
temp.name = varname;
temp.use_type = REF_STATE;//USE_STATE;
VarInsert(temp);
}
varname = NULL;
line_no = 0;
return Define_check_state10();
} else if (isnum(tok)) {
return Define_check_state10();
} else {
return -1;
}
}
static int Define_check_state10()
{
int tok = gettok();
if (tok == EOI) {
return -5; // end of file
}
if (tok == ',') {
return Define_check_state7();
} else if (isoperator(tok)) {
return Define_check_state11();
} else {
return -1;
}
}
static int Define_check_state11()
{
int tok = gettok();
if (tok == EOI) {
return -5; // end of file
}
if (tok == ID) {
varname = token;
line_no = lineno;
{
VAR_USE_REC temp = {0};
temp.line = line_no;
temp.name = varname;
temp.use_type = REF_STATE;//USE_STATE;
VarInsert(temp);
}
varname = NULL;
line_no = 0;
return Define_check_state10();
} else if (isnum(tok)) {
return Define_check_state10();
} else {
return -1;
}
}
static int Define_check_Fun1()
{
//进入函数体,此前函数参数应当已经插入变量表,作用域为整个函数体
return 0;
}
static int Define_check_Fun2()
{
//函数定义以';'结束,未进入函数体,
//此前函数参数应当已经插入变量表,且此时应当从变量表中删除函数参数,
//返回上一层作用域
//释放变量使用记录表的资源
//varlistfree(CurVarRec->varlist);
//释放当前层的记录块
CurVarRec = CurVarRec->parent;
free(CurVarRec->child);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -