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