Internal Test: Demonstrates how changing an operator's precedence at runtime affects the parsing of subsequent expressions.

ID: 657

				
					using uCalcSoftware;

var uc = new uCalc();
// Define '##' with the same precedence as 'And'. 'And' binds tighter than 'Or'.
var and_prec = uc.ItemOf("And", uCalc.Properties(ItemIs.Infix)).Precedence;
var op_handle = uc.DefineOperator("{a} ## {b} As Boolean = a and b", and_prec);

Console.WriteLine("--- Initial Precedence (like 'And') ---");
// Evaluation is like: true or (false and false) -> true or false -> true
Console.WriteLine(uc.EvalStr("true or false ## 1 == 2"));

// Now, change the precedence to be lower than 'Or'.
var or_prec = uc.ItemOf("Or", uCalc.Properties(ItemIs.Infix)).Precedence;
op_handle.Precedence = or_prec - 10;

Console.WriteLine("");
Console.WriteLine("--- Changed Precedence (lower than 'Or') ---");
// Evaluation is like: (true or false) and false -> true and false -> false
Console.WriteLine(uc.EvalStr("true or false ## 1 == 2"));
				
			
--- Initial Precedence (like 'And') ---
true

--- Changed Precedence (lower than 'Or') ---
false
				
					#include <iostream>
#include "uCalc.h"

using namespace std;
using namespace uCalcSoftware;

int main() {
   uCalc uc;
   // Define '##' with the same precedence as 'And'. 'And' binds tighter than 'Or'.
   auto and_prec = uc.ItemOf("And", uCalc::Properties(ItemIs::Infix)).Precedence();
   auto op_handle = uc.DefineOperator("{a} ## {b} As Boolean = a and b", and_prec);

   cout << "--- Initial Precedence (like 'And') ---" << endl;
   // Evaluation is like: true or (false and false) -> true or false -> true
   cout << uc.EvalStr("true or false ## 1 == 2") << endl;

   // Now, change the precedence to be lower than 'Or'.
   auto or_prec = uc.ItemOf("Or", uCalc::Properties(ItemIs::Infix)).Precedence();
   op_handle.Precedence(or_prec - 10);

   cout << "" << endl;
   cout << "--- Changed Precedence (lower than 'Or') ---" << endl;
   // Evaluation is like: (true or false) and false -> true and false -> false
   cout << uc.EvalStr("true or false ## 1 == 2") << endl;
}
				
			
--- Initial Precedence (like 'And') ---
true

--- Changed Precedence (lower than 'Or') ---
false
				
					Imports System
Imports uCalcSoftware
Public Module Program
   Public Sub Main()
      Dim uc As New uCalc()
      '// Define '##' with the same precedence as 'And'. 'And' binds tighter than 'Or'.
      Dim and_prec = uc.ItemOf("And", uCalc.Properties(ItemIs.Infix)).Precedence
      Dim op_handle = uc.DefineOperator("{a} ## {b} As Boolean = a and b", and_prec)
      
      Console.WriteLine("--- Initial Precedence (like 'And') ---")
      '// Evaluation is like: true or (false and false) -> true or false -> true
      Console.WriteLine(uc.EvalStr("true or false ## 1 == 2"))
      
      '// Now, change the precedence to be lower than 'Or'.
      Dim or_prec = uc.ItemOf("Or", uCalc.Properties(ItemIs.Infix)).Precedence
      op_handle.Precedence = or_prec - 10
      
      Console.WriteLine("")
      Console.WriteLine("--- Changed Precedence (lower than 'Or') ---")
      '// Evaluation is like: (true or false) and false -> true and false -> false
      Console.WriteLine(uc.EvalStr("true or false ## 1 == 2"))
   End Sub
End Module
				
			
--- Initial Precedence (like 'And') ---
true

--- Changed Precedence (lower than 'Or') ---
false