class JGrep::Scanner

Attributes

arguments[RW]
token_index[RW]

Public Class Methods

new(arguments) click to toggle source
# File lib/parser/scanner.rb, line 5
def initialize(arguments)
    @token_index = 0
    @arguments = arguments
end

Public Instance Methods

get_token() click to toggle source

Scans the input string and identifies single language tokens

# File lib/parser/scanner.rb, line 11
def get_token
    if @token_index >= @arguments.size
        return nil
    end

    begin
        case @arguments.split("")[@token_index]
            when "["
                return "statement", gen_substatement

            when "]"
                return "]"

            when "("
                return "(", "("

            when ")"
                return ")", ")"

            when "n"
                if (@arguments.split("")[@token_index + 1] == "o") && (@arguments.split("")[@token_index + 2] == "t") && ((@arguments.split("")[@token_index + 3] == " ") || (@arguments.split("")[@token_index + 3] == "("))
                    @token_index += 2
                    return "not", "not"
                else
                    gen_statement
                end

            when "!"
                return "not", "not"

            when "a"
                if (@arguments.split("")[@token_index + 1] == "n") && (@arguments.split("")[@token_index + 2] == "d") && ((@arguments.split("")[@token_index + 3] == " ") || (@arguments.split("")[@token_index + 3] == "("))
                    @token_index += 2
                    return "and", "and"
                else
                    gen_statement
                end

            when "&"
                if(@arguments.split("")[@token_index +1] == "&")
                    @token_index +=1
                    return "and", "and"
                else
                    gen_statement
                end

            when "o"
                if (@arguments.split("")[@token_index + 1] == "r") && ((@arguments.split("")[@token_index + 2] == " ") || (@arguments.split("")[@token_index + 2] == "("))
                    @token_index += 1
                    return "or", "or"
                else
                    gen_statement
                end

            when "|"
                if(@arguments.split("")[@token_index +1] == "|")
                    @token_index +=1
                    return "or", "or"
                else
                    gen_statement
                end

            when "+"
                value = ""
                i = @token_index + 1

                begin
                    value +=  @arguments.split("")[i]
                    i += 1
                end until (i >= @arguments.size)  || (@arguments.split("")[i] =~ /\s|\)/)

                @token_index = i - 1
                return "+", value

            when "-"
                value = ""
                i = @token_index + 1

                begin
                    value +=  @arguments.split("")[i]
                    i += 1
                end until (i >= @arguments.size)  || (@arguments.split("")[i] =~ /\s|\)/)

                @token_index = i - 1
                return "-", value


            when " "
                return " ", " "

            else
                gen_statement
        end
    end
rescue NoMethodError => e
    raise "Error. Expression cannot be parsed."
end

Private Instance Methods

gen_statement() click to toggle source
# File lib/parser/scanner.rb, line 122
def gen_statement
    current_token_value = ""
    j = @token_index

    begin
        if (@arguments.split("")[j] == "/")
            begin
                current_token_value << @arguments.split("")[j]
                j += 1
                if @arguments.split("")[j] == "/"
                    current_token_value << "/"
                    break
                end
            end until (j >= @arguments.size) || (@arguments.split("")[j] =~ /\//)
        else
            begin
                current_token_value << @arguments.split("")[j]
                j += 1
                if @arguments.split("")[j] =~ /'|"/
                    begin
                        current_token_value << @arguments.split("")[j]
                        j +=1
                    end until (j >= @arguments.size) || (@arguments.split("")[j] =~ /'|"/)
                end
            end until (j >= @arguments.size) || (@arguments.split("")[j] =~ /\s|\)|\]/)
        end
    rescue Exception => e
        raise "Invalid token found - '#{current_token_value}'"
    end

    if current_token_value =~ /^(and|or|not|!)$/
        raise "Class name cannot be 'and', 'or', 'not'. Found '#{current_token_value}'"
    end

    @token_index += current_token_value.size - 1
    return "statement", current_token_value
end
gen_substatement() click to toggle source
# File lib/parser/scanner.rb, line 110
def gen_substatement
    @token_index += 1
    returnval = []

    while (val = get_token) != "]"
        @token_index += 1
        returnval << val unless val[0] == " "
    end

    return returnval
end