4 attr_reader :scanner, :execution_stack
7 @scanner = Scanner.new(args)
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
18 # Exit and highlight any malformed tokens
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])
25 raise "Malformed token(s) found while parsing -S input #{@scanner.arguments.join}"
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])
34 raise "Parse errors found while parsing -S input #{ @scanner.arguments.join}"
37 def exit_with_paren_errors
38 @paren_errors.each do |i|
39 @scanner.arguments[i] = Util.colorize(:red, @scanner.arguments[i])
41 raise "Missing parenthesis found while parsing -S input #{@scanner.arguments.join}"
44 # Parse the input string, one token at a time a contruct the call stack
46 pre_index = @scanner.token_index
47 p_token,p_token_value = nil
48 c_token,c_token_value = @scanner.get_token
51 while (c_token != nil)
52 @scanner.token_index += 1
53 n_token, n_token_value = @scanner.get_token
58 @token_errors << c_token_value
61 unless (n_token =~ /not|fstatement|statement|\(/) || (scanner.token_index == scanner.arguments.size) && !(n_token == nil)
62 @parse_errors << [pre_index, scanner.token_index]
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]
72 unless (n_token =~ /not|fstatement|statement|\(/) || (scanner.token_index == scanner.arguments.size) && !(n_token == nil)
73 @parse_errors << [pre_index, scanner.token_index]
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]
83 unless n_token =~ /fstatement|statement|\(|not/ && !(n_token == nil)
84 @parse_errors << [pre_index, scanner.token_index]
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]
95 unless (n_token =~ /|and|or|not|\(/)
96 unless(scanner.token_index == scanner.arguments.size)
97 @parse_errors << [pre_index, scanner.token_index]
100 unless @paren_errors.empty?
103 @paren_errors.push((n_token.nil?) ? scanner.token_index - 1: scanner.token_index - n_token_value.size)
107 unless n_token =~ /fstatement|statement|not|\(/
108 @parse_errors << [pre_index, scanner.token_index]
110 @paren_errors.push((n_token.nil?) ? scanner.token_index - 1: scanner.token_index - n_token_value.size)
113 @parse_errors << [pre_index, scanner.token_index]
116 unless n_token == " " ||c_token == "bad_token"
117 @execution_stack << {c_token => c_token_value}
120 p_token, p_token_value = c_token, c_token_value
121 c_token, c_token_value = n_token, n_token_value
123 pre_index = @scanner.token_index