diff --git a/src/compiler.cpp b/src/compiler.cpp index e121b582..0767c62b 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -79,55 +79,55 @@ namespace pkpy{ if(count > 0) return; count += 1; // http://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-expression-parsing-made-easy/ -#define METHOD(name) &Compiler::name -#define NO_INFIX nullptr, PREC_NONE - for(TokenIndex i=0; i")] = { nullptr, METHOD(exprBinaryOp), PREC_COMPARISION }; - rules[TK("<")] = { nullptr, METHOD(exprBinaryOp), PREC_COMPARISION }; - rules[TK("==")] = { nullptr, METHOD(exprBinaryOp), PREC_COMPARISION }; - rules[TK("!=")] = { nullptr, METHOD(exprBinaryOp), PREC_COMPARISION }; - rules[TK(">=")] = { nullptr, METHOD(exprBinaryOp), PREC_COMPARISION }; - rules[TK("<=")] = { nullptr, METHOD(exprBinaryOp), PREC_COMPARISION }; - rules[TK("in")] = { nullptr, METHOD(exprBinaryOp), PREC_COMPARISION }; - rules[TK("is")] = { nullptr, METHOD(exprBinaryOp), PREC_COMPARISION }; - rules[TK("<<")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_SHIFT }; - rules[TK(">>")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_SHIFT }; - rules[TK("&")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_AND }; - rules[TK("|")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_OR }; - rules[TK("^")] = { nullptr, METHOD(exprBinaryOp), PREC_BITWISE_XOR }; - rules[TK("@")] = { nullptr, METHOD(exprBinaryOp), PREC_FACTOR }; - rules[TK("if")] = { nullptr, METHOD(exprTernary), PREC_TERNARY }; - rules[TK(",")] = { nullptr, METHOD(exprTuple), PREC_TUPLE }; - rules[TK("not in")] = { nullptr, METHOD(exprBinaryOp), PREC_COMPARISION }; - rules[TK("is not")] = { nullptr, METHOD(exprBinaryOp), PREC_COMPARISION }; - rules[TK("and") ] = { nullptr, METHOD(exprAnd), PREC_LOGICAL_AND }; - rules[TK("or")] = { nullptr, METHOD(exprOr), PREC_LOGICAL_OR }; - rules[TK("not")] = { METHOD(exprNot), nullptr, PREC_LOGICAL_NOT }; - rules[TK("True")] = { METHOD(exprLiteral0), NO_INFIX }; - rules[TK("False")] = { METHOD(exprLiteral0), NO_INFIX }; - rules[TK("None")] = { METHOD(exprLiteral0), NO_INFIX }; - rules[TK("...")] = { METHOD(exprLiteral0), NO_INFIX }; - rules[TK("lambda")] = { METHOD(exprLambda), NO_INFIX }; - rules[TK("@id")] = { METHOD(exprName), NO_INFIX }; - rules[TK("@num")] = { METHOD(exprLiteral), NO_INFIX }; - rules[TK("@str")] = { METHOD(exprLiteral), NO_INFIX }; - rules[TK("@fstr")] = { METHOD(exprFString), NO_INFIX }; - rules[TK("@long")] = { METHOD(exprLong), NO_INFIX }; - rules[TK("@bytes")] = { METHOD(exprBytes), NO_INFIX }; -#undef METHOD -#undef NO_INFIX +#define PK_METHOD(name) &Compiler::name +#define PK_NO_INFIX nullptr, PREC_NONE + for(TokenIndex i=0; i")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION }; + rules[TK("<")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION }; + rules[TK("==")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION }; + rules[TK("!=")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION }; + rules[TK(">=")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION }; + rules[TK("<=")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION }; + rules[TK("in")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION }; + rules[TK("is")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION }; + rules[TK("<<")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_BITWISE_SHIFT }; + rules[TK(">>")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_BITWISE_SHIFT }; + rules[TK("&")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_BITWISE_AND }; + rules[TK("|")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_BITWISE_OR }; + rules[TK("^")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_BITWISE_XOR }; + rules[TK("@")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_FACTOR }; + rules[TK("if")] = { nullptr, PK_METHOD(exprTernary), PREC_TERNARY }; + rules[TK(",")] = { nullptr, PK_METHOD(exprTuple), PREC_TUPLE }; + rules[TK("not in")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION }; + rules[TK("is not")] = { nullptr, PK_METHOD(exprBinaryOp), PREC_COMPARISION }; + rules[TK("and") ] = { nullptr, PK_METHOD(exprAnd), PREC_LOGICAL_AND }; + rules[TK("or")] = { nullptr, PK_METHOD(exprOr), PREC_LOGICAL_OR }; + rules[TK("not")] = { PK_METHOD(exprNot), nullptr, PREC_LOGICAL_NOT }; + rules[TK("True")] = { PK_METHOD(exprLiteral0), PK_NO_INFIX }; + rules[TK("False")] = { PK_METHOD(exprLiteral0), PK_NO_INFIX }; + rules[TK("None")] = { PK_METHOD(exprLiteral0), PK_NO_INFIX }; + rules[TK("...")] = { PK_METHOD(exprLiteral0), PK_NO_INFIX }; + rules[TK("lambda")] = { PK_METHOD(exprLambda), PK_NO_INFIX }; + rules[TK("@id")] = { PK_METHOD(exprName), PK_NO_INFIX }; + rules[TK("@num")] = { PK_METHOD(exprLiteral), PK_NO_INFIX }; + rules[TK("@str")] = { PK_METHOD(exprLiteral), PK_NO_INFIX }; + rules[TK("@fstr")] = { PK_METHOD(exprFString), PK_NO_INFIX }; + rules[TK("@long")] = { PK_METHOD(exprLong), PK_NO_INFIX }; + rules[TK("@bytes")] = { PK_METHOD(exprBytes), PK_NO_INFIX }; +#undef PK_METHOD +#undef PK_NO_INFIX } bool Compiler::match(TokenIndex expected) {