grammar.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. /*
  2. * This file is part of the MicroPython project, http://micropython.org/
  3. *
  4. * The MIT License (MIT)
  5. *
  6. * Copyright (c) 2013-2015 Damien P. George
  7. *
  8. * Permission is hereby granted, free of charge, to any person obtaining a copy
  9. * of this software and associated documentation files (the "Software"), to deal
  10. * in the Software without restriction, including without limitation the rights
  11. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  12. * copies of the Software, and to permit persons to whom the Software is
  13. * furnished to do so, subject to the following conditions:
  14. *
  15. * The above copyright notice and this permission notice shall be included in
  16. * all copies or substantial portions of the Software.
  17. *
  18. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  19. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  20. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  21. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  22. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  23. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  24. * THE SOFTWARE.
  25. */
  26. // rules for writing rules:
  27. // - zero_or_more is implemented using opt_rule around a one_or_more rule
  28. // - don't put opt_rule in arguments of or rule; instead, wrap the call to this or rule in opt_rule
  29. // # Start symbols for the grammar:
  30. // # single_input is a single interactive statement;
  31. // # file_input is a module or sequence of commands read from an input file;
  32. // # eval_input is the input for the eval() functions.
  33. // # NB: compound_stmt in single_input is followed by extra NEWLINE! --> not in MicroPython
  34. // single_input: NEWLINE | simple_stmt | compound_stmt
  35. // file_input: (NEWLINE | stmt)* ENDMARKER
  36. // eval_input: testlist NEWLINE* ENDMARKER
  37. DEF_RULE_NC(single_input, or(3), tok(NEWLINE), rule(simple_stmt), rule(compound_stmt))
  38. DEF_RULE(file_input, c(generic_all_nodes), and_ident(1), opt_rule(file_input_2))
  39. DEF_RULE(file_input_2, c(generic_all_nodes), one_or_more, rule(file_input_3))
  40. DEF_RULE_NC(file_input_3, or(2), tok(NEWLINE), rule(stmt))
  41. DEF_RULE_NC(eval_input, and_ident(2), rule(testlist), opt_rule(eval_input_2))
  42. DEF_RULE_NC(eval_input_2, and(1), tok(NEWLINE))
  43. // decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
  44. // decorators: decorator+
  45. // decorated: decorators (classdef | funcdef | async_funcdef)
  46. // funcdef: 'def' NAME parameters ['->' test] ':' suite
  47. // async_funcdef: 'async' funcdef
  48. // parameters: '(' [typedargslist] ')'
  49. // typedargslist: tfpdef ['=' test] (',' tfpdef ['=' test])* [',' ['*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] | '**' tfpdef]] | '*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] | '**' tfpdef
  50. // tfpdef: NAME [':' test]
  51. // varargslist: vfpdef ['=' test] (',' vfpdef ['=' test])* [',' ['*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef] | '**' vfpdef]] | '*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef] | '**' vfpdef
  52. // vfpdef: NAME
  53. DEF_RULE_NC(decorator, and(4), tok(DEL_AT), rule(dotted_name), opt_rule(trailer_paren), tok(NEWLINE))
  54. DEF_RULE_NC(decorators, one_or_more, rule(decorator))
  55. DEF_RULE(decorated, c(decorated), and_ident(2), rule(decorators), rule(decorated_body))
  56. #if MICROPY_PY_ASYNC_AWAIT
  57. DEF_RULE_NC(decorated_body, or(3), rule(classdef), rule(funcdef), rule(async_funcdef))
  58. DEF_RULE_NC(async_funcdef, and(2), tok(KW_ASYNC), rule(funcdef))
  59. #else
  60. DEF_RULE_NC(decorated_body, or(2), rule(classdef), rule(funcdef))
  61. #endif
  62. DEF_RULE(funcdef, c(funcdef), and_blank(8), tok(KW_DEF), tok(NAME), tok(DEL_PAREN_OPEN), opt_rule(typedargslist), tok(DEL_PAREN_CLOSE), opt_rule(funcdefrettype), tok(DEL_COLON), rule(suite))
  63. DEF_RULE_NC(funcdefrettype, and_ident(2), tok(DEL_MINUS_MORE), rule(test))
  64. // note: typedargslist lets through more than is allowed, compiler does further checks
  65. DEF_RULE_NC(typedargslist, list_with_end, rule(typedargslist_item), tok(DEL_COMMA))
  66. DEF_RULE_NC(typedargslist_item, or(3), rule(typedargslist_name), rule(typedargslist_star), rule(typedargslist_dbl_star))
  67. DEF_RULE_NC(typedargslist_name, and_ident(3), tok(NAME), opt_rule(typedargslist_colon), opt_rule(typedargslist_equal))
  68. DEF_RULE_NC(typedargslist_star, and(2), tok(OP_STAR), opt_rule(tfpdef))
  69. DEF_RULE_NC(typedargslist_dbl_star, and(3), tok(OP_DBL_STAR), tok(NAME), opt_rule(typedargslist_colon))
  70. DEF_RULE_NC(typedargslist_colon, and_ident(2), tok(DEL_COLON), rule(test))
  71. DEF_RULE_NC(typedargslist_equal, and_ident(2), tok(DEL_EQUAL), rule(test))
  72. DEF_RULE_NC(tfpdef, and(2), tok(NAME), opt_rule(typedargslist_colon))
  73. // note: varargslist lets through more than is allowed, compiler does further checks
  74. DEF_RULE_NC(varargslist, list_with_end, rule(varargslist_item), tok(DEL_COMMA))
  75. DEF_RULE_NC(varargslist_item, or(3), rule(varargslist_name), rule(varargslist_star), rule(varargslist_dbl_star))
  76. DEF_RULE_NC(varargslist_name, and_ident(2), tok(NAME), opt_rule(varargslist_equal))
  77. DEF_RULE_NC(varargslist_star, and(2), tok(OP_STAR), opt_rule(vfpdef))
  78. DEF_RULE_NC(varargslist_dbl_star, and(2), tok(OP_DBL_STAR), tok(NAME))
  79. DEF_RULE_NC(varargslist_equal, and_ident(2), tok(DEL_EQUAL), rule(test))
  80. DEF_RULE_NC(vfpdef, and_ident(1), tok(NAME))
  81. // stmt: compound_stmt | simple_stmt
  82. DEF_RULE_NC(stmt, or(2), rule(compound_stmt), rule(simple_stmt))
  83. // simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
  84. DEF_RULE_NC(simple_stmt, and_ident(2), rule(simple_stmt_2), tok(NEWLINE))
  85. DEF_RULE(simple_stmt_2, c(generic_all_nodes), list_with_end, rule(small_stmt), tok(DEL_SEMICOLON))
  86. // small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
  87. // expr_stmt: testlist_star_expr (augassign (yield_expr|testlist) | ('=' (yield_expr|testlist_star_expr))*)
  88. // testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [',']
  89. // augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>>=' | '**=' | '//='
  90. // # For normal assignments, additional restrictions enforced by the interpreter
  91. DEF_RULE_NC(small_stmt, or(8), rule(del_stmt), rule(pass_stmt), rule(flow_stmt), rule(import_stmt), rule(global_stmt), rule(nonlocal_stmt), rule(assert_stmt), rule(expr_stmt))
  92. DEF_RULE(expr_stmt, c(expr_stmt), and(2), rule(testlist_star_expr), opt_rule(expr_stmt_2))
  93. DEF_RULE_NC(expr_stmt_2, or(2), rule(expr_stmt_augassign), rule(expr_stmt_assign_list))
  94. DEF_RULE_NC(expr_stmt_augassign, and_ident(2), rule(augassign), rule(expr_stmt_6))
  95. DEF_RULE_NC(expr_stmt_assign_list, one_or_more, rule(expr_stmt_assign))
  96. DEF_RULE_NC(expr_stmt_assign, and_ident(2), tok(DEL_EQUAL), rule(expr_stmt_6))
  97. DEF_RULE_NC(expr_stmt_6, or(2), rule(yield_expr), rule(testlist_star_expr))
  98. DEF_RULE(testlist_star_expr, c(generic_tuple), list_with_end, rule(testlist_star_expr_2), tok(DEL_COMMA))
  99. DEF_RULE_NC(testlist_star_expr_2, or(2), rule(star_expr), rule(test))
  100. DEF_RULE_NC(augassign, or(12), tok(DEL_PLUS_EQUAL), tok(DEL_MINUS_EQUAL), tok(DEL_STAR_EQUAL), tok(DEL_SLASH_EQUAL), tok(DEL_PERCENT_EQUAL), tok(DEL_AMPERSAND_EQUAL), tok(DEL_PIPE_EQUAL), tok(DEL_CARET_EQUAL), tok(DEL_DBL_LESS_EQUAL), tok(DEL_DBL_MORE_EQUAL), tok(DEL_DBL_STAR_EQUAL), tok(DEL_DBL_SLASH_EQUAL))
  101. // del_stmt: 'del' exprlist
  102. // pass_stmt: 'pass'
  103. // flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt
  104. // break_stmt: 'break'
  105. // continue_stmt: 'continue'
  106. // return_stmt: 'return' [testlist]
  107. // yield_stmt: yield_expr
  108. // raise_stmt: 'raise' [test ['from' test]]
  109. DEF_RULE(del_stmt, c(del_stmt), and(2), tok(KW_DEL), rule(exprlist))
  110. DEF_RULE(pass_stmt, c(generic_all_nodes), and(1), tok(KW_PASS))
  111. DEF_RULE_NC(flow_stmt, or(5), rule(break_stmt), rule(continue_stmt), rule(return_stmt), rule(raise_stmt), rule(yield_stmt))
  112. DEF_RULE(break_stmt, c(break_cont_stmt), and(1), tok(KW_BREAK))
  113. DEF_RULE(continue_stmt, c(break_cont_stmt), and(1), tok(KW_CONTINUE))
  114. DEF_RULE(return_stmt, c(return_stmt), and(2), tok(KW_RETURN), opt_rule(testlist))
  115. DEF_RULE(yield_stmt, c(yield_stmt), and(1), rule(yield_expr))
  116. DEF_RULE(raise_stmt, c(raise_stmt), and(2), tok(KW_RAISE), opt_rule(raise_stmt_arg))
  117. DEF_RULE_NC(raise_stmt_arg, and_ident(2), rule(test), opt_rule(raise_stmt_from))
  118. DEF_RULE_NC(raise_stmt_from, and_ident(2), tok(KW_FROM), rule(test))
  119. // import_stmt: import_name | import_from
  120. // import_name: 'import' dotted_as_names
  121. // import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+) 'import' ('*' | '(' import_as_names ')' | import_as_names)
  122. // import_as_name: NAME ['as' NAME]
  123. // dotted_as_name: dotted_name ['as' NAME]
  124. // import_as_names: import_as_name (',' import_as_name)* [',']
  125. // dotted_as_names: dotted_as_name (',' dotted_as_name)*
  126. // dotted_name: NAME ('.' NAME)*
  127. // global_stmt: 'global' NAME (',' NAME)*
  128. // nonlocal_stmt: 'nonlocal' NAME (',' NAME)*
  129. // assert_stmt: 'assert' test [',' test]
  130. DEF_RULE_NC(import_stmt, or(2), rule(import_name), rule(import_from))
  131. DEF_RULE(import_name, c(import_name), and(2), tok(KW_IMPORT), rule(dotted_as_names))
  132. DEF_RULE(import_from, c(import_from), and(4), tok(KW_FROM), rule(import_from_2), tok(KW_IMPORT), rule(import_from_3))
  133. DEF_RULE_NC(import_from_2, or(2), rule(dotted_name), rule(import_from_2b))
  134. DEF_RULE_NC(import_from_2b, and_ident(2), rule(one_or_more_period_or_ellipsis), opt_rule(dotted_name))
  135. DEF_RULE_NC(import_from_3, or(3), tok(OP_STAR), rule(import_as_names_paren), rule(import_as_names))
  136. DEF_RULE_NC(import_as_names_paren, and_ident(3), tok(DEL_PAREN_OPEN), rule(import_as_names), tok(DEL_PAREN_CLOSE))
  137. DEF_RULE_NC(one_or_more_period_or_ellipsis, one_or_more, rule(period_or_ellipsis))
  138. DEF_RULE_NC(period_or_ellipsis, or(2), tok(DEL_PERIOD), tok(ELLIPSIS))
  139. DEF_RULE_NC(import_as_name, and(2), tok(NAME), opt_rule(as_name))
  140. DEF_RULE_NC(dotted_as_name, and_ident(2), rule(dotted_name), opt_rule(as_name))
  141. DEF_RULE_NC(as_name, and_ident(2), tok(KW_AS), tok(NAME))
  142. DEF_RULE_NC(import_as_names, list_with_end, rule(import_as_name), tok(DEL_COMMA))
  143. DEF_RULE_NC(dotted_as_names, list, rule(dotted_as_name), tok(DEL_COMMA))
  144. DEF_RULE_NC(dotted_name, list, tok(NAME), tok(DEL_PERIOD))
  145. DEF_RULE(global_stmt, c(global_nonlocal_stmt), and(2), tok(KW_GLOBAL), rule(name_list))
  146. DEF_RULE(nonlocal_stmt, c(global_nonlocal_stmt), and(2), tok(KW_NONLOCAL), rule(name_list))
  147. DEF_RULE_NC(name_list, list, tok(NAME), tok(DEL_COMMA))
  148. DEF_RULE(assert_stmt, c(assert_stmt), and(3), tok(KW_ASSERT), rule(test), opt_rule(assert_stmt_extra))
  149. DEF_RULE_NC(assert_stmt_extra, and_ident(2), tok(DEL_COMMA), rule(test))
  150. // compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated | async_stmt
  151. // if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
  152. // while_stmt: 'while' test ':' suite ['else' ':' suite]
  153. // for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite]
  154. // try_stmt: 'try' ':' suite ((except_clause ':' suite)+ ['else' ':' suite] ['finally' ':' suite] | 'finally' ':' suite)
  155. // # NB compile.c makes sure that the default except clause is last
  156. // except_clause: 'except' [test ['as' NAME]]
  157. // with_stmt: 'with' with_item (',' with_item)* ':' suite
  158. // with_item: test ['as' expr]
  159. // suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT
  160. // async_stmt: 'async' (funcdef | with_stmt | for_stmt)
  161. #if MICROPY_PY_ASYNC_AWAIT
  162. DEF_RULE_NC(compound_stmt, or(9), rule(if_stmt), rule(while_stmt), rule(for_stmt), rule(try_stmt), rule(with_stmt), rule(funcdef), rule(classdef), rule(decorated), rule(async_stmt))
  163. DEF_RULE(async_stmt, c(async_stmt), and(2), tok(KW_ASYNC), rule(async_stmt_2))
  164. DEF_RULE_NC(async_stmt_2, or(3), rule(funcdef), rule(with_stmt), rule(for_stmt))
  165. #else
  166. DEF_RULE_NC(compound_stmt, or(8), rule(if_stmt), rule(while_stmt), rule(for_stmt), rule(try_stmt), rule(with_stmt), rule(funcdef), rule(classdef), rule(decorated))
  167. #endif
  168. DEF_RULE(if_stmt, c(if_stmt), and(6), tok(KW_IF), rule(test), tok(DEL_COLON), rule(suite), opt_rule(if_stmt_elif_list), opt_rule(else_stmt))
  169. DEF_RULE_NC(if_stmt_elif_list, one_or_more, rule(if_stmt_elif))
  170. DEF_RULE_NC(if_stmt_elif, and(4), tok(KW_ELIF), rule(test), tok(DEL_COLON), rule(suite))
  171. DEF_RULE(while_stmt, c(while_stmt), and(5), tok(KW_WHILE), rule(test), tok(DEL_COLON), rule(suite), opt_rule(else_stmt))
  172. DEF_RULE(for_stmt, c(for_stmt), and(7), tok(KW_FOR), rule(exprlist), tok(KW_IN), rule(testlist), tok(DEL_COLON), rule(suite), opt_rule(else_stmt))
  173. DEF_RULE(try_stmt, c(try_stmt), and(4), tok(KW_TRY), tok(DEL_COLON), rule(suite), rule(try_stmt_2))
  174. DEF_RULE_NC(try_stmt_2, or(2), rule(try_stmt_except_and_more), rule(try_stmt_finally))
  175. DEF_RULE_NC(try_stmt_except_and_more, and_ident(3), rule(try_stmt_except_list), opt_rule(else_stmt), opt_rule(try_stmt_finally))
  176. DEF_RULE_NC(try_stmt_except, and(4), tok(KW_EXCEPT), opt_rule(try_stmt_as_name), tok(DEL_COLON), rule(suite))
  177. DEF_RULE_NC(try_stmt_as_name, and_ident(2), rule(test), opt_rule(as_name))
  178. DEF_RULE_NC(try_stmt_except_list, one_or_more, rule(try_stmt_except))
  179. DEF_RULE_NC(try_stmt_finally, and(3), tok(KW_FINALLY), tok(DEL_COLON), rule(suite))
  180. DEF_RULE_NC(else_stmt, and_ident(3), tok(KW_ELSE), tok(DEL_COLON), rule(suite))
  181. DEF_RULE(with_stmt, c(with_stmt), and(4), tok(KW_WITH), rule(with_stmt_list), tok(DEL_COLON), rule(suite))
  182. DEF_RULE_NC(with_stmt_list, list, rule(with_item), tok(DEL_COMMA))
  183. DEF_RULE_NC(with_item, and_ident(2), rule(test), opt_rule(with_item_as))
  184. DEF_RULE_NC(with_item_as, and_ident(2), tok(KW_AS), rule(expr))
  185. DEF_RULE_NC(suite, or(2), rule(suite_block), rule(simple_stmt))
  186. DEF_RULE_NC(suite_block, and_ident(4), tok(NEWLINE), tok(INDENT), rule(suite_block_stmts), tok(DEDENT))
  187. DEF_RULE(suite_block_stmts, c(generic_all_nodes), one_or_more, rule(stmt))
  188. // test: or_test ['if' or_test 'else' test] | lambdef
  189. // test_nocond: or_test | lambdef_nocond
  190. // lambdef: 'lambda' [varargslist] ':' test
  191. // lambdef_nocond: 'lambda' [varargslist] ':' test_nocond
  192. DEF_RULE_NC(test, or(2), rule(lambdef), rule(test_if_expr))
  193. DEF_RULE(test_if_expr, c(test_if_expr), and_ident(2), rule(or_test), opt_rule(test_if_else))
  194. DEF_RULE_NC(test_if_else, and(4), tok(KW_IF), rule(or_test), tok(KW_ELSE), rule(test))
  195. DEF_RULE_NC(test_nocond, or(2), rule(lambdef_nocond), rule(or_test))
  196. DEF_RULE(lambdef, c(lambdef), and_blank(4), tok(KW_LAMBDA), opt_rule(varargslist), tok(DEL_COLON), rule(test))
  197. DEF_RULE(lambdef_nocond, c(lambdef), and_blank(4), tok(KW_LAMBDA), opt_rule(varargslist), tok(DEL_COLON), rule(test_nocond))
  198. // or_test: and_test ('or' and_test)*
  199. // and_test: not_test ('and' not_test)*
  200. // not_test: 'not' not_test | comparison
  201. // comparison: expr (comp_op expr)*
  202. // comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'|'is' 'not'
  203. // star_expr: '*' expr
  204. // expr: xor_expr ('|' xor_expr)*
  205. // xor_expr: and_expr ('^' and_expr)*
  206. // and_expr: shift_expr ('&' shift_expr)*
  207. // shift_expr: arith_expr (('<<'|'>>') arith_expr)*
  208. // arith_expr: term (('+'|'-') term)*
  209. // term: factor (('*'|'/'|'%'|'//') factor)*
  210. // factor: ('+'|'-'|'~') factor | power
  211. // power: atom_expr ['**' factor]
  212. // atom_expr: 'await' atom trailer* | atom trailer*
  213. DEF_RULE(or_test, c(or_and_test), list, rule(and_test), tok(KW_OR))
  214. DEF_RULE(and_test, c(or_and_test), list, rule(not_test), tok(KW_AND))
  215. DEF_RULE_NC(not_test, or(2), rule(not_test_2), rule(comparison))
  216. DEF_RULE(not_test_2, c(not_test_2), and(2), tok(KW_NOT), rule(not_test))
  217. DEF_RULE(comparison, c(comparison), list, rule(expr), rule(comp_op))
  218. DEF_RULE_NC(comp_op, or(9), tok(OP_LESS), tok(OP_MORE), tok(OP_DBL_EQUAL), tok(OP_LESS_EQUAL), tok(OP_MORE_EQUAL), tok(OP_NOT_EQUAL), tok(KW_IN), rule(comp_op_not_in), rule(comp_op_is))
  219. DEF_RULE_NC(comp_op_not_in, and(2), tok(KW_NOT), tok(KW_IN))
  220. DEF_RULE_NC(comp_op_is, and(2), tok(KW_IS), opt_rule(comp_op_is_not))
  221. DEF_RULE_NC(comp_op_is_not, and(1), tok(KW_NOT))
  222. DEF_RULE(star_expr, c(star_expr), and(2), tok(OP_STAR), rule(expr))
  223. DEF_RULE(expr, c(binary_op), list, rule(xor_expr), tok(OP_PIPE))
  224. DEF_RULE(xor_expr, c(binary_op), list, rule(and_expr), tok(OP_CARET))
  225. DEF_RULE(and_expr, c(binary_op), list, rule(shift_expr), tok(OP_AMPERSAND))
  226. DEF_RULE(shift_expr, c(term), list, rule(arith_expr), rule(shift_op))
  227. DEF_RULE_NC(shift_op, or(2), tok(OP_DBL_LESS), tok(OP_DBL_MORE))
  228. DEF_RULE(arith_expr, c(term), list, rule(term), rule(arith_op))
  229. DEF_RULE_NC(arith_op, or(2), tok(OP_PLUS), tok(OP_MINUS))
  230. DEF_RULE(term, c(term), list, rule(factor), rule(term_op))
  231. DEF_RULE_NC(term_op, or(4), tok(OP_STAR), tok(OP_SLASH), tok(OP_PERCENT), tok(OP_DBL_SLASH))
  232. DEF_RULE_NC(factor, or(2), rule(factor_2), rule(power))
  233. DEF_RULE(factor_2, c(factor_2), and_ident(2), rule(factor_op), rule(factor))
  234. DEF_RULE_NC(factor_op, or(3), tok(OP_PLUS), tok(OP_MINUS), tok(OP_TILDE))
  235. DEF_RULE(power, c(power), and_ident(2), rule(atom_expr), opt_rule(power_dbl_star))
  236. #if MICROPY_PY_ASYNC_AWAIT
  237. DEF_RULE_NC(atom_expr, or(2), rule(atom_expr_await), rule(atom_expr_normal))
  238. DEF_RULE(atom_expr_await, c(atom_expr_await), and(3), tok(KW_AWAIT), rule(atom), opt_rule(atom_expr_trailers))
  239. #else
  240. DEF_RULE_NC(atom_expr, or(1), rule(atom_expr_normal))
  241. #endif
  242. DEF_RULE(atom_expr_normal, c(atom_expr_normal), and_ident(2), rule(atom), opt_rule(atom_expr_trailers))
  243. DEF_RULE_NC(atom_expr_trailers, one_or_more, rule(trailer))
  244. DEF_RULE_NC(power_dbl_star, and_ident(2), tok(OP_DBL_STAR), rule(factor))
  245. // atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']' | '{' [dictorsetmaker] '}' | NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False'
  246. // testlist_comp: (test|star_expr) ( comp_for | (',' (test|star_expr))* [','] )
  247. // trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
  248. DEF_RULE_NC(atom, or(12), tok(NAME), tok(INTEGER), tok(FLOAT_OR_IMAG), tok(STRING), tok(BYTES), tok(ELLIPSIS), tok(KW_NONE), tok(KW_TRUE), tok(KW_FALSE), rule(atom_paren), rule(atom_bracket), rule(atom_brace))
  249. DEF_RULE(atom_paren, c(atom_paren), and(3), tok(DEL_PAREN_OPEN), opt_rule(atom_2b), tok(DEL_PAREN_CLOSE))
  250. DEF_RULE_NC(atom_2b, or(2), rule(yield_expr), rule(testlist_comp))
  251. DEF_RULE(atom_bracket, c(atom_bracket), and(3), tok(DEL_BRACKET_OPEN), opt_rule(testlist_comp), tok(DEL_BRACKET_CLOSE))
  252. DEF_RULE(atom_brace, c(atom_brace), and(3), tok(DEL_BRACE_OPEN), opt_rule(dictorsetmaker), tok(DEL_BRACE_CLOSE))
  253. DEF_RULE_NC(testlist_comp, and_ident(2), rule(testlist_comp_2), opt_rule(testlist_comp_3))
  254. DEF_RULE_NC(testlist_comp_2, or(2), rule(star_expr), rule(test))
  255. DEF_RULE_NC(testlist_comp_3, or(2), rule(comp_for), rule(testlist_comp_3b))
  256. DEF_RULE_NC(testlist_comp_3b, and_ident(2), tok(DEL_COMMA), opt_rule(testlist_comp_3c))
  257. DEF_RULE_NC(testlist_comp_3c, list_with_end, rule(testlist_comp_2), tok(DEL_COMMA))
  258. DEF_RULE_NC(trailer, or(3), rule(trailer_paren), rule(trailer_bracket), rule(trailer_period))
  259. DEF_RULE(trailer_paren, c(trailer_paren), and(3), tok(DEL_PAREN_OPEN), opt_rule(arglist), tok(DEL_PAREN_CLOSE))
  260. DEF_RULE(trailer_bracket, c(trailer_bracket), and(3), tok(DEL_BRACKET_OPEN), rule(subscriptlist), tok(DEL_BRACKET_CLOSE))
  261. DEF_RULE(trailer_period, c(trailer_period), and(2), tok(DEL_PERIOD), tok(NAME))
  262. // subscriptlist: subscript (',' subscript)* [',']
  263. // subscript: test | [test] ':' [test] [sliceop]
  264. // sliceop: ':' [test]
  265. #if MICROPY_PY_BUILTINS_SLICE
  266. DEF_RULE(subscriptlist, c(generic_tuple), list_with_end, rule(subscript), tok(DEL_COMMA))
  267. DEF_RULE_NC(subscript, or(2), rule(subscript_3), rule(subscript_2))
  268. DEF_RULE(subscript_2, c(subscript), and_ident(2), rule(test), opt_rule(subscript_3))
  269. DEF_RULE(subscript_3, c(subscript), and(2), tok(DEL_COLON), opt_rule(subscript_3b))
  270. DEF_RULE_NC(subscript_3b, or(2), rule(subscript_3c), rule(subscript_3d))
  271. DEF_RULE_NC(subscript_3c, and(2), tok(DEL_COLON), opt_rule(test))
  272. DEF_RULE_NC(subscript_3d, and_ident(2), rule(test), opt_rule(sliceop))
  273. DEF_RULE_NC(sliceop, and(2), tok(DEL_COLON), opt_rule(test))
  274. #else
  275. DEF_RULE(subscriptlist, c(generic_tuple), list_with_end, rule(test), tok(DEL_COMMA))
  276. #endif
  277. // exprlist: (expr|star_expr) (',' (expr|star_expr))* [',']
  278. // testlist: test (',' test)* [',']
  279. // dictorsetmaker: (test ':' test (comp_for | (',' test ':' test)* [','])) | (test (comp_for | (',' test)* [',']))
  280. DEF_RULE_NC(exprlist, list_with_end, rule(exprlist_2), tok(DEL_COMMA))
  281. DEF_RULE_NC(exprlist_2, or(2), rule(star_expr), rule(expr))
  282. DEF_RULE(testlist, c(generic_tuple), list_with_end, rule(test), tok(DEL_COMMA))
  283. // TODO dictorsetmaker lets through more than is allowed
  284. DEF_RULE_NC(dictorsetmaker, and_ident(2), rule(dictorsetmaker_item), opt_rule(dictorsetmaker_tail))
  285. #if MICROPY_PY_BUILTINS_SET
  286. DEF_RULE(dictorsetmaker_item, c(dictorsetmaker_item), and_ident(2), rule(test), opt_rule(dictorsetmaker_colon))
  287. DEF_RULE_NC(dictorsetmaker_colon, and_ident(2), tok(DEL_COLON), rule(test))
  288. #else
  289. DEF_RULE(dictorsetmaker_item, c(dictorsetmaker_item), and(3), rule(test), tok(DEL_COLON), rule(test))
  290. #endif
  291. DEF_RULE_NC(dictorsetmaker_tail, or(2), rule(comp_for), rule(dictorsetmaker_list))
  292. DEF_RULE_NC(dictorsetmaker_list, and(2), tok(DEL_COMMA), opt_rule(dictorsetmaker_list2))
  293. DEF_RULE_NC(dictorsetmaker_list2, list_with_end, rule(dictorsetmaker_item), tok(DEL_COMMA))
  294. // classdef: 'class' NAME ['(' [arglist] ')'] ':' suite
  295. DEF_RULE(classdef, c(classdef), and_blank(5), tok(KW_CLASS), tok(NAME), opt_rule(classdef_2), tok(DEL_COLON), rule(suite))
  296. DEF_RULE_NC(classdef_2, and_ident(3), tok(DEL_PAREN_OPEN), opt_rule(arglist), tok(DEL_PAREN_CLOSE))
  297. // arglist: (argument ',')* (argument [','] | '*' test (',' argument)* [',' '**' test] | '**' test)
  298. // TODO arglist lets through more than is allowed, compiler needs to do further verification
  299. DEF_RULE_NC(arglist, list_with_end, rule(arglist_2), tok(DEL_COMMA))
  300. DEF_RULE_NC(arglist_2, or(3), rule(arglist_star), rule(arglist_dbl_star), rule(argument))
  301. DEF_RULE_NC(arglist_star, and(2), tok(OP_STAR), rule(test))
  302. DEF_RULE_NC(arglist_dbl_star, and(2), tok(OP_DBL_STAR), rule(test))
  303. // # The reason that keywords are test nodes instead of NAME is that using NAME
  304. // # results in an ambiguity. ast.c makes sure it's a NAME.
  305. // argument: test [comp_for] | test '=' test # Really [keyword '='] test
  306. // comp_iter: comp_for | comp_if
  307. // comp_for: 'for' exprlist 'in' or_test [comp_iter]
  308. // comp_if: 'if' test_nocond [comp_iter]
  309. DEF_RULE_NC(argument, and_ident(2), rule(test), opt_rule(argument_2))
  310. DEF_RULE_NC(argument_2, or(2), rule(comp_for), rule(argument_3))
  311. DEF_RULE_NC(argument_3, and_ident(2), tok(DEL_EQUAL), rule(test))
  312. DEF_RULE_NC(comp_iter, or(2), rule(comp_for), rule(comp_if))
  313. DEF_RULE_NC(comp_for, and_blank(5), tok(KW_FOR), rule(exprlist), tok(KW_IN), rule(or_test), opt_rule(comp_iter))
  314. DEF_RULE_NC(comp_if, and(3), tok(KW_IF), rule(test_nocond), opt_rule(comp_iter))
  315. // # not used in grammar, but may appear in "node" passed from Parser to Compiler
  316. // encoding_decl: NAME
  317. // yield_expr: 'yield' [yield_arg]
  318. // yield_arg: 'from' test | testlist
  319. DEF_RULE(yield_expr, c(yield_expr), and(2), tok(KW_YIELD), opt_rule(yield_arg))
  320. DEF_RULE_NC(yield_arg, or(2), rule(yield_arg_from), rule(testlist))
  321. DEF_RULE_NC(yield_arg_from, and(2), tok(KW_FROM), rule(test))