컴파일러 만들기
본 자료는 5페이지 의 미리보기를 제공합니다. 이미지를 클릭하여 주세요.
닫기
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
해당 자료는 5페이지 까지만 미리보기를 제공합니다.
5페이지 이후부터 다운로드 후 확인할 수 있습니다.

소개글

컴파일러 만들기에 대한 보고서 자료입니다.

목차

1. 서론 --------------------------------- 1
1.1 과제 설명 ------------------ 1

2. 본론 --------------------------------- 1
2.1 자료구조, 알고리즘 ------- 1
2.2 소스 코드 ------------------ 5
2.3 실행 결과 ------------------ 12

3. 결론

본문내용

복하고 result를 저장한다.
CtoKind(string)은 string으로 kind를 찾아 kind를 반환하는 함수이다. (C언어에 한해서)
CtoString(kind)은 kind로 string을 찾아 string을 반환하는 함수이다. (C언어에 한해서)
Translation.h에는 소스 코드를 읽어 구분할 문자의 타입을 CharTape이라는 enum class에 열거한다.
그리고 Translation.cpp에서 정의할 함수들도 선언한다.
Translation.cpp에는 를 선언한다.
(소스코드를 읽어 문자 타입을 구별할 때 현재 문자를 나타내기 위해서)
먼저 번역을 하기 위해서, 번역할 파일을 input하여 읽어야 한다.
파일(test.n)을 열어서
파일의 크기만큼의
문자열 크기를 가지는
SourceCode에
파일 전체 내용을
저장하는 함수이다.
번역할 파일을 sourceCode에 저장하였다면, 이를 토큰 단위로 쪼개어 kind로 구분하여야 한다.
sourceCode(번역할 파일의 전체 내용을 저장한 문자열)의 마지막에 ‘\\0’을 더하고, sourceCode의 제일 처음 위치값을 current가 가지게 한다.
*current가 ‘\\0’이 될 때까지 반복하여 토큰을 나누어 해당되는 kind로 구분한다.
*current의 CharType에 따라 토큰의 string, kind을 push_back한다.
getCharType은 *current의 charType을 알아내기 위해 필요한 함수이고,
isCharType은 *current와 charType이 올바른지 확인하는 함수이다.
*current가 “\\\"”일 경우, scanStringLiteral();이 실행된다.
이때 *current는 “\\\"”이기 때문에 current++ 해준다.
그리고 *current를 1씩 늘려가며 *current 값을 string에 더하고, “\\\"”를 만날때까지 반복한다.
Token을 {Kind::StringLiteral, string}으로 반환한다.
*current가 영어 문자일 경우, scanIdentifierAndKeywordLiteral();이 실행된다.
이때 *current를 1씩 늘려가며 *current값을 string에 더해주고, charType이 IdentifierAndKeywordLiteral이 아닐 때까지 반복한다.
그리고 string이 N언어의 kind에 존재하는지 확인한다.
(ex: string이 echo라면, NtoKind(string); 하여
Kind::Print를 찾아 kind를 Kind::Print로 한다.)
그리고 Token을 {kind, string}으로 반환한다.
만약 *current가 “.”일 경우, 파일이기 때문에 *current를 1씩 늘려가며 *current값을 string에 더해주고, charType이 IdentifierAndKeywordLiteral이 아닐 때까지 반복한다.
그리고 Token을 {Kind::FileLiteral, string}으로 반환한다.
*current가 연산자의 형태일 경우, scanOperatorAndPunctuator();이 실행된다.
위와 같이 string이 N언어의 kind에 존재하는지 확인하고,
Token을 {kind, string}으로 반환한다.
마지막으로 Translation은 번역할 n언어의 소스코드를 토큰 단위로 나누고 kind를 구분하여 만든 tokenList, 번역될 c파일 이름을 매개변수로 한다.
이는 n언어 명령의 마지막 토큰에 따라 번역이 진행된다.
그 전에, c 소스를 작성하기 위해 필요한 것들을 적어주어야 한다.
번역할 파일(.n)에 Kind::Print가 있는지 확인하여 를 include해준다.
(c언어에서 printf를 사용하기 위해 가 필요하기 때문에)
그리고 파일이 c파일인지 확인하고, int main(){을 번역될 파일에 적어준다.
번역할 파일(.n)에 파일이름이 있다면, 파일을 사용한다는 의미이기 때문에
파일의 개수를 세어 FILE *f1... 를 적어준다.
그리고 본격적으로 n언어의 명령에 대한 번역을 시작한다.
n언어의 명령 마지막 토큰은 StringLiteral이거나 FileLiteral이다.
StringLiteral일 때는 앞 토큰의 kind가 Print이어야 하고,
FileLiteral일 때는 앞 토큰의 kind가 FileOpen이거나, Copy이어야 한다.
총 3가지 경우에 따라 번역을 진행한다.
tokenList가 끝이 나면, return 0; }을 번역될 파일에 적어주고 종료한다.
마지막으로 Main.cpp는 “Translation.h”을 include하여 번역한다.
Main [번역할 .n파일] [번역될 .c파일] 으로 실행하였을 때,
번역할 파일 내용을 inputFile을 통해 sourceCode라는 string으로 가져오고, 이를 scan하여 token 단위로 쪼개 tokenList로 완성한다.
그리고 tokenList를 번역될 파일에 Translation을 통해 번역한다.
2.3 실행 결과
윈도우 명령프롬프트에서 g++ 컴파일러를 사용하여 실행한다.
g++을 사용하기 앞서, g++의 버전을 확인한다.
실행하기 위해 파일들이 존재하는 디렉터리로 이동한다.
Desktop/homework 디렉터리에 존재하는 파일들을 확인한다.
Main.cpp, Token.cpp, Translation.cpp를 컴파일하여 Main이라는 실행파일을 생성한다. 그리고 성공적으로 실행파일이 생성되었는지 확인하기 위해
디렉터리에 존재하는 파일들을 확인한다.
Main test.n test.c 라는 명령으로 test.n을 test.c로 번역하는 프로그램을 실행한다. (이때, test.n은 디렉터리 내에 존재하는 파일이어야 한다.)
test.c가 성공적으로 생성되었는지 확인하기 위해 디렉터리에 존재하는 파일들을 확인한다.
test.c를 컴파일하여 test라는 실행파일을 생성하고, test를 실행한다.
제대로 번역이 이루어졌다는 것을 확인하고, 성공적으로 b.txt가 생성되었는지 확인한다.
b.txt가 a.txt와 같은 내용으로 복사되었는지 확인한다.

키워드

  • 가격4,500
  • 페이지수15페이지
  • 등록일2022.08.05
  • 저작시기2021.9
  • 파일형식한글(hwp)
  • 자료번호#1175966
본 자료는 최근 2주간 다운받은 회원이 없습니다.
청소해
다운로드 장바구니