2018년 6월 18일 월요일

[한이터백승기] AI준비단계 - 컴파일 단계 준비(3)

이번진행은 프로그램 코드까지 파싱하는 것 까지 진행하고 있습니다.
컴파일단계에서 남은 과제는  계산식과 커멘드가 참조하는 각변수들을프로그램 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]
// 여기까지 입니다.  다음과정은 실행을 대비해 침조 변수를 실제 주소화 하는 것입니다. // ( 이단계는 조금 복잡합니다.)

댓글 없음:

댓글 쓰기