forked from SeleniumHQ/selenium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
build_grammar.rl
96 lines (82 loc) · 2.04 KB
/
build_grammar.rl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
class BuildFile
%%{
machine build_grammar;
variable p @p;
variable data @data;
variable eof @eof;
# I've not figured out the right place to pop the stack, so hack around it
action start_arg {
# clear the stack
while !@lhs[-1].is_a? OutputType
leave
end
puts "Starting arg" if @debug
@lhs.push ArgType.new
}
action start_arg_name {
puts "Starting arg name" if @debug
@lhs.push SymbolType.new
}
action start_array {
puts "Starting array" if @debug
@lhs.push ArrayType.new
}
action start_map {
puts "Starting map" if @debug
@lhs.push MapType.new
}
action start_map_entry {
puts "Starting map entry" if @debug
@lhs.push MapEntry.new
}
action start_string {
if @data[@p + 1].chr == ':'
puts "Starting symbol" if @debug
@lhs.push SymbolType.new
@p = @p + 1
else
puts "Starting string" if @debug
@lhs.push StringType.new
end
}
action start_type {
puts "Starting type" if @debug
# Unwind the stack until the top is another OutputType (or it's empty)
while (!@lhs.empty?)
puts "Unwinding [#{@lhs}]" + @lhs.length.to_s
leave
end
@lhs.push OutputType.new
}
action done {
while (!@lhs.empty?)
leave
end
}
action start_type_name {
puts "Starting type name" if @debug
@lhs.push NameType.new
}
action track { @lhs[-1] << @data[@p].chr }
action leaving {
leave
}
include build 'base_grammar.rl';
}%%
def parse(data)
%% write data;
@data = data
@data = @data.unpack("c*") if @data.is_a?(String)
%% write init;
begin
%% write exec;
rescue
puts show_bad_line
throw $!
end
if cs == build_grammar_error
throw show_bad_line
end
@types
end
end