📄 funargscheck.cpp
字号:
// FunArgsCheck.cpp : implementation file
//
#include "stdafx.h"
#include "cminus.h"
#include "FunArgsCheck.h"
/* * CFunArgsCheck
* Construction & destruction
* * *
*** Programer: 陆晓春
* Date: 2004.05.20 */
CFunArgsCheck::CFunArgsCheck()
{
first = last = NULL;
}
CFunArgsCheck::~CFunArgsCheck()
{
if( first ) delete first;
}
/* * CFunArgsCheck
* help routines
* * *
*** Programer: 陆晓春
* Date: 2004.05.20 */
void CFunArgsCheck::deleteList()
{
if( first ) { delete first; first = last = NULL; }
}
/* * CFunArgsCheck
* public functions
* * *
*** Programer: 陆晓春
* Date: 2004.05.20 */
// insert a kFunDec node into the list, plus its parameters
void CFunArgsCheck::fa_insert( CTreeNode* pNode )
{
ASSERT( pNode->nodekind == kFunDec );
FunDecListRec* temp = new FunDecListRec( pNode->szName, pNode->type );
CTreeNode* p = pNode->child[0];
if( p ) {
temp->params = new ParamListRec( p->type, p->bArray );
temp->count++;
ParamListRec* l = temp->params;
while( p->sibling ) {
p = p->sibling;
l->next = new ParamListRec( p->type, p->bArray );
l = l->next;
temp->count++;
}
}
if( first == NULL ) first = last = temp;
else { last->next = temp; last = last->next; }
}
// check if a function call's arguments match its declaration parameters
// -1: not found
// -2: type not match
// -3: match
// else count not match, return the declaration parameter count
int CFunArgsCheck::fa_check( CTreeNode* pNode )
{
ASSERT( pNode->nodekind == kStmt && pNode->kind.stmt == kCall );
FunDecListRec* l = first;
while( l && l->name != pNode->szName ) l = l->next;
if( l == NULL ) return -1;
ParamListRec* p = l->params;
CTreeNode* t = pNode->child[0];
while( p && t )
if( (p->type == t->type && p->bArray == t->bArray) ||
(t->nodekind == kExp && t->kind.exp == kConst &&
(t->type == _NUM || t->type == _CHARACTER))) {
p = p->next; t = t->sibling;
} else /* type not match */ return -2;
if( p || t ) // count not match
return l->count;
return -3;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -