File indexing completed on 2024-05-19 15:42:37
0001 #pragma once 0002 #include "python_header.h" 0003 0004 namespace Python 0005 { 0006 0007 #define Py_GRAMMAR_GET(mod, name) \ 0008 ast_##name = PyObject_GetAttrString(mod, #name); \ 0009 Q_ASSERT(ast_##name) 0010 0011 class Grammar { 0012 public: 0013 // https://docs.python.org/3/library/ast.html#abstract-grammar 0014 // mod 0015 PyObject* ast_mod; 0016 PyObject* ast_Module; 0017 PyObject* ast_Interactive; 0018 PyObject* ast_Expression; 0019 PyObject* ast_FunctionType; 0020 0021 // stmt 0022 PyObject* ast_stmt; 0023 PyObject* ast_FunctionDef; 0024 PyObject* ast_AsyncFunctionDef; 0025 PyObject* ast_ClassDef; 0026 PyObject* ast_Return; 0027 PyObject* ast_Delete; 0028 PyObject* ast_Assign; 0029 PyObject* ast_AugAssign; 0030 PyObject* ast_AnnAssign; 0031 PyObject* ast_For; 0032 PyObject* ast_AsyncFor; 0033 PyObject* ast_While; 0034 PyObject* ast_If; 0035 PyObject* ast_With; 0036 PyObject* ast_AsyncWith; 0037 PyObject* ast_Match; 0038 PyObject* ast_Raise; 0039 PyObject* ast_Try; 0040 PyObject* ast_Assert; 0041 PyObject* ast_Import; 0042 PyObject* ast_ImportFrom; 0043 PyObject* ast_Global; 0044 PyObject* ast_Nonlocal; 0045 PyObject* ast_Pass; 0046 PyObject* ast_Break; 0047 PyObject* ast_Continue; 0048 0049 // expr 0050 PyObject* ast_expr; 0051 PyObject* ast_Expr; 0052 PyObject* ast_BoolOp; 0053 PyObject* ast_NamedExpr; 0054 PyObject* ast_BinOp; 0055 PyObject* ast_UnaryOp; 0056 PyObject* ast_Lambda; 0057 PyObject* ast_IfExp; 0058 PyObject* ast_Dict; 0059 PyObject* ast_Set; 0060 PyObject* ast_ListComp; 0061 PyObject* ast_SetComp; 0062 PyObject* ast_DictComp; 0063 PyObject* ast_GeneratorExp; 0064 PyObject* ast_Await; 0065 PyObject* ast_Yield; 0066 PyObject* ast_YieldFrom; 0067 PyObject* ast_Compare; 0068 PyObject* ast_Call; 0069 #if PYTHON_VERSION >= QT_VERSION_CHECK(3, 6, 0) 0070 PyObject* ast_FormattedValue; 0071 #endif 0072 PyObject* ast_JoinedStr; 0073 PyObject* ast_Constant; 0074 PyObject* ast_Attribute; 0075 PyObject* ast_Subscript; 0076 PyObject* ast_Starred; 0077 PyObject* ast_Name; 0078 PyObject* ast_List; 0079 PyObject* ast_Tuple; 0080 PyObject* ast_Slice; 0081 0082 // expr_context 0083 PyObject* ast_expr_context; 0084 PyObject* ast_Load; 0085 PyObject* ast_Store; 0086 PyObject* ast_Del; 0087 0088 // boolop 0089 PyObject* ast_boolop; 0090 PyObject* ast_And; 0091 PyObject* ast_Or; 0092 0093 // operator 0094 PyObject* ast_operator; 0095 PyObject* ast_Add; 0096 PyObject* ast_Sub; 0097 PyObject* ast_Mult; 0098 PyObject* ast_MatMult; 0099 PyObject* ast_Div; 0100 PyObject* ast_Mod; 0101 PyObject* ast_Pow; 0102 PyObject* ast_LShift; 0103 PyObject* ast_RShift; 0104 PyObject* ast_BitOr; 0105 PyObject* ast_BitXor; 0106 PyObject* ast_BitAnd; 0107 PyObject* ast_FloorDiv; 0108 0109 // unaryop 0110 PyObject* ast_unaryop; 0111 PyObject* ast_Invert; 0112 PyObject* ast_Not; 0113 PyObject* ast_UAdd; 0114 PyObject* ast_USub; 0115 0116 // cmpop 0117 PyObject* ast_cmpop; 0118 PyObject* ast_Eq; 0119 PyObject* ast_NotEq; 0120 PyObject* ast_Lt; 0121 PyObject* ast_LtE; 0122 PyObject* ast_Gt; 0123 PyObject* ast_GtE; 0124 PyObject* ast_Is; 0125 PyObject* ast_IsNot; 0126 PyObject* ast_In; 0127 PyObject* ast_NotIn; 0128 0129 // comprehension 0130 PyObject* ast_comprehension; 0131 0132 // excepthandler 0133 PyObject* ast_excepthandler; 0134 PyObject* ast_ExceptHandler; 0135 0136 // arguments 0137 PyObject* ast_arguments; 0138 0139 // arg 0140 PyObject* ast_arg; 0141 0142 // keyword 0143 PyObject* ast_keyword; 0144 0145 // alias 0146 PyObject* ast_alias; 0147 0148 // withitem 0149 PyObject* ast_withitem; 0150 0151 // slice 0152 PyObject* ast_slice; 0153 0154 #if PYTHON_VERSION >= QT_VERSION_CHECK(3, 10, 0) 0155 // match_case 0156 PyObject* ast_match_case; 0157 0158 // pattern 0159 PyObject* ast_pattern; 0160 PyObject* ast_MatchValue; 0161 PyObject* ast_MatchSingleton; 0162 PyObject* ast_MatchSequence; 0163 PyObject* ast_MatchMapping; 0164 PyObject* ast_MatchClass; 0165 PyObject* ast_MatchStar; 0166 PyObject* ast_MatchAs; 0167 PyObject* ast_MatchOr; 0168 #endif 0169 0170 #if PYTHON_VERSION >= QT_VERSION_CHECK(3, 11, 0) 0171 // except* 0172 PyObject* ast_TryStar; 0173 #endif 0174 0175 // type_ignore 0176 PyObject* ast_type_ignore; 0177 PyObject* ast_TypeIgnore; 0178 0179 #if PYTHON_VERSION < QT_VERSION_CHECK(3, 8, 0) 0180 // Missing in 3.8+ 0181 PyObject* ast_Num; 0182 PyObject* ast_Str; 0183 PyObject* ast_Bytes; 0184 #endif 0185 0186 Grammar() { 0187 PyObject* mod = PyImport_ImportModule("ast"); 0188 0189 Py_GRAMMAR_GET(mod, mod); 0190 Py_GRAMMAR_GET(mod, Module); 0191 Py_GRAMMAR_GET(mod, Interactive); 0192 Py_GRAMMAR_GET(mod, Expression); 0193 Py_GRAMMAR_GET(mod, FunctionType); 0194 0195 Py_GRAMMAR_GET(mod, stmt); 0196 Py_GRAMMAR_GET(mod, FunctionDef); 0197 Py_GRAMMAR_GET(mod, AsyncFunctionDef); 0198 Py_GRAMMAR_GET(mod, ClassDef); 0199 Py_GRAMMAR_GET(mod, Return); 0200 Py_GRAMMAR_GET(mod, Delete); 0201 Py_GRAMMAR_GET(mod, Assign); 0202 Py_GRAMMAR_GET(mod, AugAssign); 0203 Py_GRAMMAR_GET(mod, AnnAssign); 0204 Py_GRAMMAR_GET(mod, For); 0205 Py_GRAMMAR_GET(mod, AsyncFor); 0206 Py_GRAMMAR_GET(mod, While); 0207 Py_GRAMMAR_GET(mod, If); 0208 Py_GRAMMAR_GET(mod, With); 0209 Py_GRAMMAR_GET(mod, AsyncWith); 0210 Py_GRAMMAR_GET(mod, Match); 0211 Py_GRAMMAR_GET(mod, Raise); 0212 Py_GRAMMAR_GET(mod, Try); 0213 Py_GRAMMAR_GET(mod, Assert); 0214 Py_GRAMMAR_GET(mod, Import); 0215 Py_GRAMMAR_GET(mod, ImportFrom); 0216 Py_GRAMMAR_GET(mod, Global); 0217 Py_GRAMMAR_GET(mod, Nonlocal); 0218 Py_GRAMMAR_GET(mod, Pass); 0219 Py_GRAMMAR_GET(mod, Break); 0220 Py_GRAMMAR_GET(mod, Continue); 0221 0222 Py_GRAMMAR_GET(mod, expr); 0223 Py_GRAMMAR_GET(mod, Expr); 0224 Py_GRAMMAR_GET(mod, BoolOp); 0225 Py_GRAMMAR_GET(mod, NamedExpr); 0226 Py_GRAMMAR_GET(mod, BinOp); 0227 Py_GRAMMAR_GET(mod, UnaryOp); 0228 Py_GRAMMAR_GET(mod, Lambda); 0229 Py_GRAMMAR_GET(mod, IfExp); 0230 Py_GRAMMAR_GET(mod, Dict); 0231 Py_GRAMMAR_GET(mod, Set); 0232 Py_GRAMMAR_GET(mod, ListComp); 0233 Py_GRAMMAR_GET(mod, SetComp); 0234 Py_GRAMMAR_GET(mod, DictComp); 0235 Py_GRAMMAR_GET(mod, GeneratorExp); 0236 Py_GRAMMAR_GET(mod, Await); 0237 Py_GRAMMAR_GET(mod, Yield); 0238 Py_GRAMMAR_GET(mod, YieldFrom); 0239 Py_GRAMMAR_GET(mod, Compare); 0240 Py_GRAMMAR_GET(mod, Call); 0241 #if PYTHON_VERSION >= QT_VERSION_CHECK(3, 6, 0) 0242 Py_GRAMMAR_GET(mod, FormattedValue); 0243 #endif 0244 Py_GRAMMAR_GET(mod, JoinedStr); 0245 Py_GRAMMAR_GET(mod, Constant); 0246 Py_GRAMMAR_GET(mod, Attribute); 0247 Py_GRAMMAR_GET(mod, Subscript); 0248 Py_GRAMMAR_GET(mod, Starred); 0249 Py_GRAMMAR_GET(mod, Name); 0250 Py_GRAMMAR_GET(mod, List); 0251 Py_GRAMMAR_GET(mod, Tuple); 0252 Py_GRAMMAR_GET(mod, Slice); 0253 0254 Py_GRAMMAR_GET(mod, expr_context); 0255 Py_GRAMMAR_GET(mod, Load); 0256 Py_GRAMMAR_GET(mod, Store); 0257 Py_GRAMMAR_GET(mod, Del); 0258 0259 Py_GRAMMAR_GET(mod, boolop); 0260 Py_GRAMMAR_GET(mod, And); 0261 Py_GRAMMAR_GET(mod, Or); 0262 0263 Py_GRAMMAR_GET(mod, operator); 0264 Py_GRAMMAR_GET(mod, Add); 0265 Py_GRAMMAR_GET(mod, Sub); 0266 Py_GRAMMAR_GET(mod, Mult); 0267 Py_GRAMMAR_GET(mod, MatMult); 0268 Py_GRAMMAR_GET(mod, Div); 0269 Py_GRAMMAR_GET(mod, Mod); 0270 Py_GRAMMAR_GET(mod, Pow); 0271 Py_GRAMMAR_GET(mod, LShift); 0272 Py_GRAMMAR_GET(mod, RShift); 0273 Py_GRAMMAR_GET(mod, BitOr); 0274 Py_GRAMMAR_GET(mod, BitXor); 0275 Py_GRAMMAR_GET(mod, BitAnd); 0276 Py_GRAMMAR_GET(mod, FloorDiv); 0277 0278 Py_GRAMMAR_GET(mod, unaryop); 0279 Py_GRAMMAR_GET(mod, Invert); 0280 Py_GRAMMAR_GET(mod, Not); 0281 Py_GRAMMAR_GET(mod, UAdd); 0282 Py_GRAMMAR_GET(mod, USub); 0283 0284 Py_GRAMMAR_GET(mod, cmpop); 0285 Py_GRAMMAR_GET(mod, Eq); 0286 Py_GRAMMAR_GET(mod, NotEq); 0287 Py_GRAMMAR_GET(mod, Lt); 0288 Py_GRAMMAR_GET(mod, LtE); 0289 Py_GRAMMAR_GET(mod, Gt); 0290 Py_GRAMMAR_GET(mod, GtE); 0291 Py_GRAMMAR_GET(mod, Is); 0292 Py_GRAMMAR_GET(mod, IsNot); 0293 Py_GRAMMAR_GET(mod, In); 0294 Py_GRAMMAR_GET(mod, NotIn); 0295 0296 Py_GRAMMAR_GET(mod, comprehension); 0297 0298 Py_GRAMMAR_GET(mod, excepthandler); 0299 Py_GRAMMAR_GET(mod, ExceptHandler); 0300 0301 Py_GRAMMAR_GET(mod, arguments); 0302 Py_GRAMMAR_GET(mod, arg); 0303 Py_GRAMMAR_GET(mod, keyword); 0304 Py_GRAMMAR_GET(mod, alias); 0305 Py_GRAMMAR_GET(mod, withitem); 0306 Py_GRAMMAR_GET(mod, slice); 0307 0308 #if PYTHON_VERSION >= QT_VERSION_CHECK(3, 10, 0) 0309 Py_GRAMMAR_GET(mod, match_case); 0310 Py_GRAMMAR_GET(mod, pattern); 0311 Py_GRAMMAR_GET(mod, MatchValue); 0312 Py_GRAMMAR_GET(mod, MatchSingleton); 0313 Py_GRAMMAR_GET(mod, MatchSequence); 0314 Py_GRAMMAR_GET(mod, MatchMapping); 0315 Py_GRAMMAR_GET(mod, MatchClass); 0316 Py_GRAMMAR_GET(mod, MatchStar); 0317 Py_GRAMMAR_GET(mod, MatchAs); 0318 Py_GRAMMAR_GET(mod, MatchOr); 0319 #endif 0320 Py_GRAMMAR_GET(mod, type_ignore); 0321 Py_GRAMMAR_GET(mod, TypeIgnore); 0322 0323 #if PYTHON_VERSION >= QT_VERSION_CHECK(3, 11, 0) 0324 Py_GRAMMAR_GET(mod, TryStar); 0325 #endif 0326 0327 #if PYTHON_VERSION < QT_VERSION_CHECK(3, 8, 0) 0328 Py_GRAMMAR_GET(mod, Num); 0329 Py_GRAMMAR_GET(mod, Str); 0330 Py_GRAMMAR_GET(mod, Bytes); 0331 #endif 0332 0333 Py_DECREF(mod); 0334 } 0335 0336 ~Grammar() { 0337 Py_XDECREF(ast_Module); 0338 Py_XDECREF(ast_Interactive); 0339 Py_XDECREF(ast_Expression); 0340 Py_XDECREF(ast_FunctionType); 0341 0342 Py_XDECREF(ast_stmt); 0343 Py_XDECREF(ast_FunctionDef); 0344 Py_XDECREF(ast_AsyncFunctionDef); 0345 Py_XDECREF(ast_ClassDef); 0346 Py_XDECREF(ast_Return); 0347 Py_XDECREF(ast_Delete); 0348 Py_XDECREF(ast_Assign); 0349 Py_XDECREF(ast_AugAssign); 0350 Py_XDECREF(ast_AnnAssign); 0351 Py_XDECREF(ast_For); 0352 Py_XDECREF(ast_AsyncFor); 0353 Py_XDECREF(ast_While); 0354 Py_XDECREF(ast_If); 0355 Py_XDECREF(ast_With); 0356 Py_XDECREF(ast_AsyncWith); 0357 Py_XDECREF(ast_Match); 0358 Py_XDECREF(ast_Raise); 0359 Py_XDECREF(ast_Try); 0360 Py_XDECREF(ast_Assert); 0361 Py_XDECREF(ast_Import); 0362 Py_XDECREF(ast_ImportFrom); 0363 Py_XDECREF(ast_Global); 0364 Py_XDECREF(ast_Nonlocal); 0365 Py_XDECREF(ast_Pass); 0366 Py_XDECREF(ast_Break); 0367 Py_XDECREF(ast_Continue); 0368 0369 Py_XDECREF(ast_expr); 0370 Py_XDECREF(ast_Expr); 0371 Py_XDECREF(ast_BoolOp); 0372 Py_XDECREF(ast_NamedExpr); 0373 Py_XDECREF(ast_BinOp); 0374 Py_XDECREF(ast_UnaryOp); 0375 Py_XDECREF(ast_Lambda); 0376 Py_XDECREF(ast_IfExp); 0377 Py_XDECREF(ast_Dict); 0378 Py_XDECREF(ast_Set); 0379 Py_XDECREF(ast_ListComp); 0380 Py_XDECREF(ast_SetComp); 0381 Py_XDECREF(ast_DictComp); 0382 Py_XDECREF(ast_GeneratorExp); 0383 Py_XDECREF(ast_Await); 0384 Py_XDECREF(ast_Yield); 0385 Py_XDECREF(ast_YieldFrom); 0386 Py_XDECREF(ast_Compare); 0387 Py_XDECREF(ast_Call); 0388 #if PYTHON_VERSION >= QT_VERSION_CHECK(3, 6, 0) 0389 Py_XDECREF(ast_FormattedValue); 0390 #endif 0391 Py_XDECREF(ast_JoinedStr); 0392 Py_XDECREF(ast_Constant); 0393 Py_XDECREF(ast_Attribute); 0394 Py_XDECREF(ast_Subscript); 0395 Py_XDECREF(ast_Starred); 0396 Py_XDECREF(ast_Name); 0397 Py_XDECREF(ast_List); 0398 Py_XDECREF(ast_Tuple); 0399 Py_XDECREF(ast_Slice); 0400 0401 Py_XDECREF(ast_expr_context); 0402 Py_XDECREF(ast_Load); 0403 Py_XDECREF(ast_Store); 0404 Py_XDECREF(ast_Del); 0405 0406 Py_XDECREF(ast_boolop); 0407 Py_XDECREF(ast_And); 0408 Py_XDECREF(ast_Or); 0409 0410 Py_XDECREF(ast_operator); 0411 Py_XDECREF(ast_Add); 0412 Py_XDECREF(ast_Sub); 0413 Py_XDECREF(ast_Mult); 0414 Py_XDECREF(ast_MatMult); 0415 Py_XDECREF(ast_Div); 0416 Py_XDECREF(ast_Mod); 0417 Py_XDECREF(ast_Pow); 0418 Py_XDECREF(ast_LShift); 0419 Py_XDECREF(ast_RShift); 0420 Py_XDECREF(ast_BitOr); 0421 Py_XDECREF(ast_BitXor); 0422 Py_XDECREF(ast_BitAnd); 0423 Py_XDECREF(ast_FloorDiv); 0424 0425 Py_XDECREF(ast_unaryop); 0426 Py_XDECREF(ast_Invert); 0427 Py_XDECREF(ast_Not); 0428 Py_XDECREF(ast_UAdd); 0429 Py_XDECREF(ast_USub); 0430 0431 Py_XDECREF(ast_cmpop); 0432 Py_XDECREF(ast_Eq); 0433 Py_XDECREF(ast_NotEq); 0434 Py_XDECREF(ast_Lt); 0435 Py_XDECREF(ast_LtE); 0436 Py_XDECREF(ast_Gt); 0437 Py_XDECREF(ast_GtE); 0438 Py_XDECREF(ast_Is); 0439 Py_XDECREF(ast_IsNot); 0440 Py_XDECREF(ast_In); 0441 Py_XDECREF(ast_NotIn); 0442 0443 Py_XDECREF(ast_comprehension); 0444 0445 Py_XDECREF(ast_excepthandler); 0446 Py_XDECREF(ast_ExceptHandler); 0447 0448 Py_XDECREF(ast_arguments); 0449 Py_XDECREF(ast_arg); 0450 Py_XDECREF(ast_keyword); 0451 Py_XDECREF(ast_alias); 0452 Py_XDECREF(ast_withitem); 0453 Py_XDECREF(ast_slice); 0454 0455 #if PYTHON_VERSION >= QT_VERSION_CHECK(3, 10, 0) 0456 Py_XDECREF(ast_match_case); 0457 Py_XDECREF(ast_pattern); 0458 Py_XDECREF(ast_MatchValue); 0459 Py_XDECREF(ast_MatchSingleton); 0460 Py_XDECREF(ast_MatchSequence); 0461 Py_XDECREF(ast_MatchMapping); 0462 Py_XDECREF(ast_MatchClass); 0463 Py_XDECREF(ast_MatchStar); 0464 Py_XDECREF(ast_MatchAs); 0465 Py_XDECREF(ast_MatchOr); 0466 #endif 0467 0468 Py_XDECREF(ast_type_ignore); 0469 Py_XDECREF(ast_TypeIgnore); 0470 #if PYTHON_VERSION < QT_VERSION_CHECK(3, 8, 0) 0471 Py_XDECREF(ast_Num); 0472 Py_XDECREF(ast_Str); 0473 Py_XDECREF(ast_Bytes); 0474 #endif 0475 } 0476 }; 0477 0478 #undef Py_GRAMMAR_GET 0479 0480 } // end namespace Python