kooBH / tiny

Compiler Construction Principles and Practice by Kenneth C. Louden
0 stars 0 forks source link

오류 체크 사항 #5

Closed kooBH closed 5 years ago

kooBH commented 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값을 가질 수 있어야 한다.
kooBH commented 5 years ago
int st_lookup_lineno( char* name );
int st_lookup_type( char* name );
TreeNode* st_lookup_node( char* name );  // 잘 안됨.

추가함.

array가 아닌 변수를 array처럼 사용하려 하는 경우 하는 상태에서 push 하고 일단 퇴근.

consilium538 commented 5 years ago
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 안되도록

consilium538 commented 5 years ago

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 체크

consilium538 commented 5 years ago

a4cc194eac6edeacb38765472ac9bf4bbfdaae3a 까지 해서 return type check, main() check까지 된듯

consilium538 commented 5 years ago

Screenshot_20190527-185258_Chrome

kooBH commented 5 years ago
  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);
                      }
kooBH commented 5 years ago

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.

consilium538 commented 5 years ago
check stst comment
? 변수에 값을 assign 하는 경우 type에 대한 check int 랑 void 만 있는데 무슨 체크? int 아닌 타입 사용하려면 그전에 에러발생. 구현 준비는 해놓음.
X 함수 호출 시 호출된 것이 함수가 맞는지 (즉 변수 등이 아니었는지) 확인해야 CallK에서 symbol table 보고 확인
X loop문의 반복 조건을 표시하는 부분에 오는 statement는 int값을 가질 수 있어야 한다. stmt 하위에서 callK 인자를 보고 하면 된다?