Very Tiny Language
http://middleriver.chagasi.com/electronics/vtl.html
http://www.mztn.org/index.html
http://luckleo.cocolog-nifty.com/pockecom/VX-4/HTML/vx-4_jp.html
http://www.geocities.jp/hd61700lab/
マイコンとかTinyBasicとかStarTrekゲームとかVTL
★VTL(Very Tiny Language)を理解するためBNFを定義してソース自動生成してみた
| Python source |
|---|
#!/usr/bin/python import random import re VERB = False
BNF = {
'<SRC>' : ('<LINES>',),
'<LINES>' : ('<LINE>', '<LINE>_NL_<LINES>'),
'<LINE>' : ("<LINE_NUMBER> <STMT>",),
'<STMT>' : ('<ASSIGN>', '<OUTPUT>', '<INPUT>'),
'<ASSIGN>' : ('<VAR>=<EXP>','<ARRAY>=<EXP>'),
'<INPUT>' : ('<VAR>=?','<ARRAY>=?'),
'<OUTPUT>' : ('?=<EXP>', '?=<EXP>;', # ; means no LF
'$=<EXP>', '$=<EXP>;'), # $ means putchar(ch)
'<EXP>' : ('<PRIM_EXP><OP><EXP>', '<PRIM_EXP>'),
'<PRIM_EXP>' : ('<VAR>', '<ARRAY>', '<NUMBER>', '<STRING>', '(<EXP>)'),
'<VAR>' : ('<USER_VAR>', '<SYS_VAR>'),
'<ARRAY>' : (':<VAR>)',),
'<OP>' : ('*', '/', '+', '-', '>', '<', '=') ,
'<NUMBER>' : ('1', '2', '3', '4', '5'),
'<LINE_NUMBER>' : ('100', '200', '300', '400', '500'),
'<STRING>' : ('"hello"', '"bye"', '""'),
'<USER_VAR>' : ('A', 'B', 'Z', 'a', 'z'),
'<SYS_VAR>' : ('%', '$', '#'),
}
def gen_vtl_src():
src = '<SRC>'
matched = True
while(matched):
if VERB:
print "-------------------"
print "SRC:",src
print "-------------------"
matched = re.match(".*(<[A-z0-9]*>).*",src)
if matched:
lavel = matched.group(1)
value = get_next(lavel)
src = src.replace(lavel,value,1) # specify replace only once
if VERB:
print "{:s} -> {:s} : {:s}".format(lavel,value,src)
return src
def get_next(lavel):
next = BNF[lavel]
if len(next) == 1:
return next[0]
else:
return next[int(random.random()*len(next))]
for x in range(100):
src = gen_vtl_src()
print "---------------------"
print src.replace('_SP_','\n')
|