Internal Test: Demonstrates how changing an operator's precedence at runtime affects the parsing of subsequent expressions.
ID: 657
See: Precedence = [int]
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 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"));
#include
#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 #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; }
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 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