─━ IT ━─

MASM 토나데시코의 오리지널 컴파일러 제작 3

DKel 2021. 8. 16. 00:02
반응형
처음으로
본연재에서는, 최근의 일본어 프로그래밍 언어 중에서 높은 쉐어를 차지하는 「나데시코」를 사용하여, BASIC 라이크한 자작 언어의 컴파일러를 작성합니다.
전회, 「MASM 토나데시코에 의한 오리지날 컴파일러의 제작 2」에서는, 자작 프로그래밍 언어 「VEFBL」의 언어 사양에 따른, 간단한 interpreter 환경을 만들었습니다.이번에는, 그 interpreter 환경에 이용한 프로그램을 응용하고, 드디어 컴파일러를 작성합니다.
과거의 기사
1회 : 컴파일러와 어셈블러의 기초지식
제2회 : 첫 나데시코
대상 독자
기술수준은따로묻지않지만나데시코의간단한문법을미리습득하는것이좋습니다.「스스로 만든 프로그래밍 언어로 소프트를 만들고 싶다!」라고 생각하는 분도 환영합니다.
또한 플랫폼은 Windows XP 를 권장합니다.MASM 어셈블러 설치가 현재 Windows XP 이후의 Windows NT 계 OS에서만 동작을 확인할 수 있기 때문입니다.이는 설치 기동 시에 사용하는 Win32API가 윈도 9x계 OS에 없기 때문에 윈도 보호 예외에러가 발생하는 것이 원인입니다.또, MASM은 Mac OS나 Linux등에서는 동작하지 않습니다.
작성의 흐름
컴파일러를 작성함에 있어서 본고에서는 다음 순서로 설명해 나갑니다.
print 함수의 이해
이번에 컴파일러에서 작성하는 것은 문자열을 표시하기만 하면 됩니다.그러나, 그 문자열을 표시하기 위해서 사용되는 print 함수에 대해서, 사용법을 이해해 둘 필요가 있기 때문에, 해설하겠습니다.
코드 제너레이터 설정
컴파일로 사용하는 코드 제너레이터를 다운로드하여 배치합니다.
컴파일러의 작성
어셈블리 코드를 기술하면서 컴파일러를 작성합니다.
컴파일러 실행
마지막으로 컴파일러를 실행합니다.
print 함수를 이해하다
′VEFBL′로 표시해 보는
지난 번 기사에서는 다음 내용의 ′tokentest.nako′ 를 작성하여 ′Hello Word!′ 를 표시하도록 하였습니다.
지난번 작성한 tokentest. nako
버퍼는 하늘.
문자열 중에는 아니요.
최신 명령은 하늘.

′print ′Hello Word!′ 를 문자열 분해하여 반복
만약 버퍼가 ′print′라면,
「print 를 검출했습니다」라고 한다.
최신 명령은 버퍼.
버퍼는 하늘.

다르다면, 만약 대상이 ′′이라면,
만약 문자열 중이 아니라면,
문자열 중에는 아니요.
만약 최신 명령이 ′print′라면,
버퍼 표시.
버퍼는 하늘.
다르다면
문자열 중에는 네.
버퍼는 빈자리. //문자열의 처음에 붙어 버리는 ′ ′ ′ ′
다르면 //여기는 대상이 ′이′가 아닐 때 처리예요
버퍼는 「{버퍼}{대상}」.
//상기 이외의 경우
//print뒤에 반각스페이스 이런 거는
//이 행부터 5행 상으로 대처해 버리고 있습니다.
이번에는 먼저 print 함수의 사용법을 설명해 보겠습니다.예를 들면 표시시키는 문자열을 「VEFBL」로 하고 싶을 때는, 어디를 수정하면 좋은 것일까요.tokentest.nako를 보시면(가능하다면 나데시코 에디터-nakopad.exe에서 열기를 권장합니다), 문자열을 표시하고 있는 프로그램 부분은 다섯 번째 줄인 것을 알 수 있습니다.
′print ′Hello Word!′ 를 문자열 분해하여 반복
이 부분을 변경하면 다른 문자열을 표시할 수 있을 것 같습니다.시험삼아 해보겠습니다.
tokentest.nako 5번째 줄 수정하고 다른 문자열을 표시한다
′print ′VEFBL′′을 문자열 분해하여 반복
실행 결과
VEFBL
제대로 다른 문자열도 표시할 수 있었습니다.
다시 줄바꿈을 해서 또 하나의 print 함수를 행사해 보면 어떻게 될까요?
tokentest.nako 5행 수정 1행 추가하고 print 함수 여러 번 실행한다
「 print ′ VEFBL ′
print ′Hello Me!′ 를 문자열 분해하여 반복
결과
VEFBL
Hello Me !
예상했던 대로, 2개의 문자열이 줄 바꿈으로 표시되었습니다.덧붙여 「print 검출했습니다」의 행은 향후 필요없기 때문에, 9행째는 지워 둡니다.
이제 메시지 상자를 표시하는 함수 msgbox함수를 만들겠습니다.만드는 방법은 print 함수와 비슷한 프로그램이 됩니다.
tokentest . nako
버퍼는 하늘.
문자열 중에는 아니요. // 현재 위치가 문자열 안인지
최신 명령은 하늘. // 방금 지정된 명령

