erlydtl_parser.yrl 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. %%% -*- mode: erlang -*- ------------------------------------------------------------------
  2. %%% File: erlydtl_parser.erl
  3. %%% @author Roberto Saccon <rsaccon@gmail.com> [http://rsaccon.com]
  4. %%% @author Evan Miller <emmiller@gmail.com>
  5. %%% @copyright 2008 Roberto Saccon, Evan Miller
  6. %%% @doc Template language grammar
  7. %%% @reference See <a href="http://erlydtl.googlecode.com" target="_top">http://erlydtl.googlecode.com</a> for more information
  8. %%% @end
  9. %%%
  10. %%% The MIT License
  11. %%%
  12. %%% Copyright (c) 2007 Roberto Saccon, Evan Miller
  13. %%%
  14. %%% Permission is hereby granted, free of charge, to any person obtaining a copy
  15. %%% of this software and associated documentation files (the "Software"), to deal
  16. %%% in the Software without restriction, including without limitation the rights
  17. %%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  18. %%% copies of the Software, and to permit persons to whom the Software is
  19. %%% furnished to do so, subject to the following conditions:
  20. %%%
  21. %%% The above copyright notice and this permission notice shall be included in
  22. %%% all copies or substantial portions of the Software.
  23. %%%
  24. %%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  25. %%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  26. %%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  27. %%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  28. %%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  29. %%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  30. %%% THE SOFTWARE.
  31. %%%
  32. %%% @since 2007-11-11 by Roberto Saccon, Evan Miller
  33. %%%-------------------------------------------------------------------
  34. Nonterminals
  35. Elements
  36. Literal
  37. ValueBraced
  38. Value
  39. Values
  40. Variable
  41. Filter
  42. AutoEscapeBlock
  43. AutoEscapeBraced
  44. EndAutoEscapeBraced
  45. BlockBlock
  46. BlockBraced
  47. EndBlockBraced
  48. CommentBlock
  49. CommentBraced
  50. EndCommentBraced
  51. CycleTag
  52. CycleNames
  53. CycleNamesCompat
  54. ExtendsTag
  55. IncludeTag
  56. NowTag
  57. FirstofTag
  58. FilterBlock
  59. FilterBraced
  60. EndFilterBraced
  61. Filters
  62. ForBlock
  63. ForBraced
  64. EmptyBraced
  65. EndForBraced
  66. ForExpression
  67. ForGroup
  68. IfBlock
  69. IfBraced
  70. ElifBlock
  71. ElifBraced
  72. IfExpression
  73. ElseBraced
  74. EndIfBraced
  75. IfChangedBlock
  76. IfChangedBraced
  77. EndIfChangedBraced
  78. IfEqualBlock
  79. IfEqualBraced
  80. IfEqualExpression
  81. EndIfEqualBraced
  82. IfNotEqualBlock
  83. IfNotEqualBraced
  84. IfNotEqualExpression
  85. EndIfNotEqualBraced
  86. CustomTag
  87. Args
  88. RegroupBlock
  89. RegroupBraced
  90. EndRegroupBraced
  91. SpacelessBlock
  92. SSITag
  93. BlockTransBlock
  94. TransTag
  95. TemplatetagTag
  96. Templatetag
  97. WidthRatioTag
  98. WithBlock
  99. WithBraced
  100. EndWithBraced
  101. CallTag
  102. CallWithTag
  103. Unot.
  104. Terminals
  105. and_keyword
  106. as_keyword
  107. autoescape_keyword
  108. block_keyword
  109. blocktrans_keyword
  110. by_keyword
  111. call_keyword
  112. close_tag
  113. close_var
  114. comment_keyword
  115. cycle_keyword
  116. elif_keyword
  117. else_keyword
  118. empty_keyword
  119. endautoescape_keyword
  120. endblock_keyword
  121. endblocktrans_keyword
  122. endcomment_keyword
  123. endfilter_keyword
  124. endfor_keyword
  125. endif_keyword
  126. endifchanged_keyword
  127. endifequal_keyword
  128. endifnotequal_keyword
  129. endregroup_keyword
  130. endspaceless_keyword
  131. endwith_keyword
  132. extends_keyword
  133. filter_keyword
  134. firstof_keyword
  135. for_keyword
  136. identifier
  137. if_keyword
  138. ifchanged_keyword
  139. ifequal_keyword
  140. ifnotequal_keyword
  141. in_keyword
  142. include_keyword
  143. noop_keyword
  144. not_keyword
  145. now_keyword
  146. number_literal
  147. only_keyword
  148. or_keyword
  149. open_tag
  150. open_var
  151. parsed_keyword
  152. regroup_keyword
  153. reversed_keyword
  154. spaceless_keyword
  155. ssi_keyword
  156. string_literal
  157. string
  158. templatetag_keyword
  159. openblock_keyword
  160. closeblock_keyword
  161. openvariable_keyword
  162. closevariable_keyword
  163. openbrace_keyword
  164. closebrace_keyword
  165. opencomment_keyword
  166. closecomment_keyword
  167. trans_keyword
  168. widthratio_keyword
  169. with_keyword
  170. ',' '|' '=' ':' '.'
  171. '==' '!='
  172. '>=' '<='
  173. '>' '<'
  174. '(' ')'
  175. '_'.
  176. Rootsymbol
  177. Elements.
  178. %% Operator precedences for the E non terminal
  179. Left 100 or_keyword.
  180. Left 110 and_keyword.
  181. Nonassoc 300 '==' '!=' '>=' '<=' '>' '<'.
  182. Unary 600 Unot.
  183. Elements -> '$empty' : [].
  184. Elements -> Elements string : '$1' ++ ['$2'].
  185. Elements -> Elements AutoEscapeBlock : '$1' ++ ['$2'].
  186. Elements -> Elements BlockBlock : '$1' ++ ['$2'].
  187. Elements -> Elements BlockTransBlock : '$1' ++ ['$2'].
  188. Elements -> Elements CallTag : '$1' ++ ['$2'].
  189. Elements -> Elements CallWithTag : '$1' ++ ['$2'].
  190. Elements -> Elements CommentBlock : '$1' ++ ['$2'].
  191. Elements -> Elements CustomTag : '$1' ++ ['$2'].
  192. Elements -> Elements CycleTag : '$1' ++ ['$2'].
  193. Elements -> Elements ExtendsTag : '$1' ++ ['$2'].
  194. Elements -> Elements FilterBlock : '$1' ++ ['$2'].
  195. Elements -> Elements FirstofTag : '$1' ++ ['$2'].
  196. Elements -> Elements ForBlock : '$1' ++ ['$2'].
  197. Elements -> Elements IfBlock : '$1' ++ ['$2'].
  198. Elements -> Elements IfEqualBlock : '$1' ++ ['$2'].
  199. Elements -> Elements IfNotEqualBlock : '$1' ++ ['$2'].
  200. Elements -> Elements IfChangedBlock : '$1' ++ ['$2'].
  201. Elements -> Elements IncludeTag : '$1' ++ ['$2'].
  202. Elements -> Elements NowTag : '$1' ++ ['$2'].
  203. Elements -> Elements RegroupBlock : '$1' ++ ['$2'].
  204. Elements -> Elements SpacelessBlock : '$1' ++ ['$2'].
  205. Elements -> Elements SSITag : '$1' ++ ['$2'].
  206. Elements -> Elements TemplatetagTag : '$1' ++ ['$2'].
  207. Elements -> Elements TransTag : '$1' ++ ['$2'].
  208. Elements -> Elements ValueBraced : '$1' ++ ['$2'].
  209. Elements -> Elements WidthRatioTag : '$1' ++ ['$2'].
  210. Elements -> Elements WithBlock : '$1' ++ ['$2'].
  211. ValueBraced -> open_var Value close_var : '$2'.
  212. Value -> Value '|' Filter : {apply_filter, '$1', '$3'}.
  213. Value -> '_' '(' Value ')' : {trans, '$3'}.
  214. Value -> Variable : '$1'.
  215. Value -> Literal : '$1'.
  216. Values -> Value : ['$1'].
  217. Values -> Values Value : '$1' ++ ['$2'].
  218. Variable -> identifier : {variable, '$1'}.
  219. Variable -> Variable '.' identifier : {attribute, {'$3', '$1'}}.
  220. AutoEscapeBlock -> AutoEscapeBraced Elements EndAutoEscapeBraced : {autoescape, '$1', '$2'}.
  221. AutoEscapeBraced -> open_tag autoescape_keyword identifier close_tag : '$3'.
  222. EndAutoEscapeBraced -> open_tag endautoescape_keyword close_tag.
  223. BlockBlock -> BlockBraced Elements EndBlockBraced : {block, '$1', '$2'}.
  224. BlockBraced -> open_tag block_keyword identifier close_tag : '$3'.
  225. EndBlockBraced -> open_tag endblock_keyword close_tag.
  226. ExtendsTag -> open_tag extends_keyword string_literal close_tag : {extends, '$3'}.
  227. IncludeTag -> open_tag include_keyword string_literal close_tag : {include, '$3', []}.
  228. IncludeTag -> open_tag include_keyword string_literal with_keyword Args close_tag : {include, '$3', '$5'}.
  229. IncludeTag -> open_tag include_keyword string_literal only_keyword close_tag : {include_only, '$3', []}.
  230. IncludeTag -> open_tag include_keyword string_literal with_keyword Args only_keyword close_tag : {include_only, '$3', '$5'}.
  231. NowTag -> open_tag now_keyword string_literal close_tag : {date, now, '$3'}.
  232. CommentBlock -> CommentBraced Elements EndCommentBraced : {comment, '$2'}.
  233. CommentBraced -> open_tag comment_keyword close_tag.
  234. EndCommentBraced -> open_tag endcomment_keyword close_tag.
  235. CycleTag -> open_tag cycle_keyword CycleNamesCompat close_tag : {cycle_compat, '$3'}.
  236. CycleTag -> open_tag cycle_keyword CycleNames close_tag : {cycle, '$3'}.
  237. CycleNames -> Value : ['$1'].
  238. CycleNames -> CycleNames Value : '$1' ++ ['$2'].
  239. CycleNamesCompat -> identifier ',' : ['$1'].
  240. CycleNamesCompat -> CycleNamesCompat identifier ',' : '$1' ++ ['$2'].
  241. CycleNamesCompat -> CycleNamesCompat identifier : '$1' ++ ['$2'].
  242. FilterBlock -> FilterBraced Elements EndFilterBraced : {filter, '$1', '$2'}.
  243. FilterBraced -> open_tag filter_keyword Filters close_tag : '$3'.
  244. EndFilterBraced -> open_tag endfilter_keyword close_tag.
  245. Filters -> Filter : ['$1'].
  246. Filters -> Filters '|' Filter : '$1' ++ ['$3'].
  247. FirstofTag -> open_tag firstof_keyword Values close_tag : {firstof, '$3'}.
  248. ForBlock -> ForBraced Elements EndForBraced : {for, '$1', '$2'}.
  249. ForBlock -> ForBraced Elements EmptyBraced Elements EndForBraced : {for, '$1', '$2', '$4'}.
  250. EmptyBraced -> open_tag empty_keyword close_tag.
  251. ForBraced -> open_tag for_keyword ForExpression close_tag : '$3'.
  252. EndForBraced -> open_tag endfor_keyword close_tag.
  253. ForExpression -> ForGroup in_keyword Variable : {'in', '$1', '$3', false}.
  254. ForExpression -> ForGroup in_keyword Variable reversed_keyword : {'in', '$1', '$3', true}.
  255. ForGroup -> identifier : ['$1'].
  256. ForGroup -> ForGroup ',' identifier : '$1' ++ ['$3'].
  257. IfBlock -> IfBraced Elements ElseBraced Elements EndIfBraced : {'ifelse', '$1', '$2', '$4'}.
  258. IfBlock -> IfBraced Elements EndIfBraced : {'if', '$1', '$2'}.
  259. IfBlock -> IfBraced Elements ElifBlock : {'if', '$1', '$2', ['$3']}.
  260. ElifBlock -> ElifBraced Elements ElseBraced Elements EndIfBraced : {'ifelse', '$1', '$2', '$4'}.
  261. ElifBlock -> ElifBraced Elements EndIfBraced : {'if', '$1', '$2'}.
  262. ElifBlock -> ElifBraced Elements ElifBlock : {'if', '$1', '$2', ['$3']}.
  263. IfBraced -> open_tag if_keyword IfExpression close_tag : '$3'.
  264. ElifBraced -> open_tag elif_keyword IfExpression close_tag : '$3'.
  265. IfExpression -> Value in_keyword Value : {'expr', "in", '$1', '$3'}.
  266. IfExpression -> Value not_keyword in_keyword Value : {'expr', "not", {'expr', "in", '$1', '$4'}}.
  267. IfExpression -> Value '==' Value : {'expr', "eq", '$1', '$3'}.
  268. IfExpression -> Value '!=' Value : {'expr', "ne", '$1', '$3'}.
  269. IfExpression -> Value '>=' Value : {'expr', "ge", '$1', '$3'}.
  270. IfExpression -> Value '<=' Value : {'expr', "le", '$1', '$3'}.
  271. IfExpression -> Value '>' Value : {'expr', "gt", '$1', '$3'}.
  272. IfExpression -> Value '<' Value : {'expr', "lt", '$1', '$3'}.
  273. IfExpression -> '(' IfExpression ')' : '$2'.
  274. IfExpression -> Unot : '$1'.
  275. IfExpression -> IfExpression or_keyword IfExpression : {'expr', "or", '$1', '$3'}.
  276. IfExpression -> IfExpression and_keyword IfExpression : {'expr', "and", '$1', '$3'}.
  277. IfExpression -> Value : '$1'.
  278. Unot -> not_keyword IfExpression : {expr, "not", '$2'}.
  279. ElseBraced -> open_tag else_keyword close_tag.
  280. EndIfBraced -> open_tag endif_keyword close_tag.
  281. IfChangedBlock -> IfChangedBraced Elements ElseBraced Elements EndIfChangedBraced : {ifchangedelse, '$1', '$2', '$4'}.
  282. IfChangedBlock -> IfChangedBraced Elements EndIfChangedBraced : {ifchanged, '$1', '$2'}.
  283. IfChangedBraced -> open_tag ifchanged_keyword close_tag.
  284. IfChangedBraced -> open_tag ifchanged_keyword Values close_tag : '$3'.
  285. EndIfChangedBraced -> open_tag endifchanged_keyword close_tag.
  286. IfEqualBlock -> IfEqualBraced Elements ElseBraced Elements EndIfEqualBraced : {ifequalelse, '$1', '$2', '$4'}.
  287. IfEqualBlock -> IfEqualBraced Elements EndIfEqualBraced : {ifequal, '$1', '$2'}.
  288. IfEqualBraced -> open_tag ifequal_keyword IfEqualExpression Value close_tag : ['$3', '$4'].
  289. IfEqualExpression -> Value : '$1'.
  290. EndIfEqualBraced -> open_tag endifequal_keyword close_tag.
  291. IfNotEqualBlock -> IfNotEqualBraced Elements ElseBraced Elements EndIfNotEqualBraced : {ifnotequalelse, '$1', '$2', '$4'}.
  292. IfNotEqualBlock -> IfNotEqualBraced Elements EndIfNotEqualBraced : {ifnotequal, '$1', '$2'}.
  293. IfNotEqualBraced -> open_tag ifnotequal_keyword IfNotEqualExpression Value close_tag : ['$3', '$4'].
  294. IfNotEqualExpression -> Value : '$1'.
  295. EndIfNotEqualBraced -> open_tag endifnotequal_keyword close_tag.
  296. RegroupBlock -> RegroupBraced Elements EndRegroupBraced : {regroup, '$1', '$2'}.
  297. RegroupBraced -> open_tag regroup_keyword Value by_keyword Value as_keyword identifier close_tag : {'$3', '$5', '$7'}.
  298. EndRegroupBraced -> open_tag endregroup_keyword close_tag.
  299. SpacelessBlock -> open_tag spaceless_keyword close_tag Elements open_tag endspaceless_keyword close_tag : {spaceless, '$4'}.
  300. SSITag -> open_tag ssi_keyword Value close_tag : {ssi, '$3'}.
  301. SSITag -> open_tag ssi_keyword string_literal parsed_keyword close_tag : {ssi_parsed, '$3'}.
  302. BlockTransBlock -> open_tag blocktrans_keyword close_tag Elements open_tag endblocktrans_keyword close_tag : {blocktrans, [], '$4'}.
  303. BlockTransBlock -> open_tag blocktrans_keyword with_keyword Args close_tag Elements open_tag endblocktrans_keyword close_tag : {blocktrans, '$4', '$6'}.
  304. TemplatetagTag -> open_tag templatetag_keyword Templatetag close_tag : {templatetag, '$3'}.
  305. Templatetag -> openblock_keyword : '$1'.
  306. Templatetag -> closeblock_keyword : '$1'.
  307. Templatetag -> openvariable_keyword : '$1'.
  308. Templatetag -> closevariable_keyword : '$1'.
  309. Templatetag -> openbrace_keyword : '$1'.
  310. Templatetag -> closebrace_keyword : '$1'.
  311. Templatetag -> opencomment_keyword : '$1'.
  312. Templatetag -> closecomment_keyword : '$1'.
  313. TransTag -> open_tag trans_keyword string_literal close_tag : {trans, '$3'}.
  314. TransTag -> open_tag trans_keyword Variable close_tag : {trans, '$3'}.
  315. TransTag -> open_tag trans_keyword string_literal noop_keyword close_tag : '$3'.
  316. TransTag -> open_tag trans_keyword Variable noop_keyword close_tag : '$3'.
  317. WidthRatioTag -> open_tag widthratio_keyword Value Value number_literal close_tag : {widthratio, '$3', '$4', '$5'}.
  318. WithBlock -> WithBraced Elements EndWithBraced : {with, '$1', '$2'}.
  319. WithBraced -> open_tag with_keyword Args close_tag : '$3'.
  320. EndWithBraced -> open_tag endwith_keyword close_tag.
  321. Filter -> identifier : ['$1'].
  322. Filter -> identifier ':' Literal : ['$1', '$3'].
  323. Filter -> identifier ':' Variable : ['$1', '$3'].
  324. Literal -> string_literal : '$1'.
  325. Literal -> number_literal : '$1'.
  326. CustomTag -> open_tag identifier Args close_tag : {tag, '$2', '$3'}.
  327. Args -> '$empty' : [].
  328. Args -> Args identifier '=' Value : '$1' ++ [{'$2', '$4'}].
  329. CallTag -> open_tag call_keyword identifier close_tag : {call, '$3'}.
  330. CallWithTag -> open_tag call_keyword identifier with_keyword Value close_tag : {call, '$3', '$5'}.
  331. %% vim: syntax=erlang