Esempio n. 1
0
def value_from_scanner(s: Scanner) -> Value:
  """Recursive call for converting a stream of tokens into a value."""
  if s.try_pop(TokenKind.OPAREN):
    elements = []
    must_end = False
    while True:
      if s.try_pop(TokenKind.CPAREN):
        break
      if must_end:
        s.pop_or_error(TokenKind.CPAREN)
        break
      elements.append(value_from_scanner(s))
      must_end = not s.try_pop(TokenKind.COMMA)
    return Value.make_tuple(tuple(elements))

  if s.try_pop(TokenKind.OBRACK):
    elements = []
    must_end = False
    while True:
      if s.try_pop(TokenKind.CBRACK):
        break
      if must_end:
        s.pop_or_error(TokenKind.CBRACK)
        break
      elements.append(value_from_scanner(s))
      must_end = not s.try_pop(TokenKind.COMMA)
    return Value.make_array(tuple(elements))

  if s.try_pop_keyword(Keyword.BITS) or s.try_pop_keyword(Keyword.UN):
    return _bit_value_from_scanner(s, signed=False)
  if s.try_pop_keyword(Keyword.BITS) or s.try_pop_keyword(Keyword.SN):
    return _bit_value_from_scanner(s, signed=True)

  if s.peek().is_type_keyword():
    type_ = s.pop()
    s.drop_or_error(TokenKind.COLON)
    value_tok = s.pop_or_error(TokenKind.NUMBER)
    signedness, bit_count = scanner_mod.TYPE_KEYWORDS_TO_SIGNEDNESS_AND_BITS[
        type_.value]
    constructor = Value.make_sbits if signedness else Value.make_ubits
    return constructor(
        bit_count=bit_count,
        value=ast_helpers.get_token_value_as_int(value_tok))

  raise ScanError(s.peek().span.start,
                  'Unexpected token in value; found {}'.format(s.peek().kind))
Esempio n. 2
0
def _bit_value_from_scanner(s: Scanner, signed: bool) -> Value:
  s.drop_or_error(TokenKind.OBRACK)
  bit_count_tok = s.pop_or_error(TokenKind.NUMBER)
  s.drop_or_error(TokenKind.CBRACK)
  s.drop_or_error(TokenKind.COLON)
  value_tok = s.pop_or_error(TokenKind.NUMBER)
  constructor = Value.make_sbits if signed else Value.make_ubits
  return constructor(
      bit_count=ast_helpers.get_token_value_as_int(bit_count_tok),
      value=ast_helpers.get_token_value_as_int(value_tok))