diff --git a/Parser/XnParser.cs b/Parser/XnParser.cs index e226488..18e58c3 100644 --- a/Parser/XnParser.cs +++ b/Parser/XnParser.cs @@ -30,8 +30,11 @@ namespace XNeedle.Parser static readonly Parser Multiply = Operator("*", ExpressionType.MultiplyChecked); static readonly Parser Divide = Operator("/", ExpressionType.Divide); static readonly Parser Modulo = Operator("%", ExpressionType.Modulo); - static readonly Parser Power = Operator("^", ExpressionType.Power); - + static readonly Parser Power = Operator("**", ExpressionType.Power); + static readonly Parser BitwiseXor = Operator("^", ExpressionType.ExclusiveOr); + static readonly Parser BitwiseAnd = Operator("&", ExpressionType.And); + static readonly Parser BitwiseOr = Operator("|", ExpressionType.Or); + static Parser Function(Context ctx) { return @@ -116,7 +119,7 @@ namespace XNeedle.Parser static Parser Term(Context ctx) { - return Parse.ChainOperator(Multiply.Or(Divide).Or(Modulo), InnerTerm(ctx), Expression.MakeBinary); + return Parse.ChainOperator(Multiply.Or(Divide).Or(Modulo).Or(BitwiseXor).Or(BitwiseAnd).Or(BitwiseOr), InnerTerm(ctx), Expression.MakeBinary); } static Parser ConcatExpr(Context ctx) diff --git a/Transformation/ContextFunctions.cs b/Transformation/ContextFunctions.cs index 9920d43..1580970 100644 --- a/Transformation/ContextFunctions.cs +++ b/Transformation/ContextFunctions.cs @@ -12,7 +12,7 @@ namespace XNeedle.Transformation { public class ContextFunctions { - public static string hexlit(Context ctx, double value) + public static string hexlit(Context ctx, int value) { uint v = (uint)value; return $"#x{v:x8}"; @@ -70,7 +70,7 @@ namespace XNeedle.Transformation return reflected; } - public static double crc32(Context ctx, int poly = 0x04C11DB7, int init = 0, int xorOut = 0, bool reflected = false) + public static int crc32(Context ctx, int poly = 0x04C11DB7, int init = 0, int xorOut = 0, bool reflected = false) { if (ctx.Node is null) return 0; @@ -88,7 +88,7 @@ namespace XNeedle.Transformation byte[] fragBytes = Encoding.UTF8.GetBytes(data); // Step 3: Digest into CRC32 using parameterized CRC32 - by default MPEG-2 - return (double)ComputeCrc32(fragBytes, (uint)poly, (uint)init, (uint)xorOut, reflected); + return (int)ComputeCrc32(fragBytes, (uint)poly, (uint)init, (uint)xorOut, reflected); } public static string text(Context ctx)