Python の構文に新しいステートメントを追加することは可能ですか?
はい、Python の構文に新しいステートメントを追加することは可能です。ただし、これには Python インタープリタのコードを変更する必要があります。
Python の構文に新しいステートメントを追加するにはどうすればよいですか?
文法ファイル (文法/文法) を次のように変更できます。新しいステートメントの定義を追加し、AST 生成コード (Python/ast.c) を変更して、新しい解析ツリー ノードを AST ノードに変換します。次に、バイトコード コンパイル コード (Python/compile.c) を変更して、新しいステートメントをバイトコードにコンパイルします。最後に、新しいステートメントを処理できるようにシンボル テーブル生成コード (Python/symtable.c) を変更します。
例:
次のような "until" ステートメントを追加するには、 "while" の補数:
<code class="text">compound_stmt: if_stmt | while_stmt | until_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated until_stmt: 'until' test ':' suite</code>
<code class="c">| Until(expr test, stmt* body)</code>
<code class="c">static stmt_ty ast_for_until_stmt(struct compiling *c, const node *n) { /* until_stmt: 'until' test ':' suite */ REQ(n, until_stmt); if (NCH(n) == 4) { expr_ty expression; asdl_seq *suite_seq; expression = ast_for_expr(c, CHILD(n, 1)); if (!expression) return NULL; suite_seq = ast_for_suite(c, CHILD(n, 3)); if (!suite_seq) return NULL; return Until(expression, suite_seq, LINENO(n), n->n_col_offset, c->c_arena); } PyErr_Format(PyExc_SystemError, "wrong number of tokens for 'until' statement: %d", NCH(n)); return NULL; }</code>
<code class="c">static int compiler_until(struct compiler *c, stmt_ty s) { basicblock *loop, *end, *anchor = NULL; int constant = expr_constant(s->v.Until.test); if (constant == 1) { return 1; } loop = compiler_new_block(c); end = compiler_new_block(c); if (constant == -1) { anchor = compiler_new_block(c); if (anchor == NULL) return 0; } if (loop == NULL || end == NULL) return 0; ADDOP_JREL(c, SETUP_LOOP, end); compiler_use_next_block(c, loop); if (!compiler_push_fblock(c, LOOP, loop)) return 0; if (constant == -1) { VISIT(c, expr, s->v.Until.test); ADDOP_JABS(c, POP_JUMP_IF_TRUE, anchor); } VISIT_SEQ(c, stmt, s->v.Until.body); ADDOP_JABS(c, JUMP_ABSOLUTE, loop); if (constant == -1) { compiler_use_next_block(c, anchor); ADDOP(c, POP_BLOCK); } compiler_pop_fblock(c, LOOP, loop); compiler_use_next_block(c, end); return 1; }</code>
<code class="c">case While_kind: VISIT(st, expr, s->v.While.test); VISIT_SEQ(st, stmt, s->v.While.body); if (s->v.While.orelse) VISIT_SEQ(st, stmt, s->v.While.orelse); break; case Until_kind: VISIT(st, expr, s->v.Until.test); VISIT_SEQ(st, stmt, s->v.Until.body); break;</code>
注: これは高レベルの概要です。詳細な手順と説明については、引用記事を参照してください。
以上がPython の構文に新しいステートメントを追加するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。