Python写个Basic解析器(1)代码扫描。

# Copyright (C) 2012 xxx Technology (xx) Co., LTD.
# All rights reserved.
#
# Developed by RD BIOS Team.
#
# Authors: perry 
  
  
   
   

class BasicReader(BaseReader):
  def read(self):
    while self._getc():
      text = ''
      if self._equc(" \t\v\0\r"):
        continue
      elif self._equc("'"):
        res = False
        while self._getc():
          if self._char == '\n':
            res = True
            break
        if res:
          if not self._ungetc():
            break
          continue
        break
      elif self._equc('\n'):
        self._newline = True
        return self._set(BSCTK_ENDL, '__end_of_line__', 0)
      elif self._equc(basic_identifier_start):
        self.pos = self._pos
        while self._equc(basic_identifier):
          text += self._char
          if not self._getc():
            break
        if not self._ungetc():
          break
        text = text.upper()
        if basic_keywords.count(text):
          return self._set(BSCTK_KEYWORD, text, basic_keywords.index(text))
        return self._set(BSCTK_IDENT, text, 0)
      elif self._equc(string.digits):
        self.pos = self._pos
        while self._equc('.' + string.digits):
          text += self._char
          if not self._getc():
            break
        '''
        if not self._equc(basic_operators):
          if not self._equc(' \t\v\r\n\''):
            self._ungetc()
            return self._set(BSCTK_ERROR, 'Illegal character', self._char)
        '''
        if not self._ungetc():
          break
        res = text.count('.')
        if res == 0:
          return self._set(BSCTK_INTEGER, 'int', int(text))
        elif res == 1:
          return self._set(BSCTK_FLOAT, 'float', float(text))
        else:
          return self._set(BSCTK_ERROR, 'Invalid float', text)
      elif self._equc('&'):
        self.pos = self._pos
        if not self._getc():
          return self._set(BSCTK_ERROR, 'Invalid operator', self._char)
        if self._char.upper() != 'H':
          self._ungetc()
          return self._set(BSCTK_OPERATOR, 'operator', basic_operators.index('&'))
        while self._getc():
          if not self._equc(string.hexdigits):
            break
          text += self._char
        '''
        if not self._equc(basic_operators):
          if not self._equc(' \t\v\r\n' + string.hexdigits):
            self._ungetc()
            return self._set(BSCTK_ERROR, 'Illegal character', self._char)
        '''
        if not self._ungetc():
          break
        if text == '':
          return self._set(BSCTK_ERROR, 'Invalid hexdigits', '&H')
        return self._set(BSCTK_INTEGER, 'int', int(text.upper(), 0x10))
      elif self._equc('"'):
        self.pos = self._pos
        while self._getc():
          if self._equc('"\n'):
            break
          text += self._char
        # If the last char isn't a double quotes then indicates it's not end.
        if self._char != '"':
          return self._set(BSCTK_ERROR, 'Invalid string', text)
        return self._set(BSCTK_STRING, 'string', text)
      else:
        res = False
        self.pos = self._pos
        for a in basic_operators:
          if a.startswith(self._char):
            res = True
            break
        if res:
          text = self._char
          while self._getc():
            text += self._char
            res = False
            for a in basic_operators:
              if a.startswith(text):
                res = True
                break
            if not res:
              break
          self._ungetc()
          return self._set(BSCTK_OPERATOR, 'operator', basic_operators.index(text[:-1]))
        self._ungetc()
        return self._set(BSCTK_ERROR, 'unknow', text)
    return self._set(BSCTK_ENDF, '__end_of_file__', 0)

if __name__ == "__main__":
  reader = BasicReader('alex2.bas')

  while reader.next():
    print('%03d:%02d 0x%02X %018s  %s' % (reader.line, reader.pos, reader.type, reader.name, reader.value))
    if reader.type == BSCTK_ERROR:
      break


  
  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值