′msgbox ′해봤어요′를 문자열 분해하고 반복
// 이렇게 하면 문자열에 변수를 채울 수 있습니다
만약 버퍼가 ′print′라면,
최신 명령은 버퍼.
버퍼는 하늘.
// 아직 다른곳에 print가 있어도
//「print(어쩌고)print」등이 되어버려
// 검출할 수 없게 되다
다르다면, 만약 버퍼가 ′msgbox′라면,
최신 명령은 버퍼.
버퍼는 하늘.
다르다면, 만약 대상이 ′′이라면,
// ′′는 일반 언어에서 문자열의 처음을 가리키는
만약 문자열 중이 아니라면,
문자열 중에는 아니요.
만약 최신 명령이 ′print′라면,
버퍼 표시.
버퍼는 하늘.
다르다면, 만약 최신 명령이 ′msgbox′라면,
버퍼를 말하다.
버퍼는 하늘.
다르다면
문자열 중에는 네.
버퍼는 하늘. // 문자열 처음에 붙어 버리는 ′ ′ 대책
다르다면
버퍼는 「{버퍼}{대상}」.
작성했으면 실행해보죠.다섯번째줄에한줄을더추가해보겠습니다.
tokentest.nako 5행 수정 후 1행 추가
′msgbox′ 해봤어요
print ′해봤어요′를 문자열 분해하여 반복
이거 실행하다 보니까 ′저 해봤습니다′ 메시지 박스가 2개나 떴어요.2행째의 print 함수는 작용하고 있지 않은 것 같고, 아무것도 표시되어 있지 않습니다.
디버깅
원인을 찾기 위해서 디버깅을 실시합니다.나데시코에도 당연히 디버거가 탑재되어 있으며, 이번 경우는 8행째에
tokentest.nako 8줄에 추가
디버깅
라고 쓰는 것만으로 디버깅을 실시할 수 있습니다(디버깅. 전에, 들여쓰기를 위한 전각 스페이스가 들어가 있는 것에 주의해 주세요).
실행을 하고 디버깅 대화상자에서 [계속]을 클릭하면서 버퍼의 내용물을 살펴보면, 가장 중요한 ′msgbox′ 함수가 실행된 후에 {}(줄바꿈코드)가 들어가 있고 {}print를 명령으로 인식해 버린 것 같습니다.그 때문에 조건 분기 안에는 없기 때문에 그대로 변수 최신 명령에 저장되어 있는 msgbox를 실행하고 말았습니다.
그래서, 다음과 같이 수정했습니다.
tokentest.nako(굵은 글씨가 수정된 곳)
버퍼는 하늘.
문자열 중에는 아니요.
최신 명령은 하늘.

′msgbox′ 해봤어요
print ′해봤어요′를 문자열 분해하여 반복
만약 버퍼가 ′print′라면,
최신 명령은 버퍼.
버퍼는 하늘.
다르다면, 만약 버퍼가 ′msgbox′라면,
최신 명령은 버퍼.
버퍼는 하늘.
다르다면, 만약 대상이 ′′이라면,
만약 문자열 중이 아니라면,
문자열 중에는 아니요.
만약 최신 명령이 ′print′라면,
버퍼 표시.
버퍼는 하늘.
다르다면, 만약 최신 명령이 ′msgbox′라면,
버퍼를 말하다.
버퍼는 하늘.
다르다면
문자열 중에는 네.
버퍼는 하늘.
다르면 만약 대상이 줄바꿈이 아니라면
버퍼는 「{버퍼}{대상}」.
변경 부분은 마지막 줄 직전의 다르면 만약 대상이 줄바꿈이 아니면 한 것입니다.아까 디버거에서 나온 ′{n′은 줄바꿈을 의미하기 때문에 변경부분에서 변수 ′줄바꿈′이 반복되지 않을때 버퍼에 글자를 추가하기로 했습니다.즉 줄바꿈 코드 이외에 문자를 추가하는 것이죠.이를 실행하다 보면
msgbox ′해봤어요′
print ′해봤어요′
원하는 동작을 다 했어요.
print 함수의 사용법을 이해한 후에 드디어 컴파일러를 작성해 나가겠습니다.
반응형