Current section

86 Versions

Jump to

Compare versions

3 files changed
+9 additions
-715 deletions
  @@ -10,8 +10,8 @@
10 10 <<"lib/floki/finder.ex">>,<<"lib/floki/flat_text.ex">>,
11 11 <<"lib/floki/parser.ex">>,<<"lib/floki/selector.ex">>,
12 12 <<"lib/floki/selector_parser.ex">>,<<"lib/floki/selector_tokenizer.ex">>,
13 - <<"src/floki_selector_lexer.erl">>,<<"src/floki_selector_lexer.xrl">>,
14 - <<"mix.exs">>,<<"README.md">>,<<"LICENSE">>]}.
13 + <<"src/floki_selector_lexer.xrl">>,<<"mix.exs">>,<<"README.md">>,
14 + <<"LICENSE">>]}.
15 15 {<<"licenses">>,[<<"MIT">>]}.
16 16 {<<"links">>,
17 17 [{<<"Docs">>,<<"http://hexdocs.pm/floki">>},
  @@ -22,4 +22,4 @@
22 22 [{<<"app">>,<<"mochiweb">>},
23 23 {<<"optional">>,false},
24 24 {<<"requirement">>,<<"~> 2.12.2">>}]}]}.
25 - {<<"version">>,<<"0.4.0">>}.
25 + {<<"version">>,<<"0.4.1">>}.
  @@ -3,11 +3,13 @@ defmodule Floki.Mixfile do
3 3
4 4 def project do
5 5 [app: :floki,
6 - version: "0.4.0",
6 + version: "0.4.1",
7 + name: "Floki",
7 8 elixir: ">= 1.0.0",
8 9 package: package,
9 10 description: description,
10 - docs: [readme: "README.md"],
11 + docs: [extras: ["README.md"]],
12 + source_url: "https://github.com/philss/floki",
11 13 deps: deps]
12 14 end
13 15
  @@ -19,7 +21,7 @@ defmodule Floki.Mixfile do
19 21 [
20 22 {:mochiweb, "~> 2.12.2"},
21 23 {:earmark, "~> 0.1", only: :dev},
22 - {:ex_doc, "~> 0.6", only: :dev},
24 + {:ex_doc, "~> 0.8", only: :dev},
23 25 {:inch_ex, only: :docs}
24 26 ]
25 27 end
  @@ -36,7 +38,7 @@ defmodule Floki.Mixfile do
