class AdLint::Cpp::StringToPPTokensLexer

Public Class Methods

new(str, tab_width = 8) click to toggle source
Calls superclass method
# File lib/adlint/cpp/lexer.rb, line 775
def initialize(str, tab_width = 8)
  super(str)
  @tab_width = tab_width
end

Private Instance Methods

create_content(str) click to toggle source
# File lib/adlint/cpp/lexer.rb, line 791
def create_content(str)
  StringContent.new(str, @tab_width)
end
create_lexer_context(str) click to toggle source
# File lib/adlint/cpp/lexer.rb, line 781
def create_lexer_context(str)
  lexer_ctxt = LexerContext.new(create_content(str))

  class << lexer_ctxt
    attr_accessor :last_symbol
  end

  lexer_ctxt
end
tokenize(lexer_ctxt) click to toggle source
# File lib/adlint/cpp/lexer.rb, line 795
def tokenize(lexer_ctxt)
  tok_ary = TokenArray.new
  until lexer_ctxt.content.empty?
    next if tokenize_pp_token(lexer_ctxt, tok_ary)

    loc = lexer_ctxt.location
    if new_line = lexer_ctxt.content.scan(/\n/)
      tok_ary.push(Token.new(:NEW_LINE, new_line, loc))
      break
    else
      lexer_ctxt.content.eat!
    end
  end
  tok_ary
end
tokenize_backslash(lexer_ctxt) click to toggle source
# File lib/adlint/cpp/lexer.rb, line 912
def tokenize_backslash(lexer_ctxt)
  loc = lexer_ctxt.location

  backslash = lexer_ctxt.content.scan(/\\/)

  if backslash
    lexer_ctxt.last_symbol = :BACKSLASH
    return Token.new(:PP_TOKEN, backslash, loc, backslash)
  end

  nil
end
tokenize_constant(lexer_ctxt) click to toggle source
# File lib/adlint/cpp/lexer.rb, line 842
def tokenize_constant(lexer_ctxt)
  loc = lexer_ctxt.location

  # NOTE: For extended bit-access operators.
  return nil if lexer_ctxt.last_symbol == :IDENTIFIER

  constant = Language::C.scan_char_constant(lexer_ctxt.content)     ||
             Language::C.scan_floating_constant(lexer_ctxt.content) ||
             Language::C.scan_integer_constant(lexer_ctxt.content)

  if constant
    lexer_ctxt.last_symbol = :CONSTANT
    return Token.new(:PP_TOKEN, constant, loc, :CONSTANT)
  end

  nil
end
tokenize_identifier(lexer_ctxt) click to toggle source
# File lib/adlint/cpp/lexer.rb, line 886
def tokenize_identifier(lexer_ctxt)
  loc = lexer_ctxt.location

  identifier = Language::C.scan_identifier(lexer_ctxt.content)

  if identifier
    lexer_ctxt.last_symbol = :IDENTIFIER
    return Token.new(:PP_TOKEN, identifier, loc, :IDENTIFIER)
  end

  nil
end
tokenize_keyword(lexer_ctxt) click to toggle source
# File lib/adlint/cpp/lexer.rb, line 828
def tokenize_keyword(lexer_ctxt)
  loc = lexer_ctxt.location

  keyword = Language::C.scan_keyword(lexer_ctxt.content) ||
            Language::Cpp.scan_keyword(lexer_ctxt.content)

  if keyword
    lexer_ctxt.last_symbol = :KEYWORD
    Token.new(:PP_TOKEN, keyword, loc, Language::C::KEYWORDS[keyword])
  else
    nil
  end
end
tokenize_null_constant(lexer_ctxt) click to toggle source
# File lib/adlint/cpp/lexer.rb, line 873
def tokenize_null_constant(lexer_ctxt)
  loc = lexer_ctxt.location

  null_constant = Language::C.scan_null_constant(lexer_ctxt.content)

  if null_constant
    lexer_ctxt.last_symbol = :NULL
    return Token.new(:PP_TOKEN, null_constant, loc, :NULL)
  end

  nil
end
tokenize_pp_token(lexer_ctxt, tok_ary) click to toggle source
# File lib/adlint/cpp/lexer.rb, line 811
def tokenize_pp_token(lexer_ctxt, tok_ary)
  pp_tok = tokenize_keyword(lexer_ctxt)        ||
           tokenize_constant(lexer_ctxt)       ||
           tokenize_string_literal(lexer_ctxt) ||
           tokenize_null_constant(lexer_ctxt)  ||
           tokenize_identifier(lexer_ctxt)     ||
           tokenize_punctuator(lexer_ctxt)     ||
           tokenize_backslash(lexer_ctxt)

  if pp_tok
    tok_ary.push(pp_tok)
    return true
  end

  false
end
tokenize_punctuator(lexer_ctxt) click to toggle source
# File lib/adlint/cpp/lexer.rb, line 899
def tokenize_punctuator(lexer_ctxt)
  loc = lexer_ctxt.location

  punctuator = Language::Cpp.scan_punctuator(lexer_ctxt.content)

  if punctuator
    lexer_ctxt.last_symbol = :PUNCTUATOR
    return Token.new(:PP_TOKEN, punctuator, loc, punctuator)
  end

  nil
end
tokenize_string_literal(lexer_ctxt) click to toggle source
# File lib/adlint/cpp/lexer.rb, line 860
def tokenize_string_literal(lexer_ctxt)
  loc = lexer_ctxt.location

  string_literal = Language::C.scan_string_literal(lexer_ctxt.content)

  if string_literal
    lexer_ctxt.last_symbol = :STRING_LITERAL
    return Token.new(:PP_TOKEN, string_literal, loc, :STRING_LITERAL)
  end

  nil
end