인터프리터
-
인터프리터...34일지 2021. 1. 28. 09:09
심볼 테이블에 등록 변수를 선언하거나 함수를 정의할 때 해당하는 이름을 구할 수 있고 문맥을 통해 변수 명인지 함수 명인지 파악할 수 있다. 단, 인터프리터의 경우에는 초기값 대입 시 형을 결정하므로 이름과 종류, 배열인 경우 배열의 길이를 저장한다. BBI 인터프리터에서는 다음의 방식으로 등록 처리를 한다. int Enter(SymbolTable& stbl, SymbolKind kind) { 변수명 외에 $를 사용하지 않은 것을 확인 종류별 정보를 설정 이름이 중복되지 않은 것을 확인 if (함수인 경우) { 정의 행을 주소로 저장 } if (변수 또는 인수인 경우) { 메모리 할당 후 주소 저장 } 글로벌 이름인지 로컬 이름인지 판정하고 해당하는 심볼 테이블에 등록 return 심볼 테이블 위치; }..
-
인터프리터...33일지 2021. 1. 20. 10:47
심볼 테이블 작성 변수명이나 함수명을 관리하는 테이블을 심볼 테이블이라고 한다. 데이터 처리 시 심볼테이블을 참고해 값을 처리하게 된다. var dt 심볼 테이블에 변수명, 할당 주소 등을 등록 dt = 10 심볼 테이블을 참조해 dt의 주소를 알아내 그곳에 10을 넣는다 ※ 변수의 이름이 중복되거나 선언되지 않은 변수를 사용하는 오류 검출에도 심볼 테이블이 사용된다. 심볼 테이블에 저장할 값은 언어 사양이나 프로그램 구현 방식에 따라 달라지면 일반적으로 다음과 같은 정보를 저장한다. 변수 이름, 종류, 변수의 형, 배열의 차원수와 배열 길이, 기억 장소 정보, 메모리 배치 주소 함수 이름, 종류, 함수 반환 값의 형, 인수의 수, 함수 코드 시작 주소 또한, 이러한 정보는 구현하는 것이 인터프리터인지 ..
-
인터프리터...32일지 2021. 1. 11. 11:37
C 방식 식 분석 프로그램 MiniCalculator_ver.C.h #pragma region 실행 처리 int varArr[26]; // 계산 처리 void Operate(TokenKind op) { int num2{ Pop() }, num1{ Pop() }; switch (op) { case TokenKind::Plus: Push(num1 + num2); break; case TokenKind::Minus: Push(num1 - num2); break; case TokenKind::Multiply: Push(num1 * num2); break; case TokenKind::Divide: if (num2 == 0) { std::cout
-
인터프리터...30일지 2020. 12. 22. 12:08
C 방식의 구문 규칙 구문 규칙은 가장 낮은 우선순위에서 부터 높은 우선순위의 연산자를 호출하는 형식으로 되어있으며 간략한 예는 다음과 같다. 식 논리 AND 식 식 || 논리 AND 식 논리 AND 식 등가식 논리 AND식 && 등가식 등가식 관계식 등가식 == 관계식 등가식 != 관계식 관계식 가감식 관계식 가감식 관계식 = 가감식 가감식 승제식 가감식 + 승제식 가감식 - 승제식 승제식 단항식 승제식 * 단항식 승제식 / 단항식 승제식 % 단항식 단항식 일차식 단항 연산자 단항식 일차식 상수 변수 ( 식 ) 단항 연산자 one of + - ! 더보기 참고문헌 만들면서 배우는 인터프리터하야시 하루히코 상세보기
-
인터프리터...29일지 2020. 12. 18. 13:23
전자 계산기 프로그램 실행 및 테스트 MiniCalculator.h #pragma region 입력 처리 char buffer[80]; void Input() { top = 0; std::fill_n(buffer, 80, 0); std::cin.getline(buffer, 80); current = buffer; ch = NextCharacter(); } #pragma endregion MiniCalculator.cpp #include "MiniCalculator.h"; int main() { while (true) { Input(); token = NextToken(); if (token.tokenKind == TokenKind::EndOfToken) { break; } Statement(); } } ..
-
인터프리터...28일지 2020. 12. 16. 12:45
전자 계산기 프로그램 연산 실행 처리 MiniCalculator.h #pragma region 실행 처리 int varArr[26]; // 계산 처리 void Operate(TokenKind op) { int num2{ Pop() }, num1{ Pop() }; switch (op) { case TokenKind::Plus: Push(num1 + num2); break; case TokenKind::Minus: Push(num1 - num2); break; case TokenKind::Multiply: Push(num1 * num2); break; case TokenKind::Divide: if (num2 == 0) { std::cout