Damien George | 04b9147 | 2014-05-03 23:27:38 +0100 | [diff] [blame] | 1 | /* |
| 2 | * This file is part of the Micro Python project, http://micropython.org/ |
| 3 | * |
| 4 | * The MIT License (MIT) |
| 5 | * |
Damien George | fa90ab1 | 2015-04-21 16:35:50 +0000 | [diff] [blame] | 6 | * Copyright (c) 2013-2015 Damien P. George |
Damien George | 04b9147 | 2014-05-03 23:27:38 +0100 | [diff] [blame] | 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 | |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 27 | // rules for writing rules: |
| 28 | // - zero_or_more is implemented using opt_rule around a one_or_more rule |
| 29 | // - don't put opt_rule in arguments of or rule; instead, wrap the call to this or rule in opt_rule |
| 30 | |
| 31 | // # Start symbols for the grammar: |
| 32 | // # single_input is a single interactive statement; |
| 33 | // # file_input is a module or sequence of commands read from an input file; |
| 34 | // # eval_input is the input for the eval() functions. |
Damien | e388f10 | 2013-12-12 15:24:38 +0000 | [diff] [blame] | 35 | // # NB: compound_stmt in single_input is followed by extra NEWLINE! --> not in Micro Python |
Damien | 3997be4 | 2013-10-18 19:56:48 +0100 | [diff] [blame] | 36 | // single_input: NEWLINE | simple_stmt | compound_stmt |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 37 | // file_input: (NEWLINE | stmt)* ENDMARKER |
| 38 | // eval_input: testlist NEWLINE* ENDMARKER |
| 39 | |
Damien | 3997be4 | 2013-10-18 19:56:48 +0100 | [diff] [blame] | 40 | DEF_RULE(single_input, nc, or(3), tok(NEWLINE), rule(simple_stmt), rule(compound_stmt)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 41 | DEF_RULE(file_input, c(generic_all_nodes), and_ident(1), opt_rule(file_input_2)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 42 | DEF_RULE(file_input_2, c(generic_all_nodes), one_or_more, rule(file_input_3)) |
| 43 | DEF_RULE(file_input_3, nc, or(2), tok(NEWLINE), rule(stmt)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 44 | DEF_RULE(eval_input, nc, and_ident(2), rule(testlist), opt_rule(eval_input_2)) |
Damien George | d02c6d8 | 2014-01-15 22:14:03 +0000 | [diff] [blame] | 45 | DEF_RULE(eval_input_2, nc, and(1), tok(NEWLINE)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 46 | |
| 47 | // decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE |
| 48 | // decorators: decorator+ |
pohmelie | 81ebba7 | 2016-01-27 23:23:11 +0300 | [diff] [blame] | 49 | // decorated: decorators (classdef | funcdef | async_funcdef) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 50 | // funcdef: 'def' NAME parameters ['->' test] ':' suite |
pohmelie | 81ebba7 | 2016-01-27 23:23:11 +0300 | [diff] [blame] | 51 | // async_funcdef: 'async' funcdef |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 52 | // parameters: '(' [typedargslist] ')' |
| 53 | // typedargslist: tfpdef ['=' test] (',' tfpdef ['=' test])* [',' ['*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] | '**' tfpdef]] | '*' [tfpdef] (',' tfpdef ['=' test])* [',' '**' tfpdef] | '**' tfpdef |
| 54 | // tfpdef: NAME [':' test] |
| 55 | // varargslist: vfpdef ['=' test] (',' vfpdef ['=' test])* [',' ['*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef] | '**' vfpdef]] | '*' [vfpdef] (',' vfpdef ['=' test])* [',' '**' vfpdef] | '**' vfpdef |
| 56 | // vfpdef: NAME |
| 57 | |
| 58 | DEF_RULE(decorator, nc, and(4), tok(DEL_AT), rule(dotted_name), opt_rule(trailer_paren), tok(NEWLINE)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 59 | DEF_RULE(decorators, nc, one_or_more, rule(decorator)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 60 | DEF_RULE(decorated, c(decorated), and_ident(2), rule(decorators), rule(decorated_body)) |
pohmelie | 81ebba7 | 2016-01-27 23:23:11 +0300 | [diff] [blame] | 61 | #if MICROPY_PY_ASYNC_AWAIT |
| 62 | DEF_RULE(decorated_body, nc, or(3), rule(classdef), rule(funcdef), rule(async_funcdef)) |
| 63 | DEF_RULE(async_funcdef, nc, and(2), tok(KW_ASYNC), rule(funcdef)) |
| 64 | #else |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 65 | DEF_RULE(decorated_body, nc, or(2), rule(classdef), rule(funcdef)) |
pohmelie | 81ebba7 | 2016-01-27 23:23:11 +0300 | [diff] [blame] | 66 | #endif |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 67 | 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)) |
| 68 | DEF_RULE(funcdefrettype, nc, and_ident(2), tok(DEL_MINUS_MORE), rule(test)) |
Damien George | 9a56912 | 2015-11-23 16:50:42 +0000 | [diff] [blame] | 69 | // note: typedargslist lets through more than is allowed, compiler does further checks |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 70 | DEF_RULE(typedargslist, nc, list_with_end, rule(typedargslist_item), tok(DEL_COMMA)) |
| 71 | DEF_RULE(typedargslist_item, nc, or(3), rule(typedargslist_name), rule(typedargslist_star), rule(typedargslist_dbl_star)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 72 | DEF_RULE(typedargslist_name, nc, and_ident(3), tok(NAME), opt_rule(typedargslist_colon), opt_rule(typedargslist_equal)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 73 | DEF_RULE(typedargslist_star, nc, and(2), tok(OP_STAR), opt_rule(tfpdef)) |
| 74 | DEF_RULE(typedargslist_dbl_star, nc, and(3), tok(OP_DBL_STAR), tok(NAME), opt_rule(typedargslist_colon)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 75 | DEF_RULE(typedargslist_colon, nc, and_ident(2), tok(DEL_COLON), rule(test)) |
| 76 | DEF_RULE(typedargslist_equal, nc, and_ident(2), tok(DEL_EQUAL), rule(test)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 77 | DEF_RULE(tfpdef, nc, and(2), tok(NAME), opt_rule(typedargslist_colon)) |
Damien George | 9a56912 | 2015-11-23 16:50:42 +0000 | [diff] [blame] | 78 | // note: varargslist lets through more than is allowed, compiler does further checks |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 79 | DEF_RULE(varargslist, nc, list_with_end, rule(varargslist_item), tok(DEL_COMMA)) |
| 80 | DEF_RULE(varargslist_item, nc, or(3), rule(varargslist_name), rule(varargslist_star), rule(varargslist_dbl_star)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 81 | DEF_RULE(varargslist_name, nc, and_ident(2), tok(NAME), opt_rule(varargslist_equal)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 82 | DEF_RULE(varargslist_star, nc, and(2), tok(OP_STAR), opt_rule(vfpdef)) |
| 83 | DEF_RULE(varargslist_dbl_star, nc, and(2), tok(OP_DBL_STAR), tok(NAME)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 84 | DEF_RULE(varargslist_equal, nc, and_ident(2), tok(DEL_EQUAL), rule(test)) |
| 85 | DEF_RULE(vfpdef, nc, and_ident(1), tok(NAME)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 86 | |
Damien George | fa90ab1 | 2015-04-21 16:35:50 +0000 | [diff] [blame] | 87 | // stmt: compound_stmt | simple_stmt |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 88 | |
Damien George | fa90ab1 | 2015-04-21 16:35:50 +0000 | [diff] [blame] | 89 | DEF_RULE(stmt, nc, or(2), rule(compound_stmt), rule(simple_stmt)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 90 | |
| 91 | // simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE |
| 92 | |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 93 | DEF_RULE(simple_stmt, nc, and_ident(2), rule(simple_stmt_2), tok(NEWLINE)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 94 | DEF_RULE(simple_stmt_2, c(generic_all_nodes), list_with_end, rule(small_stmt), tok(DEL_SEMICOLON)) |
| 95 | |
| 96 | // small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt | import_stmt | global_stmt | nonlocal_stmt | assert_stmt |
| 97 | // expr_stmt: testlist_star_expr (augassign (yield_expr|testlist) | ('=' (yield_expr|testlist_star_expr))*) |
| 98 | // testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [','] |
| 99 | // augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>>=' | '**=' | '//=' |
| 100 | // # For normal assignments, additional restrictions enforced by the interpreter |
| 101 | |
| 102 | DEF_RULE(small_stmt, nc, 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)) |
| 103 | DEF_RULE(expr_stmt, c(expr_stmt), and(2), rule(testlist_star_expr), opt_rule(expr_stmt_2)) |
| 104 | DEF_RULE(expr_stmt_2, nc, or(2), rule(expr_stmt_augassign), rule(expr_stmt_assign_list)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 105 | DEF_RULE(expr_stmt_augassign, nc, and_ident(2), rule(augassign), rule(expr_stmt_6)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 106 | DEF_RULE(expr_stmt_assign_list, nc, one_or_more, rule(expr_stmt_assign)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 107 | DEF_RULE(expr_stmt_assign, nc, and_ident(2), tok(DEL_EQUAL), rule(expr_stmt_6)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 108 | DEF_RULE(expr_stmt_6, nc, or(2), rule(yield_expr), rule(testlist_star_expr)) |
| 109 | DEF_RULE(testlist_star_expr, c(generic_tuple), list_with_end, rule(testlist_star_expr_2), tok(DEL_COMMA)) |
| 110 | DEF_RULE(testlist_star_expr_2, nc, or(2), rule(star_expr), rule(test)) |
| 111 | DEF_RULE(augassign, nc, 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)) |
| 112 | |
| 113 | // del_stmt: 'del' exprlist |
| 114 | // pass_stmt: 'pass' |
| 115 | // flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt |
| 116 | // break_stmt: 'break' |
| 117 | // continue_stmt: 'continue' |
| 118 | // return_stmt: 'return' [testlist] |
| 119 | // yield_stmt: yield_expr |
| 120 | // raise_stmt: 'raise' [test ['from' test]] |
| 121 | |
| 122 | DEF_RULE(del_stmt, c(del_stmt), and(2), tok(KW_DEL), rule(exprlist)) |
| 123 | DEF_RULE(pass_stmt, c(generic_all_nodes), and(1), tok(KW_PASS)) |
| 124 | DEF_RULE(flow_stmt, nc, or(5), rule(break_stmt), rule(continue_stmt), rule(return_stmt), rule(raise_stmt), rule(yield_stmt)) |
| 125 | DEF_RULE(break_stmt, c(break_stmt), and(1), tok(KW_BREAK)) |
| 126 | DEF_RULE(continue_stmt, c(continue_stmt), and(1), tok(KW_CONTINUE)) |
| 127 | DEF_RULE(return_stmt, c(return_stmt), and(2), tok(KW_RETURN), opt_rule(testlist)) |
| 128 | DEF_RULE(yield_stmt, c(yield_stmt), and(1), rule(yield_expr)) |
| 129 | DEF_RULE(raise_stmt, c(raise_stmt), and(2), tok(KW_RAISE), opt_rule(raise_stmt_arg)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 130 | DEF_RULE(raise_stmt_arg, nc, and_ident(2), rule(test), opt_rule(raise_stmt_from)) |
| 131 | DEF_RULE(raise_stmt_from, nc, and_ident(2), tok(KW_FROM), rule(test)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 132 | |
| 133 | // import_stmt: import_name | import_from |
| 134 | // import_name: 'import' dotted_as_names |
| 135 | // import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+) 'import' ('*' | '(' import_as_names ')' | import_as_names) |
| 136 | // import_as_name: NAME ['as' NAME] |
| 137 | // dotted_as_name: dotted_name ['as' NAME] |
| 138 | // import_as_names: import_as_name (',' import_as_name)* [','] |
| 139 | // dotted_as_names: dotted_as_name (',' dotted_as_name)* |
| 140 | // dotted_name: NAME ('.' NAME)* |
| 141 | // global_stmt: 'global' NAME (',' NAME)* |
| 142 | // nonlocal_stmt: 'nonlocal' NAME (',' NAME)* |
| 143 | // assert_stmt: 'assert' test [',' test] |
| 144 | |
| 145 | DEF_RULE(import_stmt, nc, or(2), rule(import_name), rule(import_from)) |
| 146 | DEF_RULE(import_name, c(import_name), and(2), tok(KW_IMPORT), rule(dotted_as_names)) |
| 147 | DEF_RULE(import_from, c(import_from), and(4), tok(KW_FROM), rule(import_from_2), tok(KW_IMPORT), rule(import_from_3)) |
| 148 | DEF_RULE(import_from_2, nc, or(2), rule(dotted_name), rule(import_from_2b)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 149 | DEF_RULE(import_from_2b, nc, and_ident(2), rule(one_or_more_period_or_ellipsis), opt_rule(dotted_name)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 150 | DEF_RULE(import_from_3, nc, or(3), tok(OP_STAR), rule(import_as_names_paren), rule(import_as_names)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 151 | DEF_RULE(import_as_names_paren, nc, and_ident(3), tok(DEL_PAREN_OPEN), rule(import_as_names), tok(DEL_PAREN_CLOSE)) |
Damien George | e9906ac | 2014-01-04 18:44:46 +0000 | [diff] [blame] | 152 | DEF_RULE(one_or_more_period_or_ellipsis, nc, one_or_more, rule(period_or_ellipsis)) |
| 153 | DEF_RULE(period_or_ellipsis, nc, or(2), tok(DEL_PERIOD), tok(ELLIPSIS)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 154 | DEF_RULE(import_as_name, nc, and(2), tok(NAME), opt_rule(as_name)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 155 | DEF_RULE(dotted_as_name, nc, and_ident(2), rule(dotted_name), opt_rule(as_name)) |
| 156 | DEF_RULE(as_name, nc, and_ident(2), tok(KW_AS), tok(NAME)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 157 | DEF_RULE(import_as_names, nc, list_with_end, rule(import_as_name), tok(DEL_COMMA)) |
| 158 | DEF_RULE(dotted_as_names, nc, list, rule(dotted_as_name), tok(DEL_COMMA)) |
| 159 | DEF_RULE(dotted_name, nc, list, tok(NAME), tok(DEL_PERIOD)) |
| 160 | DEF_RULE(global_stmt, c(global_stmt), and(2), tok(KW_GLOBAL), rule(name_list)) |
| 161 | DEF_RULE(nonlocal_stmt, c(nonlocal_stmt), and(2), tok(KW_NONLOCAL), rule(name_list)) |
| 162 | DEF_RULE(name_list, nc, list, tok(NAME), tok(DEL_COMMA)) |
| 163 | DEF_RULE(assert_stmt, c(assert_stmt), and(3), tok(KW_ASSERT), rule(test), opt_rule(assert_stmt_extra)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 164 | DEF_RULE(assert_stmt_extra, nc, and_ident(2), tok(DEL_COMMA), rule(test)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 165 | |
pohmelie | 81ebba7 | 2016-01-27 23:23:11 +0300 | [diff] [blame] | 166 | // compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated | async_stmt |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 167 | // if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] |
| 168 | // while_stmt: 'while' test ':' suite ['else' ':' suite] |
| 169 | // for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] |
| 170 | // try_stmt: 'try' ':' suite ((except_clause ':' suite)+ ['else' ':' suite] ['finally' ':' suite] | 'finally' ':' suite) |
| 171 | // # NB compile.c makes sure that the default except clause is last |
| 172 | // except_clause: 'except' [test ['as' NAME]] |
| 173 | // with_stmt: 'with' with_item (',' with_item)* ':' suite |
| 174 | // with_item: test ['as' expr] |
| 175 | // suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT |
pohmelie | 81ebba7 | 2016-01-27 23:23:11 +0300 | [diff] [blame] | 176 | // async_stmt: 'async' (funcdef | with_stmt | for_stmt) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 177 | |
pohmelie | 81ebba7 | 2016-01-27 23:23:11 +0300 | [diff] [blame] | 178 | #if MICROPY_PY_ASYNC_AWAIT |
| 179 | DEF_RULE(compound_stmt, nc, 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)) |
| 180 | DEF_RULE(async_stmt, c(async_stmt), and(2), tok(KW_ASYNC), rule(async_stmt_2)) |
| 181 | DEF_RULE(async_stmt_2, nc, or(3), rule(funcdef), rule(with_stmt), rule(for_stmt)) |
| 182 | #else |
Damien | 3997be4 | 2013-10-18 19:56:48 +0100 | [diff] [blame] | 183 | DEF_RULE(compound_stmt, nc, or(8), rule(if_stmt), rule(while_stmt), rule(for_stmt), rule(try_stmt), rule(with_stmt), rule(funcdef), rule(classdef), rule(decorated)) |
pohmelie | 81ebba7 | 2016-01-27 23:23:11 +0300 | [diff] [blame] | 184 | #endif |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 185 | 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)) |
| 186 | DEF_RULE(if_stmt_elif_list, nc, one_or_more, rule(if_stmt_elif)) |
| 187 | DEF_RULE(if_stmt_elif, nc, and(4), tok(KW_ELIF), rule(test), tok(DEL_COLON), rule(suite)) |
| 188 | DEF_RULE(while_stmt, c(while_stmt), and(5), tok(KW_WHILE), rule(test), tok(DEL_COLON), rule(suite), opt_rule(else_stmt)) |
| 189 | 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)) |
| 190 | DEF_RULE(try_stmt, c(try_stmt), and(4), tok(KW_TRY), tok(DEL_COLON), rule(suite), rule(try_stmt_2)) |
| 191 | DEF_RULE(try_stmt_2, nc, or(2), rule(try_stmt_except_and_more), rule(try_stmt_finally)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 192 | DEF_RULE(try_stmt_except_and_more, nc, and_ident(3), rule(try_stmt_except_list), opt_rule(else_stmt), opt_rule(try_stmt_finally)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 193 | DEF_RULE(try_stmt_except, nc, and(4), tok(KW_EXCEPT), opt_rule(try_stmt_as_name), tok(DEL_COLON), rule(suite)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 194 | DEF_RULE(try_stmt_as_name, nc, and_ident(2), rule(test), opt_rule(as_name)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 195 | DEF_RULE(try_stmt_except_list, nc, one_or_more, rule(try_stmt_except)) |
| 196 | DEF_RULE(try_stmt_finally, nc, and(3), tok(KW_FINALLY), tok(DEL_COLON), rule(suite)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 197 | DEF_RULE(else_stmt, nc, and_ident(3), tok(KW_ELSE), tok(DEL_COLON), rule(suite)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 198 | DEF_RULE(with_stmt, c(with_stmt), and(4), tok(KW_WITH), rule(with_stmt_list), tok(DEL_COLON), rule(suite)) |
| 199 | DEF_RULE(with_stmt_list, nc, list, rule(with_item), tok(DEL_COMMA)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 200 | DEF_RULE(with_item, nc, and_ident(2), rule(test), opt_rule(with_item_as)) |
| 201 | DEF_RULE(with_item_as, nc, and_ident(2), tok(KW_AS), rule(expr)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 202 | DEF_RULE(suite, nc, or(2), rule(suite_block), rule(simple_stmt)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 203 | DEF_RULE(suite_block, nc, and_ident(4), tok(NEWLINE), tok(INDENT), rule(suite_block_stmts), tok(DEDENT)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 204 | DEF_RULE(suite_block_stmts, c(generic_all_nodes), one_or_more, rule(stmt)) |
| 205 | |
| 206 | // test: or_test ['if' or_test 'else' test] | lambdef |
| 207 | // test_nocond: or_test | lambdef_nocond |
| 208 | // lambdef: 'lambda' [varargslist] ':' test |
| 209 | // lambdef_nocond: 'lambda' [varargslist] ':' test_nocond |
| 210 | |
| 211 | DEF_RULE(test, nc, or(2), rule(lambdef), rule(test_if_expr)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 212 | DEF_RULE(test_if_expr, c(test_if_expr), and_ident(2), rule(or_test), opt_rule(test_if_else)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 213 | DEF_RULE(test_if_else, nc, and(4), tok(KW_IF), rule(or_test), tok(KW_ELSE), rule(test)) |
| 214 | DEF_RULE(test_nocond, nc, or(2), rule(lambdef_nocond), rule(or_test)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 215 | DEF_RULE(lambdef, c(lambdef), and_blank(4), tok(KW_LAMBDA), opt_rule(varargslist), tok(DEL_COLON), rule(test)) |
| 216 | DEF_RULE(lambdef_nocond, c(lambdef), and_blank(4), tok(KW_LAMBDA), opt_rule(varargslist), tok(DEL_COLON), rule(test_nocond)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 217 | |
| 218 | // or_test: and_test ('or' and_test)* |
| 219 | // and_test: not_test ('and' not_test)* |
| 220 | // not_test: 'not' not_test | comparison |
| 221 | // comparison: expr (comp_op expr)* |
| 222 | // comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'|'is' 'not' |
| 223 | // star_expr: '*' expr |
| 224 | // expr: xor_expr ('|' xor_expr)* |
| 225 | // xor_expr: and_expr ('^' and_expr)* |
| 226 | // and_expr: shift_expr ('&' shift_expr)* |
| 227 | // shift_expr: arith_expr (('<<'|'>>') arith_expr)* |
| 228 | // arith_expr: term (('+'|'-') term)* |
| 229 | // term: factor (('*'|'/'|'%'|'//') factor)* |
| 230 | // factor: ('+'|'-'|'~') factor | power |
pohmelie | 81ebba7 | 2016-01-27 23:23:11 +0300 | [diff] [blame] | 231 | // power: atom_expr ['**' factor] |
| 232 | // atom_expr: 'await' atom trailer* | atom trailer* |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 233 | |
| 234 | DEF_RULE(or_test, c(or_test), list, rule(and_test), tok(KW_OR)) |
| 235 | DEF_RULE(and_test, c(and_test), list, rule(not_test), tok(KW_AND)) |
| 236 | DEF_RULE(not_test, nc, or(2), rule(not_test_2), rule(comparison)) |
| 237 | DEF_RULE(not_test_2, c(not_test_2), and(2), tok(KW_NOT), rule(not_test)) |
| 238 | DEF_RULE(comparison, c(comparison), list, rule(expr), rule(comp_op)) |
| 239 | DEF_RULE(comp_op, nc, 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)) |
| 240 | DEF_RULE(comp_op_not_in, nc, and(2), tok(KW_NOT), tok(KW_IN)) |
| 241 | DEF_RULE(comp_op_is, nc, and(2), tok(KW_IS), opt_rule(comp_op_is_not)) |
| 242 | DEF_RULE(comp_op_is_not, nc, and(1), tok(KW_NOT)) |
| 243 | DEF_RULE(star_expr, c(star_expr), and(2), tok(OP_STAR), rule(expr)) |
| 244 | DEF_RULE(expr, c(expr), list, rule(xor_expr), tok(OP_PIPE)) |
| 245 | DEF_RULE(xor_expr, c(xor_expr), list, rule(and_expr), tok(OP_CARET)) |
| 246 | DEF_RULE(and_expr, c(and_expr), list, rule(shift_expr), tok(OP_AMPERSAND)) |
| 247 | DEF_RULE(shift_expr, c(shift_expr), list, rule(arith_expr), rule(shift_op)) |
| 248 | DEF_RULE(shift_op, nc, or(2), tok(OP_DBL_LESS), tok(OP_DBL_MORE)) |
| 249 | DEF_RULE(arith_expr, c(arith_expr), list, rule(term), rule(arith_op)) |
| 250 | DEF_RULE(arith_op, nc, or(2), tok(OP_PLUS), tok(OP_MINUS)) |
| 251 | DEF_RULE(term, c(term), list, rule(factor), rule(term_op)) |
| 252 | DEF_RULE(term_op, nc, or(4), tok(OP_STAR), tok(OP_SLASH), tok(OP_PERCENT), tok(OP_DBL_SLASH)) |
| 253 | DEF_RULE(factor, nc, or(2), rule(factor_2), rule(power)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 254 | DEF_RULE(factor_2, c(factor_2), and_ident(2), rule(factor_op), rule(factor)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 255 | DEF_RULE(factor_op, nc, or(3), tok(OP_PLUS), tok(OP_MINUS), tok(OP_TILDE)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 256 | DEF_RULE(power, c(power), and_ident(2), rule(atom_expr), opt_rule(power_dbl_star)) |
pohmelie | 81ebba7 | 2016-01-27 23:23:11 +0300 | [diff] [blame] | 257 | #if MICROPY_PY_ASYNC_AWAIT |
| 258 | DEF_RULE(atom_expr, nc, or(2), rule(atom_expr_await), rule(atom_expr_normal)) |
| 259 | DEF_RULE(atom_expr_await, c(atom_expr_await), and(3), tok(KW_AWAIT), rule(atom), opt_rule(atom_expr_trailers)) |
| 260 | #else |
| 261 | DEF_RULE(atom_expr, nc, or(1), rule(atom_expr_normal)) |
| 262 | #endif |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 263 | DEF_RULE(atom_expr_normal, c(atom_expr_normal), and_ident(2), rule(atom), opt_rule(atom_expr_trailers)) |
pohmelie | 81ebba7 | 2016-01-27 23:23:11 +0300 | [diff] [blame] | 264 | DEF_RULE(atom_expr_trailers, c(atom_expr_trailers), one_or_more, rule(trailer)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 265 | DEF_RULE(power_dbl_star, nc, and_ident(2), tok(OP_DBL_STAR), rule(factor)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 266 | |
| 267 | // atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']' | '{' [dictorsetmaker] '}' | NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False' |
| 268 | // testlist_comp: (test|star_expr) ( comp_for | (',' (test|star_expr))* [','] ) |
| 269 | // trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME |
| 270 | |
Damien George | 7d414a1 | 2015-02-08 01:57:40 +0000 | [diff] [blame] | 271 | DEF_RULE(atom, nc, or(11), tok(NAME), tok(INTEGER), tok(FLOAT_OR_IMAG), rule(atom_string), tok(ELLIPSIS), tok(KW_NONE), tok(KW_TRUE), tok(KW_FALSE), rule(atom_paren), rule(atom_bracket), rule(atom_brace)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 272 | DEF_RULE(atom_string, c(atom_string), one_or_more, rule(string_or_bytes)) |
| 273 | DEF_RULE(string_or_bytes, nc, or(2), tok(STRING), tok(BYTES)) |
| 274 | DEF_RULE(atom_paren, c(atom_paren), and(3), tok(DEL_PAREN_OPEN), opt_rule(atom_2b), tok(DEL_PAREN_CLOSE)) |
| 275 | DEF_RULE(atom_2b, nc, or(2), rule(yield_expr), rule(testlist_comp)) |
| 276 | DEF_RULE(atom_bracket, c(atom_bracket), and(3), tok(DEL_BRACKET_OPEN), opt_rule(testlist_comp), tok(DEL_BRACKET_CLOSE)) |
| 277 | DEF_RULE(atom_brace, c(atom_brace), and(3), tok(DEL_BRACE_OPEN), opt_rule(dictorsetmaker), tok(DEL_BRACE_CLOSE)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 278 | DEF_RULE(testlist_comp, nc, and_ident(2), rule(testlist_comp_2), opt_rule(testlist_comp_3)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 279 | DEF_RULE(testlist_comp_2, nc, or(2), rule(star_expr), rule(test)) |
| 280 | DEF_RULE(testlist_comp_3, nc, or(2), rule(comp_for), rule(testlist_comp_3b)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 281 | DEF_RULE(testlist_comp_3b, nc, and_ident(2), tok(DEL_COMMA), opt_rule(testlist_comp_3c)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 282 | DEF_RULE(testlist_comp_3c, nc, list_with_end, rule(testlist_comp_2), tok(DEL_COMMA)) |
| 283 | DEF_RULE(trailer, nc, or(3), rule(trailer_paren), rule(trailer_bracket), rule(trailer_period)) |
| 284 | DEF_RULE(trailer_paren, c(trailer_paren), and(3), tok(DEL_PAREN_OPEN), opt_rule(arglist), tok(DEL_PAREN_CLOSE)) |
| 285 | DEF_RULE(trailer_bracket, c(trailer_bracket), and(3), tok(DEL_BRACKET_OPEN), rule(subscriptlist), tok(DEL_BRACKET_CLOSE)) |
| 286 | DEF_RULE(trailer_period, c(trailer_period), and(2), tok(DEL_PERIOD), tok(NAME)) |
| 287 | |
| 288 | // subscriptlist: subscript (',' subscript)* [','] |
| 289 | // subscript: test | [test] ':' [test] [sliceop] |
| 290 | // sliceop: ':' [test] |
| 291 | |
Damien George | 83204f3 | 2014-12-27 17:20:41 +0000 | [diff] [blame] | 292 | #if MICROPY_PY_BUILTINS_SLICE |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 293 | DEF_RULE(subscriptlist, c(generic_tuple), list_with_end, rule(subscript), tok(DEL_COMMA)) |
| 294 | DEF_RULE(subscript, nc, or(2), rule(subscript_3), rule(subscript_2)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 295 | DEF_RULE(subscript_2, c(subscript_2), and_ident(2), rule(test), opt_rule(subscript_3)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 296 | DEF_RULE(subscript_3, c(subscript_3), and(2), tok(DEL_COLON), opt_rule(subscript_3b)) |
| 297 | DEF_RULE(subscript_3b, nc, or(2), rule(subscript_3c), rule(subscript_3d)) |
| 298 | DEF_RULE(subscript_3c, nc, and(2), tok(DEL_COLON), opt_rule(test)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 299 | DEF_RULE(subscript_3d, nc, and_ident(2), rule(test), opt_rule(sliceop)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 300 | DEF_RULE(sliceop, nc, and(2), tok(DEL_COLON), opt_rule(test)) |
Damien George | 83204f3 | 2014-12-27 17:20:41 +0000 | [diff] [blame] | 301 | #else |
| 302 | DEF_RULE(subscriptlist, c(generic_tuple), list_with_end, rule(test), tok(DEL_COMMA)) |
| 303 | #endif |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 304 | |
| 305 | // exprlist: (expr|star_expr) (',' (expr|star_expr))* [','] |
| 306 | // testlist: test (',' test)* [','] |
| 307 | // dictorsetmaker: (test ':' test (comp_for | (',' test ':' test)* [','])) | (test (comp_for | (',' test)* [','])) |
| 308 | |
| 309 | DEF_RULE(exprlist, nc, list_with_end, rule(exprlist_2), tok(DEL_COMMA)) |
| 310 | DEF_RULE(exprlist_2, nc, or(2), rule(star_expr), rule(expr)) |
| 311 | DEF_RULE(testlist, c(generic_tuple), list_with_end, rule(test), tok(DEL_COMMA)) |
| 312 | // TODO dictorsetmaker lets through more than is allowed |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 313 | DEF_RULE(dictorsetmaker, nc, and_ident(2), rule(dictorsetmaker_item), opt_rule(dictorsetmaker_tail)) |
Damien George | e37dcaa | 2014-12-27 17:07:16 +0000 | [diff] [blame] | 314 | #if MICROPY_PY_BUILTINS_SET |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 315 | DEF_RULE(dictorsetmaker_item, c(dictorsetmaker_item), and_ident(2), rule(test), opt_rule(dictorsetmaker_colon)) |
| 316 | DEF_RULE(dictorsetmaker_colon, nc, and_ident(2), tok(DEL_COLON), rule(test)) |
Damien George | e37dcaa | 2014-12-27 17:07:16 +0000 | [diff] [blame] | 317 | #else |
| 318 | DEF_RULE(dictorsetmaker_item, c(dictorsetmaker_item), and(3), rule(test), tok(DEL_COLON), rule(test)) |
| 319 | #endif |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 320 | DEF_RULE(dictorsetmaker_tail, nc, or(2), rule(comp_for), rule(dictorsetmaker_list)) |
| 321 | DEF_RULE(dictorsetmaker_list, nc, and(2), tok(DEL_COMMA), opt_rule(dictorsetmaker_list2)) |
| 322 | DEF_RULE(dictorsetmaker_list2, nc, list_with_end, rule(dictorsetmaker_item), tok(DEL_COMMA)) |
| 323 | |
| 324 | // classdef: 'class' NAME ['(' [arglist] ')'] ':' suite |
| 325 | |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 326 | DEF_RULE(classdef, c(classdef), and_blank(5), tok(KW_CLASS), tok(NAME), opt_rule(classdef_2), tok(DEL_COLON), rule(suite)) |
| 327 | DEF_RULE(classdef_2, nc, and_ident(3), tok(DEL_PAREN_OPEN), opt_rule(arglist), tok(DEL_PAREN_CLOSE)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 328 | |
| 329 | // arglist: (argument ',')* (argument [','] | '*' test (',' argument)* [',' '**' test] | '**' test) |
| 330 | |
| 331 | // TODO arglist lets through more than is allowed, compiler needs to do further verification |
Damien George | 2c0842b | 2014-04-27 16:46:51 +0100 | [diff] [blame] | 332 | DEF_RULE(arglist, nc, list_with_end, rule(arglist_2), tok(DEL_COMMA)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 333 | DEF_RULE(arglist_2, nc, or(3), rule(arglist_star), rule(arglist_dbl_star), rule(argument)) |
Damien George | 2c0842b | 2014-04-27 16:46:51 +0100 | [diff] [blame] | 334 | DEF_RULE(arglist_star, nc, and(2), tok(OP_STAR), rule(test)) |
| 335 | DEF_RULE(arglist_dbl_star, nc, and(2), tok(OP_DBL_STAR), rule(test)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 336 | |
| 337 | // # The reason that keywords are test nodes instead of NAME is that using NAME |
| 338 | // # results in an ambiguity. ast.c makes sure it's a NAME. |
| 339 | // argument: test [comp_for] | test '=' test # Really [keyword '='] test |
| 340 | // comp_iter: comp_for | comp_if |
| 341 | // comp_for: 'for' exprlist 'in' or_test [comp_iter] |
| 342 | // comp_if: 'if' test_nocond [comp_iter] |
| 343 | |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 344 | DEF_RULE(argument, nc, and_ident(2), rule(test), opt_rule(argument_2)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 345 | DEF_RULE(argument_2, nc, or(2), rule(comp_for), rule(argument_3)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 346 | DEF_RULE(argument_3, nc, and_ident(2), tok(DEL_EQUAL), rule(test)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 347 | DEF_RULE(comp_iter, nc, or(2), rule(comp_for), rule(comp_if)) |
Damien George | 0c1de1c | 2016-04-14 13:23:50 +0100 | [diff] [blame] | 348 | DEF_RULE(comp_for, nc, and_blank(5), tok(KW_FOR), rule(exprlist), tok(KW_IN), rule(or_test), opt_rule(comp_iter)) |
Damien | 429d719 | 2013-10-04 19:53:11 +0100 | [diff] [blame] | 349 | DEF_RULE(comp_if, nc, and(3), tok(KW_IF), rule(test_nocond), opt_rule(comp_iter)) |
| 350 | |
| 351 | // # not used in grammar, but may appear in "node" passed from Parser to Compiler |
| 352 | // encoding_decl: NAME |
| 353 | |
| 354 | // yield_expr: 'yield' [yield_arg] |
| 355 | // yield_arg: 'from' test | testlist |
| 356 | |
| 357 | DEF_RULE(yield_expr, c(yield_expr), and(2), tok(KW_YIELD), opt_rule(yield_arg)) |
| 358 | DEF_RULE(yield_arg, nc, or(2), rule(yield_arg_from), rule(testlist)) |
| 359 | DEF_RULE(yield_arg_from, nc, and(2), tok(KW_FROM), rule(test)) |