erlydtl_parser.erl 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. -module(erlydtl_parser).
  2. -export([parse/1, parse_and_scan/1, format_error/1]).
  3. -file("src/erlydtl/erlydtl_parser.yrl", 68).
  4. string({_, String}) ->
  5. erl_syntax:binary([erl_syntax:binary_field(erl_syntax:integer(X)) || X <- String]).
  6. var({_, Line, Var}) ->
  7. {var, Line, list_to_atom("A" ++ Var)}.
  8. extends({_, Line, [Name]}) ->
  9. %% TODO: check if string (enclosed with "") or variable.
  10. %% for now we handle it (even not enclosed with "") as string
  11. {extends, Line, string:strip(Name, both, $")}.
  12. block({_, Line, [Name]}, Content) ->
  13. {block, Line, list_to_atom(Name), Content}.
  14. tag({_, Line, [TagName | Args]}) ->
  15. %% TODO: check if string (enclosed with "") or variable.
  16. %% for now we handle it (even not enclosed with "") as string
  17. Args2 = lists:foldl(fun(X, Acc) ->
  18. case string:chr(X, $=) of
  19. 0 ->
  20. Acc;
  21. Pos ->
  22. Var = list_to_atom(string:sub_string(X, 1, Pos-1)),
  23. Val = string:sub_string(X, Pos+1),
  24. Val2 = string:strip(Val, both, $"),
  25. [{Var, Val2}| Acc]
  26. end
  27. end,
  28. [],
  29. Args),
  30. {tag, Line, TagName, Args2}.
  31. for({_, Line, [Iterator, _, Var]}, Content) ->
  32. {for, Line, list_to_atom("A" ++ Iterator), list_to_atom("A" ++ Var), Content}.
  33. -file("/Users/rsaccon/R11B/erlang/lib/parsetools-1.4.1.1/include/yeccpre.hrl", 0).
  34. %% ``The contents of this file are subject to the Erlang Public License,
  35. %% Version 1.1, (the "License"); you may not use this file except in
  36. %% compliance with the License. You should have received a copy of the
  37. %% Erlang Public License along with this software. If not, it can be
  38. %% retrieved via the world wide web at http://www.erlang.org/.
  39. %%
  40. %% Software distributed under the License is distributed on an "AS IS"
  41. %% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  42. %% the License for the specific language governing rights and limitations
  43. %% under the License.
  44. %%
  45. %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.
  46. %% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
  47. %% AB. All Rights Reserved.''
  48. %%
  49. %% $Id $
  50. %%
  51. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  52. % The parser generator will insert appropriate declarations before this line.%
  53. parse(Tokens) ->
  54. yeccpars0(Tokens, false).
  55. parse_and_scan({F, A}) -> % Fun or {M, F}
  56. yeccpars0([], {F, A});
  57. parse_and_scan({M, F, A}) ->
  58. yeccpars0([], {{M, F}, A}).
  59. format_error(Message) ->
  60. case io_lib:deep_char_list(Message) of
  61. true ->
  62. Message;
  63. _ ->
  64. io_lib:write(Message)
  65. end.
  66. % To be used in grammar files to throw an error message to the parser
  67. % toplevel. Doesn't have to be exported!
  68. -compile({nowarn_unused_function,{return_error,2}}).
  69. return_error(Line, Message) ->
  70. throw({error, {Line, ?MODULE, Message}}).
  71. yeccpars0(Tokens, MFA) ->
  72. try yeccpars1(Tokens, MFA, 0, [], [])
  73. catch
  74. throw: {error, {_Line, ?MODULE, _M}} = Error ->
  75. Error % probably from return_error/1
  76. end.
  77. % Don't change yeccpars1/6 too much, it is called recursively by yeccpars2/8!
  78. yeccpars1([Token | Tokens], Tokenizer, State, States, Vstack) ->
  79. yeccpars2(State, element(1, Token), States, Vstack, Token, Tokens,
  80. Tokenizer);
  81. yeccpars1([], {F, A}, State, States, Vstack) ->
  82. case apply(F, A) of
  83. {ok, Tokens, _Endline} ->
  84. yeccpars1(Tokens, {F, A}, State, States, Vstack);
  85. {eof, _Endline} ->
  86. yeccpars1([], false, State, States, Vstack);
  87. {error, Descriptor, _Endline} ->
  88. {error, Descriptor}
  89. end;
  90. yeccpars1([], false, State, States, Vstack) ->
  91. yeccpars2(State, '$end', States, Vstack, {'$end', 999999}, [], false).
  92. % For internal use only.
  93. yeccerror(Token) ->
  94. {error,
  95. {element(2, Token), ?MODULE,
  96. ["syntax error before: ", yecctoken2string(Token)]}}.
  97. yecctoken2string({atom, _, A}) -> io_lib:write(A);
  98. yecctoken2string({integer,_,N}) -> io_lib:write(N);
  99. yecctoken2string({float,_,F}) -> io_lib:write(F);
  100. yecctoken2string({char,_,C}) -> io_lib:write_char(C);
  101. yecctoken2string({var,_,V}) -> io_lib:format('~s', [V]);
  102. yecctoken2string({string,_,S}) -> io_lib:write_string(S);
  103. yecctoken2string({reserved_symbol, _, A}) -> io_lib:format('~w', [A]);
  104. yecctoken2string({_Cat, _, Val}) -> io_lib:format('~w', [Val]);
  105. yecctoken2string({'dot', _}) -> io_lib:format('~w', ['.']);
  106. yecctoken2string({'$end', _}) ->
  107. [];
  108. yecctoken2string({Other, _}) when is_atom(Other) ->
  109. io_lib:format('~w', [Other]);
  110. yecctoken2string(Other) ->
  111. io_lib:write(Other).
  112. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  113. -file("src/erlydtl/erlydtl_parser.erl", 137).
  114. yeccpars2(0, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  115. __NewStack = yeccpars2_0_(__Stack),
  116. yeccpars2(1, __Cat, [0 | __Ss], __NewStack, __T, __Ts, __Tzr);
  117. yeccpars2(1, '$end', _, __Stack, _, _, _) ->
  118. {ok, hd(__Stack)};
  119. yeccpars2(1, block, __Ss, __Stack, __T, __Ts, __Tzr) ->
  120. yeccpars1(__Ts, __Tzr, 3, [1 | __Ss], [__T | __Stack]);
  121. yeccpars2(1, extends, __Ss, __Stack, __T, __Ts, __Tzr) ->
  122. yeccpars1(__Ts, __Tzr, 4, [1 | __Ss], [__T | __Stack]);
  123. yeccpars2(1, for, __Ss, __Stack, __T, __Ts, __Tzr) ->
  124. yeccpars1(__Ts, __Tzr, 5, [1 | __Ss], [__T | __Stack]);
  125. yeccpars2(1, string, __Ss, __Stack, __T, __Ts, __Tzr) ->
  126. yeccpars1(__Ts, __Tzr, 6, [1 | __Ss], [__T | __Stack]);
  127. yeccpars2(1, tag, __Ss, __Stack, __T, __Ts, __Tzr) ->
  128. yeccpars1(__Ts, __Tzr, 7, [1 | __Ss], [__T | __Stack]);
  129. yeccpars2(1, var, __Ss, __Stack, __T, __Ts, __Tzr) ->
  130. yeccpars1(__Ts, __Tzr, 8, [1 | __Ss], [__T | __Stack]);
  131. yeccpars2(1, _, _, _, __T, _, _) ->
  132. yeccerror(__T);
  133. yeccpars2(2, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  134. __NewStack = yeccpars2_2_(__Stack),
  135. __Nss = lists:nthtail(1, __Ss),
  136. yeccpars2(yeccgoto('Elements', hd(__Nss)), __Cat, __Nss, __NewStack, __T, __Ts, __Tzr);
  137. yeccpars2(3, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  138. __NewStack = yeccpars2_3_(__Stack),
  139. yeccpars2(11, __Cat, [3 | __Ss], __NewStack, __T, __Ts, __Tzr);
  140. yeccpars2(4, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  141. __NewStack = yeccpars2_4_(__Stack),
  142. yeccpars2(yeccgoto('Element', hd(__Ss)), __Cat, __Ss, __NewStack, __T, __Ts, __Tzr);
  143. yeccpars2(5, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  144. __NewStack = yeccpars2_5_(__Stack),
  145. yeccpars2(9, __Cat, [5 | __Ss], __NewStack, __T, __Ts, __Tzr);
  146. yeccpars2(6, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  147. __NewStack = yeccpars2_6_(__Stack),
  148. yeccpars2(yeccgoto('Element', hd(__Ss)), __Cat, __Ss, __NewStack, __T, __Ts, __Tzr);
  149. yeccpars2(7, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  150. __NewStack = yeccpars2_7_(__Stack),
  151. yeccpars2(yeccgoto('Element', hd(__Ss)), __Cat, __Ss, __NewStack, __T, __Ts, __Tzr);
  152. yeccpars2(8, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  153. __NewStack = yeccpars2_8_(__Stack),
  154. yeccpars2(yeccgoto('Element', hd(__Ss)), __Cat, __Ss, __NewStack, __T, __Ts, __Tzr);
  155. yeccpars2(9, block, __Ss, __Stack, __T, __Ts, __Tzr) ->
  156. yeccpars1(__Ts, __Tzr, 3, [9 | __Ss], [__T | __Stack]);
  157. yeccpars2(9, endfor, __Ss, __Stack, __T, __Ts, __Tzr) ->
  158. yeccpars1(__Ts, __Tzr, 10, [9 | __Ss], [__T | __Stack]);
  159. yeccpars2(9, extends, __Ss, __Stack, __T, __Ts, __Tzr) ->
  160. yeccpars1(__Ts, __Tzr, 4, [9 | __Ss], [__T | __Stack]);
  161. yeccpars2(9, for, __Ss, __Stack, __T, __Ts, __Tzr) ->
  162. yeccpars1(__Ts, __Tzr, 5, [9 | __Ss], [__T | __Stack]);
  163. yeccpars2(9, string, __Ss, __Stack, __T, __Ts, __Tzr) ->
  164. yeccpars1(__Ts, __Tzr, 6, [9 | __Ss], [__T | __Stack]);
  165. yeccpars2(9, tag, __Ss, __Stack, __T, __Ts, __Tzr) ->
  166. yeccpars1(__Ts, __Tzr, 7, [9 | __Ss], [__T | __Stack]);
  167. yeccpars2(9, var, __Ss, __Stack, __T, __Ts, __Tzr) ->
  168. yeccpars1(__Ts, __Tzr, 8, [9 | __Ss], [__T | __Stack]);
  169. yeccpars2(9, _, _, _, __T, _, _) ->
  170. yeccerror(__T);
  171. yeccpars2(10, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  172. __NewStack = yeccpars2_10_(__Stack),
  173. __Nss = lists:nthtail(2, __Ss),
  174. yeccpars2(yeccgoto('Element', hd(__Nss)), __Cat, __Nss, __NewStack, __T, __Ts, __Tzr);
  175. yeccpars2(11, block, __Ss, __Stack, __T, __Ts, __Tzr) ->
  176. yeccpars1(__Ts, __Tzr, 3, [11 | __Ss], [__T | __Stack]);
  177. yeccpars2(11, endblock, __Ss, __Stack, __T, __Ts, __Tzr) ->
  178. yeccpars1(__Ts, __Tzr, 12, [11 | __Ss], [__T | __Stack]);
  179. yeccpars2(11, extends, __Ss, __Stack, __T, __Ts, __Tzr) ->
  180. yeccpars1(__Ts, __Tzr, 4, [11 | __Ss], [__T | __Stack]);
  181. yeccpars2(11, for, __Ss, __Stack, __T, __Ts, __Tzr) ->
  182. yeccpars1(__Ts, __Tzr, 5, [11 | __Ss], [__T | __Stack]);
  183. yeccpars2(11, string, __Ss, __Stack, __T, __Ts, __Tzr) ->
  184. yeccpars1(__Ts, __Tzr, 6, [11 | __Ss], [__T | __Stack]);
  185. yeccpars2(11, tag, __Ss, __Stack, __T, __Ts, __Tzr) ->
  186. yeccpars1(__Ts, __Tzr, 7, [11 | __Ss], [__T | __Stack]);
  187. yeccpars2(11, var, __Ss, __Stack, __T, __Ts, __Tzr) ->
  188. yeccpars1(__Ts, __Tzr, 8, [11 | __Ss], [__T | __Stack]);
  189. yeccpars2(11, _, _, _, __T, _, _) ->
  190. yeccerror(__T);
  191. yeccpars2(12, __Cat, __Ss, __Stack, __T, __Ts, __Tzr) ->
  192. __NewStack = yeccpars2_12_(__Stack),
  193. __Nss = lists:nthtail(2, __Ss),
  194. yeccpars2(yeccgoto('Element', hd(__Nss)), __Cat, __Nss, __NewStack, __T, __Ts, __Tzr);
  195. yeccpars2(__Other, _, _, _, _, _, _) ->
  196. erlang:error({yecc_bug,"1.1",{missing_state_in_action_table, __Other}}).
  197. yeccgoto('Element', 1) ->
  198. 2;
  199. yeccgoto('Element', 9) ->
  200. 2;
  201. yeccgoto('Element', 11) ->
  202. 2;
  203. yeccgoto('Elements', 0) ->
  204. 1;
  205. yeccgoto('Elements', 3) ->
  206. 11;
  207. yeccgoto('Elements', 5) ->
  208. 9;
  209. yeccgoto(__Symbol, __State) ->
  210. erlang:error({yecc_bug,"1.1",{__Symbol, __State, missing_in_goto_table}}).
  211. -compile({inline,{yeccpars2_0_,1}}).
  212. -file("src/erlydtl/erlydtl_parser.yrl", 54).
  213. yeccpars2_0_(__Stack) ->
  214. [begin
  215. nil
  216. end | __Stack].
  217. -compile({inline,{yeccpars2_2_,1}}).
  218. -file("src/erlydtl/erlydtl_parser.yrl", 55).
  219. yeccpars2_2_([__2,__1 | __Stack]) ->
  220. [begin
  221. [ __1 , __2 ]
  222. end | __Stack].
  223. -compile({inline,{yeccpars2_3_,1}}).
  224. -file("src/erlydtl/erlydtl_parser.yrl", 54).
  225. yeccpars2_3_(__Stack) ->
  226. [begin
  227. nil
  228. end | __Stack].
  229. -compile({inline,{yeccpars2_4_,1}}).
  230. -file("src/erlydtl/erlydtl_parser.yrl", 59).
  231. yeccpars2_4_([__1 | __Stack]) ->
  232. [begin
  233. extends ( __1 )
  234. end | __Stack].
  235. -compile({inline,{yeccpars2_5_,1}}).
  236. -file("src/erlydtl/erlydtl_parser.yrl", 54).
  237. yeccpars2_5_(__Stack) ->
  238. [begin
  239. nil
  240. end | __Stack].
  241. -compile({inline,{yeccpars2_6_,1}}).
  242. -file("src/erlydtl/erlydtl_parser.yrl", 57).
  243. yeccpars2_6_([__1 | __Stack]) ->
  244. [begin
  245. string ( __1 )
  246. end | __Stack].
  247. -compile({inline,{yeccpars2_7_,1}}).
  248. -file("src/erlydtl/erlydtl_parser.yrl", 61).
  249. yeccpars2_7_([__1 | __Stack]) ->
  250. [begin
  251. tag ( __1 )
  252. end | __Stack].
  253. -compile({inline,{yeccpars2_8_,1}}).
  254. -file("src/erlydtl/erlydtl_parser.yrl", 58).
  255. yeccpars2_8_([__1 | __Stack]) ->
  256. [begin
  257. var ( __1 )
  258. end | __Stack].
  259. -compile({inline,{yeccpars2_10_,1}}).
  260. -file("src/erlydtl/erlydtl_parser.yrl", 62).
  261. yeccpars2_10_([__3,__2,__1 | __Stack]) ->
  262. [begin
  263. for ( __1 , __2 )
  264. end | __Stack].
  265. -compile({inline,{yeccpars2_12_,1}}).
  266. -file("src/erlydtl/erlydtl_parser.yrl", 60).
  267. yeccpars2_12_([__3,__2,__1 | __Stack]) ->
  268. [begin
  269. block ( __1 , __2 )
  270. end | __Stack].
  271. -file("src/erlydtl/erlydtl_parser.yrl", 108).