컴파일단계에서 남은 과제는 계산식과 커멘드가 참조하는 각변수들을프로그램 Address로 전환하는 것입니다.
프로그램을 위해 메모리에 할당한 실제 변수를 가상화 시켜서스크립트가 참조할수 있는 Address로 번역하는 것입니다.
원본소스와 프로그램 컴파일을 위한 파싱과정은 다음과 같습니다.
* 현제 이프로그램은 에러처리 및 예외 처리는 하지 않습니다.
<원본소스>gRTN.demo(""
"struct one1 begin;"
"int A,B,C;" // 정수:초기화 -> to int array
"str D,E;" // 문자열:길이 -> to 가변 Array
"num F,G;" // FLOAT NUMBER -> to double
"end;"
"program main begin;"
"one1.A = 100;"
"one1.B = 2;"
"one1.C = one1.A + one1.B;"
"exec notepad.exe;"
"put '$1+$2=$3',one1.A,one1.B,one1.C;" // like prinf
"end;"
);
<처리과정>--------------------------------------------
Test Command List
--------------------------------------------
. help - (h) show this message
. run - (r) run script
. edit - (e) call editor
. quit - (q) quit program!
--------------------------------------------
r // 메뉴의 run을 실행한다. < 지금은 컴파일 과정만 진행중입니다. >
Run scriper! // 소스 목록 display 입니다.
[source list begin]
[0000] struct one1 begin
[0001] int A,B,C
[0002] str D,E
[0003] num F,G
[0004] end
[0005] program main begin
[0006] one1.A = 100
[0007] one1.B = 2
[0008] one1.C = one1.A + one1.B
[0009] exec notepad.exe
[0010] put '$1+$2=$3',one1.A,one1.B,one1.C
[0011] end
[source list end]
// 1 단계 변수 및 구조체 파싱 - 현제는 구조체만 합니다.
VAR_TY_NONE: <struct>
<BEGIN STRUCT>
[sStructName:one1][tag:begin]
-var-: <int>[A][B][C]-var-: <str>[D][E]-var-: <num>[F][G]<END STRUCT>// 2단계 프로그램 파싱
CREATE program![end]
VAR_TY_NONE: <program>
<BEGIN PROGRAM>
[sStructName:main][tag:begin]
-prg-: <one1.A>
CREATE program![one1.A]
[=][100]
-prg-: <one1.B>
CREATE program![one1.B]
[=][2]
-prg-: <one1.C>
CREATE program![one1.C]
[=][one1.A][+][one1.B]
-prg-: <exec>
CREATE program![exec]
[notepad.exe]
-prg-: <put>
CREATE program![put]
[$1+$2=$3][one1.A][one1.B][one1.C]
<END PROGRAM>
CREATE program![end]// 3단계 디버깅을 위해 파싱한 구조체와 프로그램 소스 목록을 출력합니다.
[struct] top address:00 name:one1 [sub cnt:7]
[vars] memory address:[00][00] name:A [type:10]
[vars] memory address:[00][01] name:B [type:10]
[vars] memory address:[00][02] name:C [type:10]
[vars] memory address:[00][03] name:D [type:20]
[vars] memory address:[00][04] name:E [type:20]
[vars] memory address:[00][05] name:F [type:11]
[vars] memory address:[00][06] name:G [type:11]
program_cnt=7
[program] top address:00 name:end [sub cnt:0]
[program] top address:01 name:one1.A [sub cnt:2]
[x][y] memory address:[01][00] name:= [type:-25]
[x][y] memory address:[01][01] name:100 [type:-25]
[program] top address:02 name:one1.B [sub cnt:2]
[x][y] memory address:[02][00] name:= [type:-25]
[x][y] memory address:[02][01] name:2 [type:-25]
[program] top address:03 name:one1.C [sub cnt:4]
[x][y] memory address:[03][00] name:= [type:-25]
[x][y] memory address:[03][01] name:one1.A [type:-25]
[x][y] memory address:[03][02] name:+ [type:-25]
[x][y] memory address:[03][03] name:one1.B [type:-25]
[program] top address:04 name:exec [sub cnt:1]
[x][y] memory address:[04][00] name:notepad.exe [type:101]
[program] top address:05 name:put [sub cnt:4]
[x][y] memory address:[05][00] name:$1+$2=$3 [type:102]
[x][y] memory address:[05][01] name:one1.A [type:102]
[x][y] memory address:[05][02] name:one1.B [type:102]
[x][y] memory address:[05][03] name:one1.C [type:102]
[program] top address:06 name:end [sub cnt:0]// 여기까지 입니다. 다음과정은 실행을 대비해 침조 변수를 실제 주소화 하는 것입니다. // ( 이단계는 조금 복잡합니다.)
댓글 없음:
댓글 쓰기