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') |