General
•
함수 수준에서 modular를 잘 하도록
•
interface를 정의하고 구현을 하도록, file level에서 modular를 잘 이루도록
◦
abstract object와 abstract data type을 정의
◦
data structures를 함수와 함께 encapsulate 하도록
◦
stateless module을 적절히 사용
•
DynArray를 쓰도록, 코드는 갖다 배껴쓰고
•
.ishrc라는 이름의 파일을 맨 처음에 런치했을 때 읽도록 구성. 그 파일에서 들어오는 command를 해석하지 못하면 성적이 안 좋아질것
•
.ishrc라는 파일은 home 디렉토리 상에서 검색하도록. working directory가 아니라
•
.ishrc파일이 존재하지 않거나 읽어드릴 수 없을 때 에러가 나면 안 되고 적절히 알아서 해야함.
•
.ishrc파일에서 읽어들여온 거는 프린트를 해야함.
◦
"% "를 출력하고 커맨드를 stdout으로 출력.
•
stdin으로 들어오는 명령들은 출력하지 말 것
Error Handling
•
programmer error를 assert함수로 잘 잡아내야함
•
assert 함수로 각 함수의 파라미터를 항상 체크하도록. 특히 non-static 함수들
•
user에러는 if문으로 잡아내도록. 그리고 에러 메시지를 적절히 잘 쓰자. user에러는 user input에 의해 발생하는 것들이다.
•
dynamic memory allocation이 잘 됬는지를 항상 체크하도록
•
standard error stream으로 메시지를 출력하도록
•
"prgramName :" 으로 에러를 시작하도록. programName 은 프로그램의 argv[0]이다.
◦
꼭 ish일 필요는 없다
•
함수를 부르는데 실패하면 perror나 strerror를 통해 적절한 에러 메시지를 출력하도록 하자
Lexical Analysis
•
fgets 함수를 통해 각 함수를 불러오도록
•
lexical analyzer를 dfa를 통해 구현하도록
•
white-space character를 구분하기 위해 isspace함수를 사용하도록
•
token 리스트를 출력해주는 임시 코드를 만들도록. 이게 잘 되기 전까지는 그 다음꺼 하지 마라
•
아래 example 라인이 적절히 출력되는거를 확인해봐라
Search
•
lexical analyzer를 통해서 special character가 있는지 없는지 꼭 확인해라.
cat file1 | grep str
cat file1 "|" grep str
Plain Text
복사
Syntactic Analysis
•
command가 적합한지(validation)을 진행해라
◦
여기서 많이 할 수록 execution phase에서는 할게 적어질 것이다.
•
syntatic analyzer로 만들어진 커맨드를 프린트해보는 임시 코드를 만들어봐라.
◦
이게 안되면 그 다음꺼는 할 생각 마라
•
syntactic analyzer를 테스트해봐라. 아래 예들을 가지고
Search
Execution
fork를 호출하기 전에 항상 fflush를 해라. I/O 버퍼를 비우기 위함
setenv built-in 명령을 구현하기 위해 setenv 함수를 불러야한다.
unsetenv built-in 명령을 구현하기 위해 unsetenv함수를 호출해야한다.
cd built-in 명령을 구현하기 위해 chdir함수를 호출해야한다.
exit built-in 명령을 구현하기 위해 exit(0)함수를 호출해야한다.
또는 프로그램의 메인 함수에서 return 0을 함으로써 구현해도 된다.
Signal Handling
•
signal 함수를 불러야한다. signal handler를 설치하기 위해
•
alarm함수를 불러야한다. SIGQUIT 시그널을 핸들링 하기 위해
•
SIG_IGN과 SIG_DFL을 써야한다.
•
sigprocmask를 호출해야한다. main 함수 근처에서 써야하는데. SIGINT, SIGQUIT, SIGALARM들이 블록되지 않은 것을 확인하기 위해 써야함.
Redirection (Extra Credit)
•
'<' 나 '>' 는 lexical 분석에서 special character로 취급해야한다.
•
파이프 토큰의 왼쪽에 redirection of standard out 이 있으면 에러가 되야하고
•
파이프 토큰의 오른쪽에 redirection of standard in 이 있으면 에러가 되야한다.
•
아래 커맨드들의 syntactic analysis도 같이 해봐라
Search
•
파일에 stdout과 stdin이 가능해야함
•
stderror 스트림으로 에러 표시가 가능해야함
•
없는 이름의 파일이면 만들어서 넣어야함
•
있는 이름의 파일이면 덮어써야함