OS

[OS] C언어 코드 분석_4

효진인데요 2023. 12. 20. 16:41

 

 

작년, 그러니까 3학년 2학기에 운영체제 강의를 들으며 주어졌던 C code 분석 과제를 다시 한번 정리해보려고 한다.

 

C 언어로 작성된 코드를 주고 이를 분석하는 과제였는데, C 언어를 한 번도 사용해 본 적 없을 때라 (사실 현재까지도) 어려웠지만 흥미로웠던 기억이 있었다.

 

C 언어를 배우기 전이기도 하고, 구조에 대해 이해하고 코드를 분석해 보는 데에 의의를 둔 것이기에,

분석하고 정리한 내용이 정확하지 않을 수도 있는 점,,🙏🏻

 

 

https://jinnycoding.tistory.com/78

 

[OS] C언어 코드 분석_3

작년, 그러니까 3학년 2학기에 운영체제 강의를 들으며 주어졌던 C code 분석 과제를 다시 한번 정리해보려고 한다. C 언어로 작성된 코드를 주고 이를 분석하는 과제였는데, C 언어를 한 번도 사용

jinnycoding.tistory.com

 

위 포스팅이 3번째 글이고 이어서 작성해보려 한다.

 

 

 

 

 

 

다음으로는 4번째 else if문으로, 연산자를 식별하는 함수이다.

 

 

 

1.1 Priotry 함수

Priotry 함수

 

 

정수를 리턴 값으로 받는 Priotry함수는 연산자에게 우선순위를 부여하기 위해 구현한 함수이다.

만약 입력받은 연산자가 + 기호나 – 기호이면 1을 리턴하고, * 기호나 / 기호이면 2를 리턴 값으로 준다.

 

 

else if문이 실행되려면 일단 lineyedek [i]가 사칙연산 기호 중 하나에 해당해야 한다.

 

  1. 스택이 비어 있는지 검사하고비어 있으면 MathStack에 해당 연산자를 Push 한다.

  2. 스택에 빈자리가 없으면 상위 연산자를 확인하는 과정을 거쳐야 한다.

  3. 만약 Priotry 함수를 거쳐 나온 리턴 값이 MathStack의 가장 상단에 위치하고 있는 연산자의 리턴 값보다 작거나 같은 경우, MathStack의 가장 상단에 있던 연산자를 삭제하고 lineyedek [i]에 해당하는 연산자를 삽입한다.

  4. lineyedek 연산자의 리턴 값이 MathStack의 연산자 리턴 값보다 크면 MathStack에 연산자를 그대로 Push 한다.

 


 

 

 

마지막으로 isalpha 함수를 사용하여 문자를 식별하는 조건문이다.

 

여기에서 굉장히 중요한 함수인 GetVal이 나온다.

 

2.1 isalpha 함수

isalpha 함수 원형

 

 

알파벳을 식별하는 코드에 매개변수가 int형인 이유는 문자를 넣으면 자동으로 ASCII 코드에 있는 숫자로 변환되어 들어가기 때문이다.

즉, a라는 알파벳 문자를 넣어도 오류가 나는 것이 아닌 자동적으로 숫자 97로 변환이 되어 들어가게 되는 것이다.

 

위 표를 봐도 알 수 있듯이 해당 함수는 0, 1, 2를 반환하는 함수이다.

 

 

2.2 GetVal 함수

GetVal 함수 / 주석을 참 열심히 써두었다 ㅋㅅㅎㅋ

 

GetVal 함수는 파라미터로 문자, 정수, 스택을 받는다.

먼저 Node 연결 리스트의 헤드로 주소를 지정한 뒤 파라미터로 입력받는 line은 0으로 설정해 둔 상태로 시작한다.

만약 stck의 최상단이 NULL 상태이면 스택은 비어 있는 상태임을 의미하므로 빈 스택이라는 에러 메시지를 띄운다.

빈 상태가 아니면 헤드는 스택의 top을 가리키고, do-while 반복문을 실행한다.

 

헤드가 가리키고 있는 곳의 exp_data와 exp_name이 같은 경우, 내부 노란색 if문으로 진입한다.

만약 해당 head의 type값이 1이면 해당 스택의 val 값을 리턴하고, type이 2면 GetVal 내부 정수형 변수인 line을 해당 스택의 변수 line 값으로 새로 지정한 뒤 -1을 리턴한다.

 

exp_data 값과 exp_name 값이 같지 않으면 head는 가리키고 있던 주소를 다음 주소로 이동한다.

이 행동을 head가 가리킬 다음 노드가 없을 때까지 진행한다.

 

do-while문이 종료된 뒤 한 번 더 검토하는 코드가 있다.

두 번째 하늘색 사각형 부분이며, 함수의 내용은 동일하기 때문에 별도의 설명은 생략하였다.

 

스택의 타입이 다 지정된 후 마지막 리턴 값으로 -999를 받고 함수는 종료된다.

 

 

 

 

함수의 길이가 긴 관계로 내부 if문과 else문은 따로 다루기 위해 5.1과 5.2로 나눠 두었다.

 

  1. 마지막 if문의 조건을 보면 isalpha 함수의 반환 값이 0보다 큰 경우를 찾고 있기 때문에 이는 즉 알파벳인 경우 if문을 실행한다는 것을 말한다.

  2. 정수형 변수 codeline과 dummyint, retVal을 선언하고 0으로 초기값을 설정해 두었다.

  3. GetVal 함수는 파라미터로 차례대로 문자형, 정수형, 스택형을 받는데, 해당 함수를 실행한 뒤 반환 값을 retVal에 저장한다.

 

 

 

 

  1. if문부터 확인해 보면 GetVal 함수를 돌고 난 뒤 리턴 값이 -1과 -999가 둘 다 아닌 것이 조건문으로 설정되어 있다.

  2. -1이 반환 값으로 오는 경우는 head의 type이 2인 경우이고 이 경우는 함수인 경우이기 때문이다. 
    따라서 5.1은 변수를 판별하기 위한 함수임을 확인할 수 있다.

  3. 숫자형 변수를 찾아야 하기 때문에 48을 더해서 ASCII 코드 형태로 변환한 뒤 y에 1씩 더해가며 진행한다.

  4. 다음은 5.2 함수이다해당 함수는 리턴 값이 -1과 -999 중 하나라도 맞으면 실행된다.

  5. 만약 LastFunctionReturn의 값이 -999이면 함수인 경우이며정수형 변수 j를 설정한 뒤 tempNode의 type을 3으로, line을 curLine으로 지정한 뒤 스택에 Push 하여 저장한다.

  6. GetVal 함수에 인자를 넣고 실행한 뒤 반환되는 정수형 값을 CalingFunctionArgVal에 저장한다.

  7. 파일을 닫고 다시 읽기 전용 모드로 열어서 curLine을 0으로 설정하여 파일의 제일 첫 부분으로 이동한다.

  8. 노란색 부분의 for문을 보면 j를 활용하여 filePtr의 가장 첫 줄부터 codeline 끝까지 차례로 읽어 들이는 과정이다.

  9. WillBreak의 값을 0에서 1로 전환한 뒤 break문으로 함수를 종료한다.

  10. 두 번째 빨간 사각형 부분의 else문을 보면 postfix [y] 값에 LastFunctionReturn 값에 48을 더해 ASCII 코드 값으로 변환해 주고 LastFunctionReturn값은 -999로 설정해 둬서 같은 위치에서 한 번 더 걸리지 않도록 한다.

 

 

 

 

728x90