class MCollective::Matcher::Parser
Attributes
execution_stack[R]
scanner[R]
Public Class Methods
new(args)
click to toggle source
# File lib/mcollective/matcher/parser.rb 6 def initialize(args) 7 @scanner = Scanner.new(args) 8 @execution_stack = [] 9 @parse_errors = [] 10 @token_errors = [] 11 @paren_errors = [] 12 parse 13 exit_with_token_errors if @token_errors.size > 0 14 exit_with_parse_errors if @parse_errors.size > 0 15 exit_with_paren_errors if @paren_errors.size > 0 16 end
Public Instance Methods
exit_with_paren_errors()
click to toggle source
# File lib/mcollective/matcher/parser.rb 37 def exit_with_paren_errors 38 @paren_errors.each do |i| 39 @scanner.arguments[i] = Util.colorize(:red, @scanner.arguments[i]) 40 end 41 raise "Missing parenthesis found while parsing -S input #{@scanner.arguments.join}" 42 end
exit_with_parse_errors()
click to toggle source
# File lib/mcollective/matcher/parser.rb 28 def exit_with_parse_errors 29 @parse_errors.each do |error_range| 30 (error_range[0]..error_range[1]).each do |i| 31 @scanner.arguments[i] = Util.colorize(:red, @scanner.arguments[i]) 32 end 33 end 34 raise "Parse errors found while parsing -S input #{ @scanner.arguments.join}" 35 end
exit_with_token_errors()
click to toggle source
Exit and highlight any malformed tokens
# File lib/mcollective/matcher/parser.rb 19 def exit_with_token_errors 20 @token_errors.each do |error_range| 21 (error_range[0]..error_range[1]).each do |i| 22 @scanner.arguments[i] = Util.colorize(:red, @scanner.arguments[i]) 23 end 24 end 25 raise "Malformed token(s) found while parsing -S input #{@scanner.arguments.join}" 26 end
parse()
click to toggle source
Parse the input string, one token at a time a contruct the call stack
# File lib/mcollective/matcher/parser.rb 45 def parse 46 pre_index = @scanner.token_index 47 p_token,p_token_value = nil 48 c_token,c_token_value = @scanner.get_token 49 parenth = 0 50 51 while (c_token != nil) 52 @scanner.token_index += 1 53 n_token, n_token_value = @scanner.get_token 54 55 unless n_token == " " 56 case c_token 57 when "bad_token" 58 @token_errors << c_token_value 59 60 when "and" 61 unless (n_token =~ /not|fstatement|statement|\(/) || (scanner.token_index == scanner.arguments.size) && !(n_token == nil) 62 @parse_errors << [pre_index, scanner.token_index] 63 end 64 65 if p_token == nil 66 @parse_errors << [pre_index - c_token.size, scanner.token_index] 67 elsif (p_token == "and" || p_token == "or") 68 @parse_errors << [pre_index - 1 - p_token.size, pre_index - 1] 69 end 70 71 when "or" 72 unless (n_token =~ /not|fstatement|statement|\(/) || (scanner.token_index == scanner.arguments.size) && !(n_token == nil) 73 @parse_errors << [pre_index, scanner.token_index] 74 end 75 76 if p_token == nil 77 @parse_errors << [pre_index - c_token.size, scanner.token_index] 78 elsif (p_token == "and" || p_token == "or") 79 @parse_errors << [pre_index - 1 - p_token.size, pre_index - 1] 80 end 81 82 when "not" 83 unless n_token =~ /fstatement|statement|\(|not/ && !(n_token == nil) 84 @parse_errors << [pre_index, scanner.token_index] 85 end 86 87 when "statement","fstatement" 88 unless n_token =~ /and|or|\)/ 89 unless scanner.token_index == scanner.arguments.size 90 @parse_errors << [pre_index, scanner.token_index] 91 end 92 end 93 94 when ")" 95 unless (n_token =~ /|and|or|not|\(/) 96 unless(scanner.token_index == scanner.arguments.size) 97 @parse_errors << [pre_index, scanner.token_index] 98 end 99 end 100 unless @paren_errors.empty? 101 @paren_errors.pop 102 else 103 @paren_errors.push((n_token.nil?) ? scanner.token_index - 1: scanner.token_index - n_token_value.size) 104 end 105 106 when "(" 107 unless n_token =~ /fstatement|statement|not|\(/ 108 @parse_errors << [pre_index, scanner.token_index] 109 end 110 @paren_errors.push((n_token.nil?) ? scanner.token_index - 1: scanner.token_index - n_token_value.size) 111 112 else 113 @parse_errors << [pre_index, scanner.token_index] 114 end 115 116 unless n_token == " " ||c_token == "bad_token" 117 @execution_stack << {c_token => c_token_value} 118 end 119 120 p_token, p_token_value = c_token, c_token_value 121 c_token, c_token_value = n_token, n_token_value 122 end 123 pre_index = @scanner.token_index 124 end 125 end