[Python] BanDal 컴파일러

저는 컴파일러 이론을 제대로 공부한 적이 없는 평범한 고등학생입니다.
또한 코드가 비효율적이거나 이론과 잘 맞지 않는 부분이 있다면 감안해주시면 감사하겠습니다.
:디

원래 파이썬을 주로 사용했는데 언어의 뿌리가 C라고 해서 학습용으로 설치하는 방법을 찾다가 알게 되었습니다.
그런 다음 gcc라는 컴파일러를 설치해야 한다고 합니다.
그래서 컴파일러가 궁금해서 구조를 공부했고, 전산학과에 가서 배워서 미리 공부해두면 좋을 것 같아서 그렇게 개발까지 했습니다.
:피

원래 Python이나 C와 같은 대중적인 언어에 대한 컴파일러를 만들려고 했으나 개발자라면 누구나 좋아할 나만의 언어를 만들기로 했습니다(제가 만든 언어의 이름은 BanDal입니다.
) 이해가 안 되시죠? 언어 문법의 정의부터 시작하겠습니다.

언어 문법은 ebnf로 작성하는 것을 권장하는 것 같지만, 어차피 컴파일러가 개발된다면 암묵적으로 ebnf와 비슷할 것이다.
귀찮기 때문에 기본적인 문법만 간단히 소개하겠습니다.

1. 입력

int8 1바이트 부호 있는 정수 데이터 유형
정수16 2바이트 부호 있는 정수 데이터 유형
int32 4바이트 부호 있는 정수 데이터 유형
uint8 1바이트 부호 없는 정수 데이터 유형
uint16 2바이트 부호 없는 정수 데이터 유형
uint32 4바이트 부호 없는 정수 데이터 유형
float32 IEEE-754 32비트 부동 소수점 데이터 유형
float64 IEEE-754 64비트 부동 소수점 데이터 유형
내부 int32의 약자
호버링 float64의 약자
거리 문자열을 나타냅니다
부울 True와 False로 구성된 논리형
“\x00″을 가리키는 빈 값입니다.

두 번째 기능

---
함수 선언
---
fn <name>(arg1, arg2, ... argN) (ReturnType1, ReturnType2, ... ReturnTypeN)
	<body>
    return ret1, ret2, ... retN
end --함수 종료

---
함수 호출
---
<name>(arg1, arg2, ... argN)

3. 제어 지침

---
Style 1
---
if <condition>
	<statement>
end


---
Style 2
---
if <condition>
	<True-statement>
else
	<False-statement>
end


---
Style 3
---
if <comparable1>
	is <comparable2>
    	<statement2>
    ...
	is <comparableN>
    	<statementN>
else
	<else-statement>
end

다음은 스타일 3의 예입니다.

---
In Bandal
---
if a
  is 1
    print("a is 1")
    is 2
    print("a is 2")
else
  pass
end

---
In Python
---
if a == 1:
  print("a is 1")
elif a == 2:
  print("a is 2")
else:
  pass
end

이런 식으로 스위치 역할도 합니다.
또한 함수의 정식 선언이 완료되었음을 알리는 if, ‘의 조건도 있습니다.
:‘ 나 ‘{}‘ 그런 불필요한 것들을 제거했습니다.

4. 운영자

연산자 앞뒤의 인수가 A와 B인 경우,

+ A 더하기 B
A 빼기 B
* A 곱하기 B
/ A를 B로 나누기(실수 나누기)
% A를 B로 나눈 결과의 나머지(정수 나누기의 나머지)
// A 결과를 B로 나눈 몫(정수 나누기)
^^ A에서 B
!
교수진
> A가 B보다 큽니까?
>= A가 B보다 크거나 같은가?
< A가 B보다 작습니까?
<= A는 B보다 작거나 같은가?
== A와 B는 같은가?
!
=
A와 B는 다른가요?

5. 변수

<name> <type> = <value> --변수 첫 선언
<name> = <valueN> --변수 타입이 같은 값으로 변경

6. 종료

다음 번에는 이 구문을 사용하여 어휘 분석기를 만들 것입니다.