Adakah mungkin untuk menambah pernyataan baharu pada sintaks Python?
Ya, adalah mungkin untuk menambah pernyataan baharu pada sintaks Python. Walau bagaimanapun, ini memerlukan pengubahsuaian kod jurubahasa Python.
Bagaimanakah pernyataan baharu boleh ditambahkan pada sintaks Python?
Anda boleh mengubah suai fail tatabahasa (Tatabahasa/Tatabahasa) kepada tambah definisi untuk pernyataan baharu dan ubah suai kod penjanaan AST (Python/ast.c) untuk menukar nod pokok parse baharu kepada nod AST. Kemudian, ubah suai kod kompilasi bytecode (Python/compile.c) untuk menyusun pernyataan baharu menjadi bytecode. Akhir sekali, ubah suai kod penjanaan jadual simbol (Python/symtable.c) untuk mengendalikan pernyataan baharu.
Contoh:
Untuk menambah pernyataan "sehingga" yang pelengkap "sementara":
<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>
Nota: Ini ialah gambaran keseluruhan peringkat tinggi. Rujuk artikel yang dipetik untuk langkah dan penjelasan yang lebih terperinci.
Atas ialah kandungan terperinci Bagaimanakah saya boleh menambah pernyataan baharu pada sintaks Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!