36 38 %{
37 39 contributors: ["Philip Sampaio Silva"],
38 40 licenses: ["MIT"],
39 - files: ["lib", "priv", "src", "mix.exs", "README*", "readme*", "LICENSE*", "license*"],
41 + files: ["lib", "priv", "src/*.xrl", "mix.exs", "README*", "readme*", "LICENSE*", "license*"],
40 42 links: %{
41 43 "GitHub" => "https://github.com/philss/floki",
42 44 "Docs" => "http://hexdocs.pm/floki"
  @@ -1,708 +0,0 @@
1 - -file("/usr/local/Cellar/erlang/18.0.2/lib/erlang/lib/parsetools-2.1/include/leexinc.hrl", 0).
2 - %% The source of this file is part of leex distribution, as such it
3 - %% has the same Copyright as the other files in the leex
4 - %% distribution. The Copyright is defined in the accompanying file
5 - %% COPYRIGHT. However, the resultant scanner generated by leex is the
6 - %% property of the creator of the scanner and is not covered by that
7 - %% Copyright.
8 -
9 - -module(floki_selector_lexer).
10 -
11 - -export([string/1,string/2,token/2,token/3,tokens/2,tokens/3]).
12 - -export([format_error/1]).
13 -
14 - %% User code. This is placed here to allow extra attributes.
15 - -file("src/floki_selector_lexer.xrl", 28).
16 -
17 - remove_quotes(Chars) ->
18 - Len = string:len(Chars),
19 - string:substr(Chars, 2, Len - 2).
20 -
21 - tail([_|T]) ->
22 - T.
23 -
24 - -file("/usr/local/Cellar/erlang/18.0.2/lib/erlang/lib/parsetools-2.1/include/leexinc.hrl", 14).
25 -
26 - format_error({illegal,S}) -> ["illegal characters ",io_lib:write_string(S)];
27 - format_error({user,S}) -> S.
28 -
29 - string(String) -> string(String, 1).
30 -
31 - string(String, Line) -> string(String, Line, String, []).
32 -
33 - %% string(InChars, Line, TokenChars, Tokens) ->
34 - %% {ok,Tokens,Line} | {error,ErrorInfo,Line}.
35 - %% Note the line number going into yystate, L0, is line of token
36 - %% start while line number returned is line of token end. We want line
37 - %% of token start.
38 -
39 - string([], L, [], Ts) -> % No partial tokens!
40 - {ok,yyrev(Ts),L};
41 - string(Ics0, L0, Tcs, Ts) ->
42 - case yystate(yystate(), Ics0, L0, 0, reject, 0) of
43 - {A,Alen,Ics1,L1} -> % Accepting end state
44 - string_cont(Ics1, L1, yyaction(A, Alen, Tcs, L0), Ts);
45 - {A,Alen,Ics1,L1,_S1} -> % Accepting transistion state
46 - string_cont(Ics1, L1, yyaction(A, Alen, Tcs, L0), Ts);
47 - {reject,_Alen,Tlen,_Ics1,L1,_S1} -> % After a non-accepting state
48 - {error,{L0,?MODULE,{illegal,yypre(Tcs, Tlen+1)}},L1};
49 - {A,Alen,_Tlen,_Ics1,_L1,_S1} ->
50 - string_cont(yysuf(Tcs, Alen), L0, yyaction(A, Alen, Tcs, L0), Ts)
51 - end.
52 -
53 - %% string_cont(RestChars, Line, Token, Tokens)
54 - %% Test for and remove the end token wrapper. Push back characters
55 - %% are prepended to RestChars.
56 -
57 - -dialyzer({nowarn_function, string_cont/4}).
58 -
59 - string_cont(Rest, Line, {token,T}, Ts) ->
60 - string(Rest, Line, Rest, [T|Ts]);
61 - string_cont(Rest, Line, {token,T,Push}, Ts) ->
62 - NewRest = Push ++ Rest,
63 - string(NewRest, Line, NewRest, [T|Ts]);
64 - string_cont(Rest, Line, {end_token,T}, Ts) ->
65 - string(Rest, Line, Rest, [T|Ts]);
66 - string_cont(Rest, Line, {end_token,T,Push}, Ts) ->
67 - NewRest = Push ++ Rest,
68 - string(NewRest, Line, NewRest, [T|Ts]);
69 - string_cont(Rest, Line, skip_token, Ts) ->
70 - string(Rest, Line, Rest, Ts);
71 - string_cont(Rest, Line, {skip_token,Push}, Ts) ->
72 - NewRest = Push ++ Rest,
73 - string(NewRest, Line, NewRest, Ts);
74 - string_cont(_Rest, Line, {error,S}, _Ts) ->
75 - {error,{Line,?MODULE,{user,S}},Line}.
76 -
77 - %% token(Continuation, Chars) ->
78 - %% token(Continuation, Chars, Line) ->
79 - %% {more,Continuation} | {done,ReturnVal,RestChars}.
80 - %% Must be careful when re-entering to append the latest characters to the
81 - %% after characters in an accept. The continuation is:
82 - %% {token,State,CurrLine,TokenChars,TokenLen,TokenLine,AccAction,AccLen}
83 -
84 - token(Cont, Chars) -> token(Cont, Chars, 1).
85 -
86 - token([], Chars, Line) ->
87 - token(yystate(), Chars, Line, Chars, 0, Line, reject, 0);
88 - token({token,State,Line,Tcs,Tlen,Tline,Action,Alen}, Chars, _) ->
89 - token(State, Chars, Line, Tcs ++ Chars, Tlen, Tline, Action, Alen).
90 -
91 - %% token(State, InChars, Line, TokenChars, TokenLen, TokenLine,
92 - %% AcceptAction, AcceptLen) ->
93 - %% {more,Continuation} | {done,ReturnVal,RestChars}.
94 - %% The argument order is chosen to be more efficient.
95 -
96 - token(S0, Ics0, L0, Tcs, Tlen0, Tline, A0, Alen0) ->
97 - case yystate(S0, Ics0, L0, Tlen0, A0, Alen0) of
98 - %% Accepting end state, we have a token.
99 - {A1,Alen1,Ics1,L1} ->
100 - token_cont(Ics1, L1, yyaction(A1, Alen1, Tcs, Tline));
101 - %% Accepting transition state, can take more chars.
102 - {A1,Alen1,[],L1,S1} -> % Need more chars to check
103 - {more,{token,S1,L1,Tcs,Alen1,Tline,A1,Alen1}};
104 - {A1,Alen1,Ics1,L1,_S1} -> % Take what we got
105 - token_cont(Ics1, L1, yyaction(A1, Alen1, Tcs, Tline));
106 - %% After a non-accepting state, maybe reach accept state later.
107 - {A1,Alen1,Tlen1,[],L1,S1} -> % Need more chars to check
108 - {more,{token,S1,L1,Tcs,Tlen1,Tline,A1,Alen1}};
109 - {reject,_Alen1,Tlen1,eof,L1,_S1} -> % No token match
110 - %% Check for partial token which is error.
111 - Ret = if Tlen1 > 0 -> {error,{Tline,?MODULE,
112 - %% Skip eof tail in Tcs.
113 - {illegal,yypre(Tcs, Tlen1)}},L1};
114 - true -> {eof,L1}
115 - end,
116 - {done,Ret,eof};
117 - {reject,_Alen1,Tlen1,Ics1,L1,_S1} -> % No token match
118 - Error = {Tline,?MODULE,{illegal,yypre(Tcs, Tlen1+1)}},
119 - {done,{error,Error,L1},Ics1};
120 - {A1,Alen1,_Tlen1,_Ics1,_L1,_S1} -> % Use last accept match
121 - token_cont(yysuf(Tcs, Alen1), L0, yyaction(A1, Alen1, Tcs, Tline))
122 - end.
123 -
124 - %% token_cont(RestChars, Line, Token)
125 - %% If we have a token or error then return done, else if we have a
126 - %% skip_token then continue.
127 -
128 - -dialyzer({nowarn_function, token_cont/3}).
129 -
130 - token_cont(Rest, Line, {token,T}) ->
131 - {done,{ok,T,Line},Rest};
132 - token_cont(Rest, Line, {token,T,Push}) ->
133 - NewRest = Push ++ Rest,
134 - {done,{ok,T,Line},NewRest};
135 - token_cont(Rest, Line, {end_token,T}) ->
136 - {done,{ok,T,Line},Rest};
137 - token_cont(Rest, Line, {end_token,T,Push}) ->
138 - NewRest = Push ++ Rest,
139 - {done,{ok,T,Line},NewRest};
140 - token_cont(Rest, Line, skip_token) ->
141 - token(yystate(), Rest, Line, Rest, 0, Line, reject, 0);
142 - token_cont(Rest, Line, {skip_token,Push}) ->
143 - NewRest = Push ++ Rest,
144 - token(yystate(), NewRest, Line, NewRest, 0, Line, reject, 0);
145 - token_cont(Rest, Line, {error,S}) ->
146 - {done,{error,{Line,?MODULE,{user,S}},Line},Rest}.
147 -
148 - %% tokens(Continuation, Chars, Line) ->
149 - %% {more,Continuation} | {done,ReturnVal,RestChars}.
150 - %% Must be careful when re-entering to append the latest characters to the
151 - %% after characters in an accept. The continuation is:
152 - %% {tokens,State,CurrLine,TokenChars,TokenLen,TokenLine,Tokens,AccAction,AccLen}
153 - %% {skip_tokens,State,CurrLine,TokenChars,TokenLen,TokenLine,Error,AccAction,AccLen}
154 -
155 - tokens(Cont, Chars) -> tokens(Cont, Chars, 1).
156 -
157 - tokens([], Chars, Line) ->
158 - tokens(yystate(), Chars, Line, Chars, 0, Line, [], reject, 0);
159 - tokens({tokens,State,Line,Tcs,Tlen,Tline,Ts,Action,Alen}, Chars, _) ->
160 - tokens(State, Chars, Line, Tcs ++ Chars, Tlen, Tline, Ts, Action, Alen);
161 - tokens({skip_tokens,State,Line,Tcs,Tlen,Tline,Error,Action,Alen}, Chars, _) ->
162 - skip_tokens(State, Chars, Line, Tcs ++ Chars, Tlen, Tline, Error, Action, Alen).
163 -
164 - %% tokens(State, InChars, Line, TokenChars, TokenLen, TokenLine, Tokens,
165 - %% AcceptAction, AcceptLen) ->
166 - %% {more,Continuation} | {done,ReturnVal,RestChars}.
167 -
168 - tokens(S0, Ics0, L0, Tcs, Tlen0, Tline, Ts, A0, Alen0) ->
169 - case yystate(S0, Ics0, L0, Tlen0, A0, Alen0) of
170 - %% Accepting end state, we have a token.
171 - {A1,Alen1,Ics1,L1} ->
172 - tokens_cont(Ics1, L1, yyaction(A1, Alen1, Tcs, Tline), Ts);
173 - %% Accepting transition state, can take more chars.
174 - {A1,Alen1,[],L1,S1} -> % Need more chars to check
175 - {more,{tokens,S1,L1,Tcs,Alen1,Tline,Ts,A1,Alen1}};
176 - {A1,Alen1,Ics1,L1,_S1} -> % Take what we got
177 - tokens_cont(Ics1, L1, yyaction(A1, Alen1, Tcs, Tline), Ts);
178 - %% After a non-accepting state, maybe reach accept state later.
179 - {A1,Alen1,Tlen1,[],L1,S1} -> % Need more chars to check
180 - {more,{tokens,S1,L1,Tcs,Tlen1,Tline,Ts,A1,Alen1}};
181 - {reject,_Alen1,Tlen1,eof,L1,_S1} -> % No token match
182 - %% Check for partial token which is error, no need to skip here.
183 - Ret = if Tlen1 > 0 -> {error,{Tline,?MODULE,
184 - %% Skip eof tail in Tcs.
185 - {illegal,yypre(Tcs, Tlen1)}},L1};
186 - Ts == [] -> {eof,L1};
187 - true -> {ok,yyrev(Ts),L1}
188 - end,
189 - {done,Ret,eof};
190 - {reject,_Alen1,Tlen1,_Ics1,L1,_S1} ->
191 - %% Skip rest of tokens.
192 - Error = {L1,?MODULE,{illegal,yypre(Tcs, Tlen1+1)}},
193 - skip_tokens(yysuf(Tcs, Tlen1+1), L1, Error);
194 - {A1,Alen1,_Tlen1,_Ics1,_L1,_S1} ->
195 - Token = yyaction(A1, Alen1, Tcs, Tline),
196 - tokens_cont(yysuf(Tcs, Alen1), L0, Token, Ts)
197 - end.
198 -
199 - %% tokens_cont(RestChars, Line, Token, Tokens)
200 - %% If we have an end_token or error then return done, else if we have
201 - %% a token then save it and continue, else if we have a skip_token
202 - %% just continue.
203 -
204 - -dialyzer({nowarn_function, tokens_cont/4}).
205 -
206 - tokens_cont(Rest, Line, {token,T}, Ts) ->
207 - tokens(yystate(), Rest, Line, Rest, 0, Line, [T|Ts], reject, 0);
208 - tokens_cont(Rest, Line, {token,T,Push}, Ts) ->
209 - NewRest = Push ++ Rest,
210 - tokens(yystate(), NewRest, Line, NewRest, 0, Line, [T|Ts], reject, 0);
211 - tokens_cont(Rest, Line, {end_token,T}, Ts) ->
212 - {done,{ok,yyrev(Ts, [T]),Line},Rest};
213 - tokens_cont(Rest, Line, {end_token,T,Push}, Ts) ->
214 - NewRest = Push ++ Rest,
215 - {done,{ok,yyrev(Ts, [T]),Line},NewRest};
216 - tokens_cont(Rest, Line, skip_token, Ts) ->
217 - tokens(yystate(), Rest, Line, Rest, 0, Line, Ts, reject, 0);
218 - tokens_cont(Rest, Line, {skip_token,Push}, Ts) ->
219 - NewRest = Push ++ Rest,
220 - tokens(yystate(), NewRest, Line, NewRest, 0, Line, Ts, reject, 0);
221 - tokens_cont(Rest, Line, {error,S}, _Ts) ->
222 - skip_tokens(Rest, Line, {Line,?MODULE,{user,S}}).
223 -
224 - %%skip_tokens(InChars, Line, Error) -> {done,{error,Error,Line},Ics}.
225 - %% Skip tokens until an end token, junk everything and return the error.
226 -
227 - skip_tokens(Ics, Line, Error) ->
228 - skip_tokens(yystate(), Ics, Line, Ics, 0, Line, Error, reject, 0).
229 -
230 - %% skip_tokens(State, InChars, Line, TokenChars, TokenLen, TokenLine, Tokens,
231 - %% AcceptAction, AcceptLen) ->
232 - %% {more,Continuation} | {done,ReturnVal,RestChars}.
233 -
234 - skip_tokens(S0, Ics0, L0, Tcs, Tlen0, Tline, Error, A0, Alen0) ->
235 - case yystate(S0, Ics0, L0, Tlen0, A0, Alen0) of
236 - {A1,Alen1,Ics1,L1} -> % Accepting end state
237 - skip_cont(Ics1, L1, yyaction(A1, Alen1, Tcs, Tline), Error);
238 - {A1,Alen1,[],L1,S1} -> % After an accepting state
239 - {more,{skip_tokens,S1,L1,Tcs,Alen1,Tline,Error,A1,Alen1}};
240 - {A1,Alen1,Ics1,L1,_S1} ->
241 - skip_cont(Ics1, L1, yyaction(A1, Alen1, Tcs, Tline), Error);
242 - {A1,Alen1,Tlen1,[],L1,S1} -> % After a non-accepting state
243 - {more,{skip_tokens,S1,L1,Tcs,Tlen1,Tline,Error,A1,Alen1}};
244 - {reject,_Alen1,_Tlen1,eof,L1,_S1} ->
245 - {done,{error,Error,L1},eof};
246 - {reject,_Alen1,Tlen1,_Ics1,L1,_S1} ->
247 - skip_tokens(yysuf(Tcs, Tlen1+1), L1, Error);
248 - {A1,Alen1,_Tlen1,_Ics1,L1,_S1} ->
249 - Token = yyaction(A1, Alen1, Tcs, Tline),
250 - skip_cont(yysuf(Tcs, Alen1), L1, Token, Error)
251 - end.
252 -
253 - %% skip_cont(RestChars, Line, Token, Error)
254 - %% Skip tokens until we have an end_token or error then return done
255 - %% with the original rror.
256 -
257 - -dialyzer({nowarn_function, skip_cont/4}).
258 -
259 - skip_cont(Rest, Line, {token,_T}, Error) ->
260 - skip_tokens(yystate(), Rest, Line, Rest, 0, Line, Error, reject, 0);
261 - skip_cont(Rest, Line, {token,_T,Push}, Error) ->
262 - NewRest = Push ++ Rest,
263 - skip_tokens(yystate(), NewRest, Line, NewRest, 0, Line, Error, reject, 0);
264 - skip_cont(Rest, Line, {end_token,_T}, Error) ->
265 - {done,{error,Error,Line},Rest};
266 - skip_cont(Rest, Line, {end_token,_T,Push}, Error) ->
267 - NewRest = Push ++ Rest,
268 - {done,{error,Error,Line},NewRest};
269 - skip_cont(Rest, Line, skip_token, Error) ->
270 - skip_tokens(yystate(), Rest, Line, Rest, 0, Line, Error, reject, 0);
271 - skip_cont(Rest, Line, {skip_token,Push}, Error) ->
272 - NewRest = Push ++ Rest,
273 - skip_tokens(yystate(), NewRest, Line, NewRest, 0, Line, Error, reject, 0);
274 - skip_cont(Rest, Line, {error,_S}, Error) ->
275 - skip_tokens(yystate(), Rest, Line, Rest, 0, Line, Error, reject, 0).
276 -
277 - yyrev(List) -> lists:reverse(List).
278 - yyrev(List, Tail) -> lists:reverse(List, Tail).
279 - yypre(List, N) -> lists:sublist(List, N).
280 - yysuf(List, N) -> lists:nthtail(N, List).
281 -
282 - %% yystate() -> InitialState.
283 - %% yystate(State, InChars, Line, CurrTokLen, AcceptAction, AcceptLen) ->
284 - %% {Action, AcceptLen, RestChars, Line} |
285 - %% {Action, AcceptLen, RestChars, Line, State} |
286 - %% {reject, AcceptLen, CurrTokLen, RestChars, Line, State} |
287 - %% {Action, AcceptLen, CurrTokLen, RestChars, Line, State}.
288 - %% Generated state transition functions. The non-accepting end state
289 - %% return signal either an unrecognised character or end of current
290 - %% input.
291 -
292 - -file("src/floki_selector_lexer.erl", 291).
293 - yystate() -> 25.
294 -
295 - yystate(28, [39|Ics], Line, Tlen, _, _) ->
296 - yystate(24, Ics, Line, Tlen+1, 15, Tlen);
297 - yystate(28, [C|Ics], Line, Tlen, _, _) when C >= 0, C =< 9 ->
298 - yystate(20, Ics, Line, Tlen+1, 15, Tlen);
299 - yystate(28, [C|Ics], Line, Tlen, _, _) when C >= 11, C =< 38 ->
300 - yystate(20, Ics, Line, Tlen+1, 15, Tlen);
301 - yystate(28, [C|Ics], Line, Tlen, _, _) when C >= 40 ->
302 - yystate(20, Ics, Line, Tlen+1, 15, Tlen);
303 - yystate(28, Ics, Line, Tlen, _, _) ->
304 - {15,Tlen,Ics,Line,28};
305 - yystate(27, Ics, Line, Tlen, _, _) ->
306 - {15,Tlen,Ics,Line};
307 - yystate(26, Ics, Line, Tlen, _, _) ->
308 - {9,Tlen,Ics,Line};
309 - yystate(25, [126|Ics], Line, Tlen, Action, Alen) ->
310 - yystate(21, Ics, Line, Tlen+1, Action, Alen);
311 - yystate(25, [125|Ics], Line, Tlen, Action, Alen) ->
312 - yystate(27, Ics, Line, Tlen+1, Action, Alen);
313 - yystate(25, [124|Ics], Line, Tlen, Action, Alen) ->
314 - yystate(13, Ics, Line, Tlen+1, Action, Alen);
315 - yystate(25, [123|Ics], Line, Tlen, Action, Alen) ->
316 - yystate(27, Ics, Line, Tlen+1, Action, Alen);
317 - yystate(25, [96|Ics], Line, Tlen, Action, Alen) ->
318 - yystate(27, Ics, Line, Tlen+1, Action, Alen);
319 - yystate(25, [95|Ics], Line, Tlen, Action, Alen) ->
320 - yystate(18, Ics, Line, Tlen+1, Action, Alen);
321 - yystate(25, [94|Ics], Line, Tlen, Action, Alen) ->
322 - yystate(5, Ics, Line, Tlen+1, Action, Alen);
323 - yystate(25, [93|Ics], Line, Tlen, Action, Alen) ->
324 - yystate(2, Ics, Line, Tlen+1, Action, Alen);
325 - yystate(25, [92|Ics], Line, Tlen, Action, Alen) ->
326 - yystate(27, Ics, Line, Tlen+1, Action, Alen);
327 - yystate(25, [91|Ics], Line, Tlen, Action, Alen) ->
328 - yystate(2, Ics, Line, Tlen+1, Action, Alen);
329 - yystate(25, [63|Ics], Line, Tlen, Action, Alen) ->
330 - yystate(27, Ics, Line, Tlen+1, Action, Alen);
331 - yystate(25, [64|Ics], Line, Tlen, Action, Alen) ->
332 - yystate(27, Ics, Line, Tlen+1, Action, Alen);
333 - yystate(25, [62|Ics], Line, Tlen, Action, Alen) ->
334 - yystate(11, Ics, Line, Tlen+1, Action, Alen);
335 - yystate(25, [61|Ics], Line, Tlen, Action, Alen) ->
336 - yystate(6, Ics, Line, Tlen+1, Action, Alen);
337 - yystate(25, [47|Ics], Line, Tlen, Action, Alen) ->
338 - yystate(27, Ics, Line, Tlen+1, Action, Alen);
339 - yystate(25, [46|Ics], Line, Tlen, Action, Alen) ->
340 - yystate(10, Ics, Line, Tlen+1, Action, Alen);
341 - yystate(25, [45|Ics], Line, Tlen, Action, Alen) ->
342 - yystate(18, Ics, Line, Tlen+1, Action, Alen);
343 - yystate(25, [44|Ics], Line, Tlen, Action, Alen) ->
344 - yystate(15, Ics, Line, Tlen+1, Action, Alen);
345 - yystate(25, [43|Ics], Line, Tlen, Action, Alen) ->
346 - yystate(19, Ics, Line, Tlen+1, Action, Alen);
347 - yystate(25, [42|Ics], Line, Tlen, Action, Alen) ->
348 - yystate(22, Ics, Line, Tlen+1, Action, Alen);
349 - yystate(25, [40|Ics], Line, Tlen, Action, Alen) ->
350 - yystate(27, Ics, Line, Tlen+1, Action, Alen);
351 - yystate(25, [41|Ics], Line, Tlen, Action, Alen) ->
352 - yystate(27, Ics, Line, Tlen+1, Action, Alen);
353 - yystate(25, [39|Ics], Line, Tlen, Action, Alen) ->
354 - yystate(28, Ics, Line, Tlen+1, Action, Alen);
355 - yystate(25, [37|Ics], Line, Tlen, Action, Alen) ->
356 - yystate(27, Ics, Line, Tlen+1, Action, Alen);
357 - yystate(25, [38|Ics], Line, Tlen, Action, Alen) ->
358 - yystate(27, Ics, Line, Tlen+1, Action, Alen);
359 - yystate(25, [36|Ics], Line, Tlen, Action, Alen) ->
360 - yystate(16, Ics, Line, Tlen+1, Action, Alen);
361 - yystate(25, [35|Ics], Line, Tlen, Action, Alen) ->
362 - yystate(8, Ics, Line, Tlen+1, Action, Alen);
363 - yystate(25, [34|Ics], Line, Tlen, Action, Alen) ->
364 - yystate(0, Ics, Line, Tlen+1, Action, Alen);
365 - yystate(25, [33|Ics], Line, Tlen, Action, Alen) ->
366 - yystate(27, Ics, Line, Tlen+1, Action, Alen);
367 - yystate(25, [32|Ics], Line, Tlen, Action, Alen) ->
368 - yystate(23, Ics, Line, Tlen+1, Action, Alen);
369 - yystate(25, [12|Ics], Line, Tlen, Action, Alen) ->
370 - yystate(23, Ics, Line, Tlen+1, Action, Alen);
371 - yystate(25, [13|Ics], Line, Tlen, Action, Alen) ->
372 - yystate(23, Ics, Line, Tlen+1, Action, Alen);
373 - yystate(25, [11|Ics], Line, Tlen, Action, Alen) ->
374 - yystate(27, Ics, Line, Tlen+1, Action, Alen);
375 - yystate(25, [10|Ics], Line, Tlen, Action, Alen) ->
376 - yystate(23, Ics, Line+1, Tlen+1, Action, Alen);
377 - yystate(25, [9|Ics], Line, Tlen, Action, Alen) ->
378 - yystate(23, Ics, Line, Tlen+1, Action, Alen);
379 - yystate(25, [C|Ics], Line, Tlen, Action, Alen) when C >= 0, C =< 8 ->
380 - yystate(27, Ics, Line, Tlen+1, Action, Alen);
381 - yystate(25, [C|Ics], Line, Tlen, Action, Alen) when C >= 14, C =< 31 ->
382 - yystate(27, Ics, Line, Tlen+1, Action, Alen);
383 - yystate(25, [C|Ics], Line, Tlen, Action, Alen) when C >= 48, C =< 57 ->
384 - yystate(18, Ics, Line, Tlen+1, Action, Alen);
385 - yystate(25, [C|Ics], Line, Tlen, Action, Alen) when C >= 58, C =< 60 ->
386 - yystate(27, Ics, Line, Tlen+1, Action, Alen);
387 - yystate(25, [C|Ics], Line, Tlen, Action, Alen) when C >= 65, C =< 90 ->
388 - yystate(18, Ics, Line, Tlen+1, Action, Alen);
389 - yystate(25, [C|Ics], Line, Tlen, Action, Alen) when C >= 97, C =< 122 ->
390 - yystate(18, Ics, Line, Tlen+1, Action, Alen);
391 - yystate(25, [C|Ics], Line, Tlen, Action, Alen) when C >= 127 ->
392 - yystate(27, Ics, Line, Tlen+1, Action, Alen);
393 - yystate(25, Ics, Line, Tlen, Action, Alen) ->
394 - {Action,Alen,Tlen,Ics,Line,25};
395 - yystate(24, [39|Ics], Line, Tlen, _, _) ->
396 - yystate(24, Ics, Line, Tlen+1, 1, Tlen);
397 - yystate(24, [C|Ics], Line, Tlen, _, _) when C >= 0, C =< 9 ->
398 - yystate(20, Ics, Line, Tlen+1, 1, Tlen);
399 - yystate(24, [C|Ics], Line, Tlen, _, _) when C >= 11, C =< 38 ->
400 - yystate(20, Ics, Line, Tlen+1, 1, Tlen);
401 - yystate(24, [C|Ics], Line, Tlen, _, _) when C >= 40 ->
402 - yystate(20, Ics, Line, Tlen+1, 1, Tlen);
403 - yystate(24, Ics, Line, Tlen, _, _) ->
404 - {1,Tlen,Ics,Line,24};
405 - yystate(23, [62|Ics], Line, Tlen, _, _) ->
406 - yystate(11, Ics, Line, Tlen+1, 14, Tlen);
407 - yystate(23, [44|Ics], Line, Tlen, _, _) ->
408 - yystate(15, Ics, Line, Tlen+1, 14, Tlen);
409 - yystate(23, [43|Ics], Line, Tlen, _, _) ->
410 - yystate(19, Ics, Line, Tlen+1, 14, Tlen);
411 - yystate(23, [32|Ics], Line, Tlen, _, _) ->
412 - yystate(23, Ics, Line, Tlen+1, 14, Tlen);
413 - yystate(23, [12|Ics], Line, Tlen, _, _) ->
414 - yystate(23, Ics, Line, Tlen+1, 14, Tlen);
415 - yystate(23, [13|Ics], Line, Tlen, _, _) ->
416 - yystate(23, Ics, Line, Tlen+1, 14, Tlen);
417 - yystate(23, [9|Ics], Line, Tlen, _, _) ->
418 - yystate(23, Ics, Line, Tlen+1, 14, Tlen);
419 - yystate(23, [10|Ics], Line, Tlen, _, _) ->
420 - yystate(23, Ics, Line+1, Tlen+1, 14, Tlen);
421 - yystate(23, Ics, Line, Tlen, _, _) ->
422 - {14,Tlen,Ics,Line,23};
423 - yystate(22, [61|Ics], Line, Tlen, _, _) ->
424 - yystate(26, Ics, Line, Tlen+1, 2, Tlen);
425 - yystate(22, Ics, Line, Tlen, _, _) ->
426 - {2,Tlen,Ics,Line,22};
427 - yystate(21, [61|Ics], Line, Tlen, _, _) ->
428 - yystate(17, Ics, Line, Tlen+1, 15, Tlen);
429 - yystate(21, Ics, Line, Tlen, _, _) ->
430 - {15,Tlen,Ics,Line,21};
431 - yystate(20, [39|Ics], Line, Tlen, Action, Alen) ->
432 - yystate(24, Ics, Line, Tlen+1, Action, Alen);
433 - yystate(20, [C|Ics], Line, Tlen, Action, Alen) when C >= 0, C =< 9 ->
434 - yystate(20, Ics, Line, Tlen+1, Action, Alen);
435 - yystate(20, [C|Ics], Line, Tlen, Action, Alen) when C >= 11, C =< 38 ->
436 - yystate(20, Ics, Line, Tlen+1, Action, Alen);
437 - yystate(20, [C|Ics], Line, Tlen, Action, Alen) when C >= 40 ->
438 - yystate(20, Ics, Line, Tlen+1, Action, Alen);
439 - yystate(20, Ics, Line, Tlen, Action, Alen) ->
440 - {Action,Alen,Tlen,Ics,Line,20};
441 - yystate(19, [32|Ics], Line, Tlen, _, _) ->
442 - yystate(19, Ics, Line, Tlen+1, 13, Tlen);
443 - yystate(19, [12|Ics], Line, Tlen, _, _) ->
444 - yystate(19, Ics, Line, Tlen+1, 13, Tlen);
445 - yystate(19, [13|Ics], Line, Tlen, _, _) ->
446 - yystate(19, Ics, Line, Tlen+1, 13, Tlen);
447 - yystate(19, [9|Ics], Line, Tlen, _, _) ->
448 - yystate(19, Ics, Line, Tlen+1, 13, Tlen);
449 - yystate(19, [10|Ics], Line, Tlen, _, _) ->
450 - yystate(19, Ics, Line+1, Tlen+1, 13, Tlen);
451 - yystate(19, Ics, Line, Tlen, _, _) ->
452 - {13,Tlen,Ics,Line,19};
453 - yystate(18, [95|Ics], Line, Tlen, _, _) ->
454 - yystate(18, Ics, Line, Tlen+1, 0, Tlen);
455 - yystate(18, [45|Ics], Line, Tlen, _, _) ->
456 - yystate(18, Ics, Line, Tlen+1, 0, Tlen);
457 - yystate(18, [C|Ics], Line, Tlen, _, _) when C >= 48, C =< 57 ->
458 - yystate(18, Ics, Line, Tlen+1, 0, Tlen);
459 - yystate(18, [C|Ics], Line, Tlen, _, _) when C >= 65, C =< 90 ->
460 - yystate(18, Ics, Line, Tlen+1, 0, Tlen);
461 - yystate(18, [C|Ics], Line, Tlen, _, _) when C >= 97, C =< 122 ->
462 - yystate(18, Ics, Line, Tlen+1, 0, Tlen);
463 - yystate(18, Ics, Line, Tlen, _, _) ->
464 - {0,Tlen,Ics,Line,18};
465 - yystate(17, Ics, Line, Tlen, _, _) ->
466 - {5,Tlen,Ics,Line};
467 - yystate(16, [61|Ics], Line, Tlen, _, _) ->
468 - yystate(12, Ics, Line, Tlen+1, 15, Tlen);
469 - yystate(16, Ics, Line, Tlen, _, _) ->
470 - {15,Tlen,Ics,Line,16};
471 - yystate(15, Ics, Line, Tlen, _, _) ->
472 - {11,Tlen,Ics,Line};
473 - yystate(14, [95|Ics], Line, Tlen, _, _) ->
474 - yystate(14, Ics, Line, Tlen+1, 4, Tlen);
475 - yystate(14, [45|Ics], Line, Tlen, _, _) ->
476 - yystate(14, Ics, Line, Tlen+1, 4, Tlen);
477 - yystate(14, [C|Ics], Line, Tlen, _, _) when C >= 48, C =< 57 ->
478 - yystate(14, Ics, Line, Tlen+1, 4, Tlen);
479 - yystate(14, [C|Ics], Line, Tlen, _, _) when C >= 65, C =< 90 ->
480 - yystate(14, Ics, Line, Tlen+1, 4, Tlen);
481 - yystate(14, [C|Ics], Line, Tlen, _, _) when C >= 97, C =< 122 ->
482 - yystate(14, Ics, Line, Tlen+1, 4, Tlen);
483 - yystate(14, Ics, Line, Tlen, _, _) ->
484 - {4,Tlen,Ics,Line,14};
485 - yystate(13, [61|Ics], Line, Tlen, _, _) ->
486 - yystate(9, Ics, Line, Tlen+1, 15, Tlen);
487 - yystate(13, Ics, Line, Tlen, _, _) ->
488 - {15,Tlen,Ics,Line,13};
489 - yystate(12, Ics, Line, Tlen, _, _) ->
490 - {8,Tlen,Ics,Line};
491 - yystate(11, [32|Ics], Line, Tlen, _, _) ->
492 - yystate(11, Ics, Line, Tlen+1, 12, Tlen);
493 - yystate(11, [12|Ics], Line, Tlen, _, _) ->
494 - yystate(11, Ics, Line, Tlen+1, 12, Tlen);
495 - yystate(11, [13|Ics], Line, Tlen, _, _) ->
496 - yystate(11, Ics, Line, Tlen+1, 12, Tlen);
497 - yystate(11, [9|Ics], Line, Tlen, _, _) ->
498 - yystate(11, Ics, Line, Tlen+1, 12, Tlen);
499 - yystate(11, [10|Ics], Line, Tlen, _, _) ->
500 - yystate(11, Ics, Line+1, Tlen+1, 12, Tlen);
501 - yystate(11, Ics, Line, Tlen, _, _) ->
502 - {12,Tlen,Ics,Line,11};
503 - yystate(10, [95|Ics], Line, Tlen, _, _) ->
504 - yystate(14, Ics, Line, Tlen+1, 15, Tlen);
505 - yystate(10, [45|Ics], Line, Tlen, _, _) ->
506 - yystate(14, Ics, Line, Tlen+1, 15, Tlen);
507 - yystate(10, [C|Ics], Line, Tlen, _, _) when C >= 48, C =< 57 ->
508 - yystate(14, Ics, Line, Tlen+1, 15, Tlen);
509 - yystate(10, [C|Ics], Line, Tlen, _, _) when C >= 65, C =< 90 ->
510 - yystate(14, Ics, Line, Tlen+1, 15, Tlen);
511 - yystate(10, [C|Ics], Line, Tlen, _, _) when C >= 97, C =< 122 ->
512 - yystate(14, Ics, Line, Tlen+1, 15, Tlen);
513 - yystate(10, Ics, Line, Tlen, _, _) ->
514 - {15,Tlen,Ics,Line,10};
515 - yystate(9, Ics, Line, Tlen, _, _) ->
516 - {6,Tlen,Ics,Line};
517 - yystate(8, [95|Ics], Line, Tlen, _, _) ->
518 - yystate(4, Ics, Line, Tlen+1, 15, Tlen);
519 - yystate(8, [45|Ics], Line, Tlen, _, _) ->
520 - yystate(4, Ics, Line, Tlen+1, 15, Tlen);
521 - yystate(8, [C|Ics], Line, Tlen, _, _) when C >= 48, C =< 57 ->
522 - yystate(4, Ics, Line, Tlen+1, 15, Tlen);
523 - yystate(8, [C|Ics], Line, Tlen, _, _) when C >= 65, C =< 90 ->
524 - yystate(4, Ics, Line, Tlen+1, 15, Tlen);
525 - yystate(8, [C|Ics], Line, Tlen, _, _) when C >= 97, C =< 122 ->
526 - yystate(4, Ics, Line, Tlen+1, 15, Tlen);
527 - yystate(8, Ics, Line, Tlen, _, _) ->
528 - {15,Tlen,Ics,Line,8};
529 - yystate(7, [34|Ics], Line, Tlen, Action, Alen) ->
530 - yystate(3, Ics, Line, Tlen+1, Action, Alen);
531 - yystate(7, [C|Ics], Line, Tlen, Action, Alen) when C >= 0, C =< 9 ->
532 - yystate(7, Ics, Line, Tlen+1, Action, Alen);
533 - yystate(7, [C|Ics], Line, Tlen, Action, Alen) when C >= 11, C =< 33 ->
534 - yystate(7, Ics, Line, Tlen+1, Action, Alen);
535 - yystate(7, [C|Ics], Line, Tlen, Action, Alen) when C >= 35 ->
536 - yystate(7, Ics, Line, Tlen+1, Action, Alen);
537 - yystate(7, Ics, Line, Tlen, Action, Alen) ->
538 - {Action,Alen,Tlen,Ics,Line,7};
539 - yystate(6, Ics, Line, Tlen, _, _) ->
540 - {10,Tlen,Ics,Line};
541 - yystate(5, [61|Ics], Line, Tlen, _, _) ->
542 - yystate(1, Ics, Line, Tlen+1, 15, Tlen);
543 - yystate(5, Ics, Line, Tlen, _, _) ->
544 - {15,Tlen,Ics,Line,5};
545 - yystate(4, [95|Ics], Line, Tlen, _, _) ->
546 - yystate(4, Ics, Line, Tlen+1, 3, Tlen);
547 - yystate(4, [45|Ics], Line, Tlen, _, _) ->
548 - yystate(4, Ics, Line, Tlen+1, 3, Tlen);
549 - yystate(4, [C|Ics], Line, Tlen, _, _) when C >= 48, C =< 57 ->
550 - yystate(4, Ics, Line, Tlen+1, 3, Tlen);
551 - yystate(4, [C|Ics], Line, Tlen, _, _) when C >= 65, C =< 90 ->
552 - yystate(4, Ics, Line, Tlen+1, 3, Tlen);
553 - yystate(4, [C|Ics], Line, Tlen, _, _) when C >= 97, C =< 122 ->
554 - yystate(4, Ics, Line, Tlen+1, 3, Tlen);
555 - yystate(4, Ics, Line, Tlen, _, _) ->
556 - {3,Tlen,Ics,Line,4};
557 - yystate(3, [34|Ics], Line, Tlen, _, _) ->
558 - yystate(3, Ics, Line, Tlen+1, 1, Tlen);
559 - yystate(3, [C|Ics], Line, Tlen, _, _) when C >= 0, C =< 9 ->
560 - yystate(7, Ics, Line, Tlen+1, 1, Tlen);
561 - yystate(3, [C|Ics], Line, Tlen, _, _) when C >= 11, C =< 33 ->
562 - yystate(7, Ics, Line, Tlen+1, 1, Tlen);
563 - yystate(3, [C|Ics], Line, Tlen, _, _) when C >= 35 ->
564 - yystate(7, Ics, Line, Tlen+1, 1, Tlen);
565 - yystate(3, Ics, Line, Tlen, _, _) ->
566 - {1,Tlen,Ics,Line,3};
567 - yystate(2, Ics, Line, Tlen, _, _) ->
568 - {2,Tlen,Ics,Line};
569 - yystate(1, Ics, Line, Tlen, _, _) ->
570 - {7,Tlen,Ics,Line};
571 - yystate(0, [34|Ics], Line, Tlen, _, _) ->
572 - yystate(3, Ics, Line, Tlen+1, 15, Tlen);
573 - yystate(0, [C|Ics], Line, Tlen, _, _) when C >= 0, C =< 9 ->
574 - yystate(7, Ics, Line, Tlen+1, 15, Tlen);
575 - yystate(0, [C|Ics], Line, Tlen, _, _) when C >= 11, C =< 33 ->
576 - yystate(7, Ics, Line, Tlen+1, 15, Tlen);
577 - yystate(0, [C|Ics], Line, Tlen, _, _) when C >= 35 ->
578 - yystate(7, Ics, Line, Tlen+1, 15, Tlen);
579 - yystate(0, Ics, Line, Tlen, _, _) ->
580 - {15,Tlen,Ics,Line,0};
581 - yystate(S, Ics, Line, Tlen, Action, Alen) ->
582 - {Action,Alen,Tlen,Ics,Line,S}.
583 -
584 - %% yyaction(Action, TokenLength, TokenChars, TokenLine) ->
585 - %% {token,Token} | {end_token, Token} | skip_token | {error,String}.
586 - %% Generated action function.
587 -
588 - yyaction(0, TokenLen, YYtcs, TokenLine) ->
589 - TokenChars = yypre(YYtcs, TokenLen),
590 - yyaction_0(TokenChars, TokenLine);
591 - yyaction(1, TokenLen, YYtcs, TokenLine) ->
592 - TokenChars = yypre(YYtcs, TokenLen),
593 - yyaction_1(TokenChars, TokenLine);
594 - yyaction(2, TokenLen, YYtcs, TokenLine) ->
595 - TokenChars = yypre(YYtcs, TokenLen),
596 - yyaction_2(TokenChars, TokenLine);
597 - yyaction(3, TokenLen, YYtcs, TokenLine) ->
598 - TokenChars = yypre(YYtcs, TokenLen),
599 - yyaction_3(TokenChars, TokenLine);
600 - yyaction(4, TokenLen, YYtcs, TokenLine) ->
601 - TokenChars = yypre(YYtcs, TokenLen),
602 - yyaction_4(TokenChars, TokenLine);
603 - yyaction(5, _, _, TokenLine) ->
604 - yyaction_5(TokenLine);
605 - yyaction(6, _, _, TokenLine) ->
606 - yyaction_6(TokenLine);
607 - yyaction(7, _, _, TokenLine) ->
608 - yyaction_7(TokenLine);
609 - yyaction(8, _, _, TokenLine) ->
610 - yyaction_8(TokenLine);
611 - yyaction(9, _, _, TokenLine) ->
612 - yyaction_9(TokenLine);
613 - yyaction(10, _, _, TokenLine) ->
614 - yyaction_10(TokenLine);
615 - yyaction(11, _, _, TokenLine) ->
616 - yyaction_11(TokenLine);
617 - yyaction(12, _, _, TokenLine) ->
618 - yyaction_12(TokenLine);
619 - yyaction(13, _, _, TokenLine) ->
620 - yyaction_13(TokenLine);
621 - yyaction(14, _, _, TokenLine) ->
622 - yyaction_14(TokenLine);
623 - yyaction(15, TokenLen, YYtcs, TokenLine) ->
624 - TokenChars = yypre(YYtcs, TokenLen),
625 - yyaction_15(TokenChars, TokenLine);
626 - yyaction(_, _, _, _) -> error.
627 -
628 - -compile({inline,yyaction_0/2}).
629 - -file("src/floki_selector_lexer.xrl", 8).
630 - yyaction_0(TokenChars, TokenLine) ->
631 - { token, { identifier, TokenLine, TokenChars } } .
632 -
633 - -compile({inline,yyaction_1/2}).
634 - -file("src/floki_selector_lexer.xrl", 9).
635 - yyaction_1(TokenChars, TokenLine) ->
636 - { token, { quoted, TokenLine, remove_quotes (TokenChars) } } .
637 -
638 - -compile({inline,yyaction_2/2}).
639 - -file("src/floki_selector_lexer.xrl", 10).
640 - yyaction_2(TokenChars, TokenLine) ->
641 - { token, { TokenChars, TokenLine } } .
642 -
643 - -compile({inline,yyaction_3/2}).
644 - -file("src/floki_selector_lexer.xrl", 11).
645 - yyaction_3(TokenChars, TokenLine) ->
646 - { token, { hash, TokenLine, tail (TokenChars) } } .
647 -
648 - -compile({inline,yyaction_4/2}).
649 - -file("src/floki_selector_lexer.xrl", 12).
650 - yyaction_4(TokenChars, TokenLine) ->
651 - { token, { class, TokenLine, tail (TokenChars) } } .
652 -
653 - -compile({inline,yyaction_5/1}).
654 - -file("src/floki_selector_lexer.xrl", 13).
655 - yyaction_5(TokenLine) ->
656 - { token, { includes, TokenLine } } .
657 -
658 - -compile({inline,yyaction_6/1}).
659 - -file("src/floki_selector_lexer.xrl", 14).
660 - yyaction_6(TokenLine) ->
661 - { token, { dash_match, TokenLine } } .
662 -
663 - -compile({inline,yyaction_7/1}).
664 - -file("src/floki_selector_lexer.xrl", 15).
665 - yyaction_7(TokenLine) ->
666 - { token, { prefix_match, TokenLine } } .
667 -
668 - -compile({inline,yyaction_8/1}).
669 - -file("src/floki_selector_lexer.xrl", 16).
670 - yyaction_8(TokenLine) ->
671 - { token, { sufix_match, TokenLine } } .
672 -
673 - -compile({inline,yyaction_9/1}).
674 - -file("src/floki_selector_lexer.xrl", 17).
675 - yyaction_9(TokenLine) ->
676 - { token, { substring_match, TokenLine } } .
677 -
678 - -compile({inline,yyaction_10/1}).
679 - -file("src/floki_selector_lexer.xrl", 18).
680 - yyaction_10(TokenLine) ->
681 - { token, { equal, TokenLine } } .
682 -
683 - -compile({inline,yyaction_11/1}).
684 - -file("src/floki_selector_lexer.xrl", 19).
685 - yyaction_11(TokenLine) ->
686 - { token, { comma, TokenLine } } .
687 -
688 - -compile({inline,yyaction_12/1}).
689 - -file("src/floki_selector_lexer.xrl", 20).
690 - yyaction_12(TokenLine) ->
691 - { token, { greater, TokenLine } } .
692 -
693 - -compile({inline,yyaction_13/1}).
694 - -file("src/floki_selector_lexer.xrl", 21).
695 - yyaction_13(TokenLine) ->
696 - { token, { plus, TokenLine } } .
697 -
698 - -compile({inline,yyaction_14/1}).
699 - -file("src/floki_selector_lexer.xrl", 22).
700 - yyaction_14(TokenLine) ->
701 - { token, { space, TokenLine } } .
702 -
703 - -compile({inline,yyaction_15/2}).
704 - -file("src/floki_selector_lexer.xrl", 23).
705 - yyaction_15(TokenChars, TokenLine) ->
706 - { token, { unknown, TokenLine, TokenChars } } .
707 -
708 - -file("/usr/local/Cellar/erlang/18.0.2/lib/erlang/lib/parsetools-2.1/include/leexinc.hrl", 290).