Greetings

I'm a 4th-year Ph.D. candidate in Computer Science at the University of Toronto, working under the supervision of Prof. Khai Truong.

My research centers human-AI interaction, with an emphasis on accessibility and creativity support, particularly in enhancing "music accessibility" for d/Deaf and hard-of-hearing individuals. One of my main projects involves song signing to support culturally responsive content creation and encourage collaboration between d/Deaf and non-d/Deaf artists. Another aspect of my work focuses on enhancing people's well-being. I am engaged in projects that support individuals with dementia in their out-of-home experiences and encourage mindful eating behaviours among children.

I completed my B.Sci in Computer Science and Engineering at Ewha Womans University, where I was advised by Prof. Uran Oh (Human-Computer Interaction Lab) and Prof. Hyokyung Bahn (Distributed Computing and Operating System Lab). Additionally, I worked as a research intern at the Samsung AI Centre Toronto under the guidance of Dr. Iqbal Mohomed, and at NAVER AI (HCI group) with Dr. Young-Ho Kim.

INFIX to POSTFIX (Fall, 2018)

 



1. 스택의 구현

-student companion site 의 파이선 코드 array_stack exception 이용 2. ArithExpEval 클래스 구현

-array_stack에서 __init__으로 연산자 스택과 피연산자 스택을 만들어 준다. -연산자의 우선순위를 구분하기 위해 파이썬의 딕셔너리 이용한다.

Prec에서 우선순위가 가장 높은 **는 40, 가장 낮은 $은 0을 부여함
-
EvalExp()는 입력된 토큰을 구분하여 피연산자이면 push, 연산자이면 repeatOps()를 하고,

스택에 push하는 함수이며, 피연산자 스택의 top()을 반환한다.

NUMBER는 0x01, OPERATOR는 0x02, prevToken은 초기값 0(0x00)을 가진다. 이 값들은 피연산자와 연산자를 구분하기 위해 사용된다.
tokens는 사용자가 입력한 수식 string을 split한 원소들이다.
token의 종류에 따라 다음과 같이 구분하여 처리한다.

1) 피연산자인 경우(isNumber 이용)
-이전의 token이 또 피연산자인 경우, infix 형태가 아니므로 error 메시지4를 출력 하고 종료한다.
-그렇지 않은 경우 prevToken을 이 피연산자로 설정한다,
- 피연산자 스택에 push 한다.
2) 왼쪽 괄호인 경우
- 연산자 스택에 push 한다.
3) 오른쪽 괄호인 경우
- 연산자 스택이 비어있지 않고 top이 왼쪽괄호보다 우선순위가 놓은 경우

왼쪽괄호를 인수로 하여 repeatOps를 호출한다.

- 연산자 스택이 비어있지 않고 top이 왼쪽괄호인 경우 연산자를 pop한다.

- 이 조건을 만족하지 않은 경우 왼쪽괄호가 없으므로, error 메시지5을 출력 한다.

4) 정의되지 않은 연산자를 입력한 경우
- Prec 딕셔너리에 없는 연산자를 입력했으므로, error 메시지6을 출력한다.
5) 연산자인 경우
-이전의 token이 또 연산자인 경우, infix 형태가 아니므로 error 메시지4를 출력 한다.

- prevToken을 이 연산자로 설정한다.
- 연산자를 인수로 하여 repeatOps를 호출한다. - 연산자 스택에 push 한다.

-isNumber(self, s)는 입력한 토큰이 피연산자인지 확인하는 함수이다. 우선 정수인지 확인하 고, 아닌 경우 실수 인지 확인한다. 정수 또는 실수인 경우 True를 반환하고, 실수도 아닌 경우 False를 반환한다.

-number(self, s)는 피연산자를 스택에 push, pop 할 때 사용된다. 정수 또는 실수를 반환한 다.

-eval(self, op, y, x)는 연산자에 따라 다른 계산을 해주는 함수이다. Prec 딕셔너리 안에 있는 모든 연산을 할 수 있게 해준다.
y op x 결과를 반환한다.

-doOp(self)는 두 개의 피연산자와 하나의 연산자를 사용해 연산을 한 결과를 피연산자 스 택에 push 해주는 함수이다. 여기에 어떤 식을 계산하는 지 출력을 해주는 기능을 추가하였 다.

-expError(self, error)는 여러 가지 error 메시지를 출력하고 종료하는 함수이다.

-repeatOps는 피연산자 스택에 2개 이상의 피연산자가 있고, 주어진 연산자와 top의 우선순 위보다 낮은 경우 doOp를 부른다.
여기서 여러 가지 error를 찾아 메시지를 출력해 주어야 한다.

1) Opstk.top과 주어진 연산자 모두 왼쪽 괄호인 경우, 연산자 스택에 왼쪽 괄호만 남아있으므로 error 메시지1을 출력한다.

2) 피연산자 스택에 1개의 수만 존재하는 경우 2가지 에러가 발생한다.
첫 번째는 피연산자보다 연산자가 많은 경우이다. 이는 Opstk.top이 왼쪽괄호보다 우선순위가 높은 경우이다. 이때 error 메시지2를 출력한다.
두 번째는 주어진 연산자가 없는 경우($)이며, 이는 가장 우선순위가 낮은 계산에 사용되지 않는 $가 입력되었을 때 이며, 마지막을 뜻한다. 오른쪽 괄호가 존재하지 않을 경우 이러한 에러가 발생하므로 error 메시지1을 출력한다.

3) 피연산자 스택이 빈 경우 두 가지 에러가 발생할 수 있다.
첫 번째, 연산자 스택 또한 빌 수 있으므로, error 메시지3을 출력한다.
두 번째, 연산자 스택에 왼쪽괄호만 남아있을 수 있으므로, error 메시지1을 출력한 다.

3. 객체 만들기
main 함수에서는 우선 연산식을 입력할 때의 주의사항과 연산식 입력 안내문을 출력한다. 연산식을 parsing하기 위해 별도의 함수를 구현하지 않고 python의 함수 split을 사용하므 로, 반드시 공백으로 token들을 분리해야한다.
Expression에는 입력한 연산식을 저장한다.
myEval이라는 ArithExpEval객체를 만든다.
연산식을 spilt 한 결과를 EvalExp로 보내고 이 결과를 출력한다.


Comments