1̃eLXĝ݂ō\\[XR[h
\CCNB
I^Bϐ̌^͑ꂽlɂČ肳BAϐ̐錾͕KvƂB
^́Al^(10i^)A^^(trueAfalse)A^Anull^T|[gB
֐T|[gB߂lԂǂ͊֐̎RB߂lԂȂꍇAnulllԂB
(if)A[v(for, foreach, while)T|[gB

vO         ::= (֐ | )* EOF
֐               ::= "function" ֐ "(" ( ("," )*)? ")" ubN
ubN         ::= "{" * "}"
[vubN   ::= "{" ( | break)* "}"
                 ::=  ";"  | ϐ錾 |  | for[v | while[v | foreach[v | return
           ::= "if" "("  ")" ubN
		             ("else" "if" "("  ")" ubN)*
		             ("else" ubN)?
for[v          ::= "for" "(" ()? ";" ()? ";" ()? ")" [vubN
while[v        ::= "while" "("  ")" [vubN
foreach[v      ::= "foreach" "(" ϐ "in"  ")" [vubN
return           ::= "return" ? ";"
break            ::= "break" ";"
ϐ錾           ::= "var" ϐ ("=" )? ("," ϐ ("=" )?)* ";"
                 ::= 
             ::= (ϐ "=")?  | r
r           ::= r (("==" | "!=") r)?
r             ::=  (("<" | "<=" | ">" | ">=") r)?
             ::= ("+" | "-")? 揜 (("+" | "-") )?
揜             ::=  (("*" | "/") 揜)?
                 ::= l |  | ϐ | n֐Ăяo | ֐Ăяo | "("  ")" | null | true | false
֐Ăяo       ::= ֐ "(" ( ("," )*)? ")"
n֐Ăяo ::= "native" ֐ "(" (  ("," )*)? ")"
֐             ::= ʎq
           ::= ʎq
ϐ             ::= ʎq
ʎq             ::= [a-zA-Z_][a-zA-Z0-9_]*
l               ::= [0-9]+(\.[0-9]+)?
             ::= "\"" Cӂ̕* "\""
                       A\", \n, \r, \t͓ʂɏB
                       񒆂ŉssĂǂB



JavảZqD揇
 . [] ()
	++ -- ! ~
	new (LXg)
	* / %
	+ -
	<< >> >>>
	> >= < <= instanceof
	== !=
	& ^ |
	&& ||
	?:
Ⴂ = += -= *= /= %= &= ^= |= <<= >>= >>>=



TODO SɃX^bN}VB
TODO gݍ݊֐̎B
TODO \[XR[h̎B
TODO SẲZq̎B
TODO forł̕ϐ錾̎B
TODO z̎B
TODO g[Ñ\[XR[hʒu̕ێBG[Ƀ\[XR[hʒuX^bNg[Xo͂ł悤ɁB
TODO NX̎B
TODO	 \bh̎B
TODO	 NXϐ̎B
TODO	 vpeB̎B
TODO	 p̎B
TODO	 C^[tFCX̎B
TODO ̊SȎB
TODO ϐ⎯ʎq̊SȔB
TODO ^CENX̎B
TODO O̎B



RpC̓B
1.Ƃ肠֐񋓂A`ς݂ƂċLB
2.֐쐬B
3.O[o쐬B



ϐǗ̎dlB
O[oϐƃ[JϐB
O[oAyу[Jϐ͊֐XR[vƃubNEXR[vŃXR[vǗB
ŏ̊֐XR[vO[oϐAŌ̊֐XR[ṽ݂[JϐǗB
ϐ錾̎dlB
	[JϐŊɒ`Ă邩B
		`ĂG[B
ϐ擾̎dlB
	[JϐŊɒ`Ă邩B
		`Ă炻ԂB
	O[oϐŊɒ`Ă邩B
		`Ă炻ԂB
	`ĂȂ΃G[B
ϐ̒`mFB
	[JϐŊɒ`Ă邩B
		`ĂTrueB
	O[oϐŊɒ`Ă邩B
		`ĂTrueB
	`ĂȂFalseB



sR[hEt@C̎dlB
	eLXgŋLqB1s1߁B
	
	+----------------+----+----------------------------------------------------+
	|֐`        |s|vOER[h                                  |
	+----------------+----+----------------------------------------------------+
	֐`c֐̖OA̐AvOER[h̊JnAhX`BCuƂēǂݍ񂾂Ƃ̂߂ɕKv(vO1{݂̂ȂΕKv)B
	vOER[hcŏ̓O[oER[hAɊ֐R[hLqB
	
	֐`̎dl
		(֐),(̐),(JnAhX)
		) main,1,123
	
	vOER[h
		(),(p[^)*n
		) push value,number|123.456
		
		ȉ̑菇́AVMR[h𔻒f邽߂ɁAu1.R[hǂݍ݁A߂𔻒fB2.programCounterWX^+1BvɍsĂOƂB
		
		push value,(l)
			vZX^bNɒlǉBȍ~ȂuvbVvƌĂԁB
			
			菇
			1) R[hǂݍ݁AvZX^bNstackTopAddressWX^̃AhXɊi[B
			2) stackTopAddressWX^+1B
			3) programCounterWX^+1B
		
		push local variable,(ϐAhX)
		push global variable,(ϐAhX)
			ϐɊi[ĂlvbVB
			
			菇
			1) vZX^bNstackTopAddressWX^̃AhXɁA(ϐAhX)̒li[B
			2) stackTopAddressWX^+1B
			3) programCounterWX^+1B
		
		push register,(WX^)
			WX^̒lvbVBlnumber^ɂȂB
			
			菇
			1) vZX^bNstackTopAddressWX^̃AhXɁA(WX^)̒lnumber^ƂĊi[B
			2) stackTopAddressWX^+1B
			3) programCounterWX^+1B
		
		pop local variable,(ϐAhX)
		pop global variable,(ϐAhX)
			vZX^bN擪̒l擾AvZX^bN[AhX-1B̑u|bvvƌĂԁB
			|bvA[JϐA܂̓O[oϐɒli[B
			
			菇
			1) vZX^bNstackTopAddressWX^̃AhXɊi[ĂlA(ϐAhX)Ɋi[B
			2) stackTopAddressWX^-1B
			3) programCounterWX^+1B
		
		pop register,(WX^)
			|bvAWX^ɒli[B
			
			菇
			0-1) vZX^bNstackTopAddressWX^̃AhXɊi[Ălnumber^ł͂ȂꍇAsOƂB
			1) vZX^bNstackTopAddressWX^̃AhXɊi[ĂlA(WX^)Ɋi[B
			2) stackTopAddressWX^-1B
			3) programCounterWX^+1B
		
		pop
			|bv邾ŁAl͔jB
			
			菇
			1) stackTopAddressWX^-1B
			2) programCounterWX^+1B
		
		create frame,(ϐ̈̒),(̐),(AhX)
			V֐t[쐬AssړB
			
			菇
			TODO
		
		delete frame
			݂̊֐t[폜Assɖ߂B
			
			菇
			TODO
		
		goto,(AhX)
			PɃvOEJE^ړB
			
			菇
			1) programCounterWX^(AhX)i[B
		
		if,(AhX)
			vZX^bNl|bvA^̏ꍇ͏pAȔꍇ͎ssړB
			
			菇
			0-1) vZX^bNstackTopAddressWX^̃AhX̒lbool^ł͂ȂꍇAsOƂB
			1) vZX^bNstackTopAddressWX^̃AhX̒lbool|truȅꍇAprogramCounterWX^+1B
			   vZX^bNstackTopAddressWX^̃AhX̒lbool|falsȅꍇAprogramCounterWX^(AhX)i[B
			2) stackTopAddressWX^-1B
		
		call native function,(֐),(̐)
			gݍ݊֐ĂяoB߂l͌vZX^bNփvbVB
			
			菇
			TODO
		
		exit
			vO̎sIB̂Ƃ̌vZX^bN̐擪AvȌIR[hƂȂBAlȊȌꍇ1ƂȂB
			̃R[hsȂƏIȂB̂܂܂Ɗ֐R[hēǂݍŎsĂ܂ꂪB
			
			菇
			1) vZX^bNstackTopAddressWX^̃AhX̒lnumber^ł͂ȂꍇA|bvAnumber|1vbVB
			2) z}V̎s~B
		
		add
			vZX^bNl2|bvẢZʂvZX^bNփvbVB
			
			菇
			1) vZX^bNstackTopAddressWX^̃AhX-1̒lAoperand1WX^֊i[B
			2) vZX^bNstackTopAddressWX^̃AhX̒lAoperand2WX^֊i[B
			3) stackTopAddressWX^-1B
			4) programCounterWX^+1B
		
		subtract
			vZX^bNl2|bvǍZʂvZX^bNփvbVB
			
			菇
			1) vZX^bNstackTopAddressWX^̃AhX-1̒lAoperand1WX^֊i[B
			2) vZX^bNstackTopAddressWX^̃AhX̒lAoperand2WX^֊i[B
			3) stackTopAddressWX^-1B
			3) operand1WX^operand2WX^ZAʂvZX^bNstackTopAddressWX^̃AhXɊi[B
		
		multiple
			vZX^bNl2|bvȀZʂvZX^bNփvbVB
			
			菇
			1) vZX^bNstackTopAddressWX^̃AhX-1̒lAoperand1WX^֊i[B
			2) vZX^bNstackTopAddressWX^̃AhX̒lAoperand2WX^֊i[B
			3) stackTopAddressWX^-1B
			3) operand1WX^operand2WX^ZAʂvZX^bNstackTopAddressWX^̃AhXɊi[B
		
		divide
			vZX^bNl2|bvȀZʂvZX^bNփvbVB
			
			菇
			1) vZX^bNstackTopAddressWX^̃AhX-1̒lAoperand1WX^֊i[B
			2) vZX^bNstackTopAddressWX^̃AhX̒lAoperand2WX^֊i[B
			3) stackTopAddressWX^-1B
			3) operand1WX^operand2WX^ZAʂvZX^bNstackTopAddressWX^̃AhXɊi[B
		
		equals
			vZX^bNl2|bvȀZʂvZX^bNփvbVB
			
			菇
			1) vZX^bNstackTopAddressWX^̃AhX-1̒lAoperand1WX^֊i[B
			2) vZX^bNstackTopAddressWX^̃AhX̒lAoperand2WX^֊i[B
			3) stackTopAddressWX^-1B
			3) operand1WX^operand2WX^ZAʂvZX^bNstackTopAddressWX^̃AhXɊi[B
		
		not
			vZX^bNl1|bvAےlvZX^bNփvbVB
			
			菇
			1) vZX^bNstackTopAddressWX^̃AhX̒lAoperand1WX^֊i[B
			1-1) operand1WX^bool^ł͂ȂꍇAsG[ƂB
			2) operand1WX^̋t̒l(true->falseAfalse->true)vZX^bNstackTopAddressWX^̃AhXɊi[B
		
		greater than
			vZX^bN|bvoperand2WX^֊i[AvZX^bN|bvoperand1WX^֊i[Aoperand1WX^operand2WX^rāAoperand1 > operand2łbool^truelvZX^bNփvbVAłȂbool^falselvZX^bNփvbVB
		
		less than
			vZX^bN|bvoperand2WX^֊i[AvZX^bN|bvoperand1WX^֊i[Aoperand1WX^operand2WX^rāAoperand1 < operand2łbool^truelvZX^bNփvbVAłȂbool^falselvZX^bNփvbVB
		
		and
			vZX^bN|bvoperand2WX^֊i[AvZX^bN|bvoperand1WX^֊i[Aoperand1WX^operand2WX^rāAƂbool^̓lłbool^truevZX^bNփvbVAłȂbool^falselvZX^bNփvbVB
		
		or
			vZX^bN|bvoperand2WX^֊i[AvZX^bN|bvoperand1WX^֊i[Aoperand1WX^operand2WX^rāAǂ炩bool^truełbool^truevZX^bNփvbVAǂbool^falsełbool^falselvZX^bNփvbVB



z}Vdl
	VBScriptœAȂoM[ȉz}VB
	
	WX^dl
		WX^̓Ƃ͕ʕȂ̂ŁAčlB
		X^bNE}VȂ̂ŁAWX^͏ȂB̓Iɂ́Aȉ̃WX^gpB
		EprogramCountercvOEJE^B
		EstackStartAddresscX^bNE̊JnAhXB
		EstackTopAddresscX^bNE̐[AhXB
		EframeStartAddressct[̊JnAhXB
		EvariableLengthcϐ̈̑傫(vZX^bN̊JnAhX)B
		Eoperand1cvZ1B
		Eoperand2cvZ2B
	
	dl
		VBScriptœ߁AvZJE^̂߂ɕϐmۂȂ邪Aʓ|ǃ}Ṽ͕킵Ă݂BłȂoM[ǁB
		
		́AvOER[hAX^bNEō\BTv͉}QƁB
		+------------------------------+------------------------------------------+
		|vOER[h            |X^bNE                          |
		+------------------------------+------------------------------------------+
		IɂVariant̔zƂĕ\BlłłIuWFNgłA̔zɊi[B̂߁Aq[vE݂ȂB
		z1vfAł1ubNƌĂԁB
		źAvOs̏ɌŒ蒷ŊmۂĂ܂B܂AvOER[hAX^bNE͌Œ蒷Ŋ蓖ĂB
		vOER[hc1{̃vOȂ΂̃R[hmۂΗǂACu𓮓IɓǂݍނƂlāAŒ蒷傫mۂB
		X^bNEc1{̃vOȂubN\邱Ƃ\ACu𓮓IɓǂݍނƂlāAŒ蒷ő傫mۂB
		
		vOER[hdl
			[vOER[hɊi[BIuWFNgER[hEt@Cǂݍ񂾕𕪉āA1vf1ubNŊi[B
		
		X^bNEdl
			ꁨ                                                                                                        [
			+----------------------------------+--------------------------+------------------------+-------------------------+
			|O[oEt[              |֐t[              |֐t[            |󂫗̈                 |
			+----------------------------------+--------------------------+------------------------+-------------------------+
			O[oEt[*1A֐t[*nō\B
			IɂVariant̔zBlłłIuWFNgłA̔zɊi[B̂߁Aq[vE݂ȂB
			z1vfAł1ubNƌĂԁB
			
			O[oEt[
			+------------------+--------------------------------------------------------------------------------+
			|O[oϐ̈|vZX^bN (߂AhX) (t[JnAhX) (ϐ̈̑傫) (*n)|
			+------------------+--------------------------------------------------------------------------------+
			O[oϐ̈cŒ蒷ubNB1{̃vOȂ\\ACu֘AƗ\łȂB
			vZX^bNcϒubNBϒƂAE܂ŎgpłAƂӖB֐ĂяoÃubN炪֐t[ɂȂ邩B
				֐ĂяoƂAvZX^bN̐[ɁA߂AhXAt[JnAhXAϐ̈̑傫A*ni[B*n͌Ăѐ̊֐ɂĂɃ|bvBO[oEt[Ȃ̂Ńt[JnAhX͏0AŖ߂ƂɃO[oEt[ł邱ƂB
			
			֐t[
			+----------------+--------------------------------------------------------------------------------+
			|[Jϐ̈|vZX^bN (߂AhX) (t[JnAhX) (ϐ̈̑傫) (*n)|
			+----------------+--------------------------------------------------------------------------------+
			[Jϐ̈cŒ蒷ubNB֐͂̊֐ŊĂ̂ŁAǂ̒x̃[Jϐ̈悪KvsOɎZołB̂߁AŒ蒷B
			vZX^bNcϒubNBO[oEt[ƓRB
			
			l̕\
			(^)|(l)
			) string|͂[[ǁB
			    number|123.456
			    bool|true











































) ϐ錾AvZ
	\[XR[h
		var x = 1;
		var y = x * 2 + 1;
		native print(y);
		return 0;
	
	IuWFNgER[h
			
		1	push value,number|1                  # var x = 1;
		2	pop gloabl variable,1
		3	push global variable,1         # var y = x * 2 + 1;
		4	push value,number|2
		5	multiple
		6	push value,number|1
		7	add
		8	pop global variable,2
		9	push global variable,2         # native print(y);
		10	call native function,print,1
		11	pop
		12	push value,number|0                  # return 0;
		13	exit











) if
	\[XR[h
		var x = 1;
		if (x > 0) {
			native print("x0傫B");
		} else if (x < 0) {
			native print("x0菬B");
		} else {
			native print("x0B");
		}
	
	xtIuWFNgER[h
			
		1	push value,number|1               # var x = 1;
		2	pop global variable,1
		3	push global variable,1       # if (x > 0) {
		4	push value,number|0
		5	greater than
		6	if,label1
		7	push value,string|x0傫B      # native print("x0傫B");
		8	call native function,print,1
		9	pop
		10	goto,label2
		11	label1
		11	push global variable,1     # } else if (x < 0) {
		12	push value,number|0
		13	less than
		14	if,label3
		15	push value,string|x0菬B     # native print("x0菬B");
		16	call native function,print,1
		17	pop
		18	goto,label2
		19	label3                        # } else {
		19	push value,string|x0B
		20	call native function,print,1
		21	pop
		22	label2                         # }
		22	push value,number|0
		23	exit
	
	IuWFNgER[h
			
		1	push,number,1                # var x = 1;
		2	pop-g,1                      # if (x > 0) {
		3	push,global variable,1
		4	push,number,0
		5	greater than
		6	if,11
		7	push,string,x0傫B     # native print("x0傫B");
		8	call native function,print,1
		9	pop
		10	goto,22
		11	push,global variable,1     # } else if (x < 0) {
		12	push,number,0
		13	less than
		14	if,19
		15	push,string,x0菬B     # native print("x0菬B");
		16	call native function,print,1
		17	pop
		18	goto,22
			                            # } else {
		19	push,string,x0B          # native print("x0B");
		20	call native function,print,1
		21	pop
			                        # }
		22	push,number,0
		23	exit






)
	\[XR[h
		function add(a, b) {
			return a + b;
		}
		
		add(1, 2);
	
	IuWFNgER[h
			add,2,11
			
		1	set,variableLength,256
		2	push,number,8                      ߂AhX
		3	push,register,frameStartAddress    t[JnAhX
		4	push,register,variableLength       ϐ̈̑傫
		5	push,number,1
		6	push,number,2
		7	goto,11                         add֐̌Ăяo
		8	pop
		9	push,number,0
		10	exit
		11	set,variableLength,2     add֐
		12	set,frameStartAddress,stackTopAddress
		13	pop,local variable,2
		14	pop,local variable,1
		15	push,local variable,1
		16	push,local variable,2
		17	add
		18	pop register,operand1
		19	pop register,variableLength
		20	pop register,frameStartAddress
		21	return
