반응형

이전 글에서 목적코드를 모두 생성했으니, 이제 코드를 실행할 수 있는 환경을 만들어줄 것이다. 

스택프레임

  • 함수의 호출은 스택 구조로 처리한다.
  • 스택에 들어갈 자료형인 StackFrame 을 만들어준다.

Machin.cpp

struct StackFrame {
    vector<any> variables;
    vector<any> operandStack;
    size_t instructionPointer = 0;
};

static vector<StackFrame> callStack;
  • 파라미터, 지역변수, 피연산자 스택, 다음에 실행할 명령어 위치 을 담고 있는 구조체이다. 

 

코드 실행기

main.cpp

vector<Token> scan(string sourceCode);
Program* parse(vector<Token> tokenList);
tuple<vector<Code>, map<wstring, size_t>> generate(Program* syntaxTree);
void execute(vector<Code> codeList, map<wstring, size_t> functionTables);

int main() {
    string sourceCode = R"(
        함수 시작() {
            1 + 2;
        }
    )";

    vector<Token> tokenList = scan(sourceCode);
	Program* syntaxTree = parse(tokenList);
	auto objectCode = generate(syntaxTree);
    execute(get<0>(objectCode), get<1>(objectCode));

    return 0;
}
  • execute 함수를 추가해주었다.
void execute(vector<Code> codeList, map<wstring, size_t> functionTables)
{
    callStack.emplace_back();
    while (true)
    {
        auto code = codeList[callStack.back().instructionPointer];
        switch (code.instruction)
        {
            case Instruction::Exit:
                callStack.pop_back();
                return;
        }
        callStack.back().instructionPointer += 1;
    }
}
  • execute함수는 3가지 동작을 반복한다.
    1. 명령어를 가져온다.
    2. 명령을 수행한다.
    3. 명령어 포인터를 업데이트한다.
  • switch문을 완성해주면 된다.

 

 

자세한 코드 구현사항은 [컴파일러 만들기 - 유종원] 책을 참고하거나, 깃허브 소스코드를 참고해주시길.

Yoon6/korlang: korlang compiler.

 

GitHub - Yoon6/korlang: korlang compiler.

korlang compiler. Contribute to Yoon6/korlang development by creating an account on GitHub.

github.com

 

korlang playground

C++로 작성한 컴파일러를 wasm으로 빌드하여 github pages에 올려두었다.

https://yoon6.github.io/korlang/

에러 처리등 아직 문제가 많다.

토큰 리스트/파싱 트리도 볼 수 있게 만들고,

에러처리도 세분화하고, 문법도 추가하고 해 볼 예정이다.

언어는 C++ 같은 하이레벨 언어를 계속 쓸 것같다.

본 프로젝트의 목적은 학습이기 때문에 어셈블리까지 갈 필요는 없을 거 같음.

 

728x90

+ Recent posts