Closed kooBH closed 5 years ago
check | stmt | comment |
---|---|---|
O | 선언되지 않은 변수나 함수는 사용 불가 | table 빌드 전에 에러 |
O | 변수나 함수, 함수 파라미터 선언 시 중복된 이름 check | table 빌드 전에, 변수는 local 중복 허용 |
O | 변수나 parameter 선언 시 void type으로 선언할 수 없음. | param 은 syntax 에러 발생함. main() 예외만 구현 |
O | 변수나 parameter 선언 시 array 변수인지 확인해야 함. | 심볼 테이블 수준의 내용 아닌가? |
? | 변수에 값을 assign 하는 경우 type에 대한 check | void 변수 선언이 불가능, 함수만 다루면된다. |
O | 변수가 array인 경우 array index가 int가 아닌 경우 | |
O | array가 아닌 변수를 array처럼 사용하려 하는 경우 | lookup_buck |
O | 함수 호출 시 parameter의 개수와 type이 일치하는지 check | util.c 에서 const는 int로 |
O | 함수 호출 시 호출된 것이 함수가 맞는지 (즉 변수 등이 아니었는지) 확인해야 | |
O | 함수의 return 값과 return type이 일치하는지 check | FuncK에서 retK 찾아 확인 |
O | 함수의 return type이 void일 경우 return이 없어야 함 | FuncK에서 retK 찾아 확인 |
O | main함수는 가장 마지막에 선언되어야 함 | FuncK에서 main일때 sibling NULL확인 |
O | main함수는 반드시 void로 선언되어야 함 | FuncK에서 main일때 type 확인 |
O | main함수는 반드시 parameter가 존재하지 않는다. | FuncK에서 main일때 parma 확인 |
O | loop문의 반복 조건을 표시하는 부분에 오는 statement는 int값을 가질 수 있어야 한다. |
int st_lookup_lineno( char* name );
int st_lookup_type( char* name );
TreeNode* st_lookup_node( char* name ); // 잘 안됨.
추가함.
array가 아닌 변수를 array처럼 사용하려 하는 경우 하는 상태에서 push 하고 일단 퇴근.
cse20141390@cspro9:~/proj34/tiny/project3_30$ git diff
diff --git a/project3_30/analyze.c b/project3_30/analyze.c
index 4b90943..518cf74 100644
--- a/project3_30/analyze.c
+++ b/project3_30/analyze.c
@@ -447,6 +447,14 @@ static void checkNode( TreeNode* t )
switch ( t->kind.exp )
{
case AssignK:
+ if ( t->child[1]->nodekind == ExpK &&
+ t->child[1]->kind.exp == CallK &&
+ t->child[1]->type == VOID ) // assign function return void
+ {
+ fprintf( listing,
+ "ERROR in line %d : assigning void value to variable\n",
+ t->lineno );
+ }
함수 반환값이 void일 때 assign 안되도록
TODO 함수의 return type이 void일 경우 return이 없어야 함 함수의 return 값과 return type이 일치하는지 check => FuncK에서 child 순회하면서 check해야
함수 호출 시 parameter의 개수와 type이 일치하는지 check => scope를 참조해야 하는데...
함수 호출 시 호출된 것이 함수가 맞는지 (즉 변수 등이 아니었는지) 확인해야 => scope에서 체크하는게 편한가?
main함수는 가장 마지막에 선언되어야 함 main함수는 반드시 void로 선언되어야 함 main함수는 반드시 parameter가 존재하지 않는다. => FuncK에서 이름이 main인 함수 check
loop문의 반복 조건을 표시하는 부분에 오는 statement는 int값을 가질 수 있어야 한다. => IterK child[0](expression) type 체크
a4cc194eac6edeacb38765472ac9bf4bbfdaae3a 까지 해서 return type check, main() check까지 된듯
BucketList l_1,l_2;
l_2 = st_lookup_buck(t->child[1]->attr.name);
if((l_2->node->nodekind == ParamK &&
l_2->node->kind.param != ArrParamK) ||
(l_2->node->nodekind == DeclK &&
l_2->node->kind.exp != ArrVarK)
){
printf("ERROR in line %d : Can't use non-array as array\n",t->lineno);
}
int func(int x,int y){
return 4;
}
void voidfunc(void){
}
void main(void){
int x[5];
func(1,2);
func(1,2,3);
func(1,x);
voidfunc(1);
}
ERROR in line 16 : the number of arguments is incorrect. ERROR in line 17 : the type of argument is incorrect. ERROR in line 18 : the type of argument is incorrect.
check | stst | comment |
---|---|---|
? | 변수에 값을 assign 하는 경우 type에 대한 check | int 랑 void 만 있는데 무슨 체크? int 아닌 타입 사용하려면 그전에 에러발생. 구현 준비는 해놓음. |
X | 함수 호출 시 호출된 것이 함수가 맞는지 (즉 변수 등이 아니었는지) 확인해야 | CallK에서 symbol table 보고 확인 |
X | loop문의 반복 조건을 표시하는 부분에 오는 statement는 int값을 가질 수 있어야 한다. | stmt 하위에서 callK 인자를 보고 하면 된다? |