Very Tiny Language 2

otsubo2019/03/26(火) - 10:39 に投稿

Very Tiny Language

VTL(Very Tiny Language)の作成

Return of Very Tiny Language

VTL-2

A study of VTL

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/

http://www.lsigame.com/

マイコンとか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')