>>>> Integral Type Syntax : : : [] : | : Bin|Bin() // Bin means bin as per test object, Bin(Undefined) is the same as not binning : : {*} : if () | : Bool|Category|DCLevels|Integer|MathExpr|NrwUnits|PatternBurstSelector|SignalGroup|String|Timing : : : [a-zA-Z][a-zA-Z0-9_]* : [0-9]+ : : mutable // With: arg may be set per test object execution, Without: arg set once; "const" instead ? : : : GroupExit|NextNode| // within Group, last FlowNode's NextNode=GroupExit : : (;)*|(;)? : "" : ||||| ||||| ||||| ||||| : Pass|Fail : // Presence of optional requires righthand side of [, ...] // Defer to IEEE std 754 regarding treatment of +-Infinity and NaN // Allow for complicated unit types ? e.g., I2R (I squared R) instead of V or Volts ? Amperes ()? = |Infinity|NaN; Bool ()? = True|False; Category ()? = ; Coulombs ()? = |Infinity|NaN; DCLevels ()? = ; Farads ()? = |Infinity|NaN; Hertz ()? = |Infinity|NaN; Integer ()? = ; MathExpr ()? = ; // e.g., I^2*R, may or may not be reducible to basic units NrwUnits ()? = ; // e.g., 1.5V, 1.5A2Ohms ? Ohms ()? = |Infinity|NaN; PatternBurst ()? = ; Real ()? = |Infinity|NaN; Seconds ()? = |Infinity|NaN Selector ()? = ; SignalGroup |()? = ||EmptySignalGroup String ()? = ; Timing ()? = ; Volts ()? = |Infinity|NaN; Watts ()? = |Infinity|NaN; PassBinMap|FailBinMap { (Axis { (Bin { (Descriptor = ;)* // Absence implies Descriptor = (PerRunCounter = ;)* // Absence implies Counter = 0, reinitialized with each run })* })* (Handler { [axis1, ..., axisN] ; // Nr of lines req'd = size(axis1)* ... *size(axisN) } )* } SymTbl { // Presence of optional requires righthand side of [, ...] )? ()? = ; } Method Test { (SymTbl { ... }? // Same as syntax above: see alternative Private below // Optional indicates whether parameter can be changed during flow // Presence of optional requires righthand side of [, ...] or & referring to matching array size symbol (In ()? ()? = &|;)* // Set default value (InOut ()? ()? = &;)* // Set default read/write reference to (Out ()? ()? = &|;)* // Set default value (Private ()? ()? = &|;)* // Set default value Ports { Entry { (Actions { NoActionExit|; })* } Exit { Condition Fail { (Actions { ; })* } Condition Pass // No (necessary|permitted) on last Condition { (Actions { ; })* } } } } // A Group may in principle contain 0 or more FlowNodes but STIL's integral // type contains none. Method Group { IsA Test; // Test object local to group. See syntax below (FlowNode * { (Execute ( // Reference to previously defined Test (instantiation of Method) { (In = Default|&|;)* // Override default non-const parameter value (InOut = Default|&;)* // Override default non-const read/write reference to (Out = Default|&|;)* // Override default non-const parameter value })| ( // Anonymous instantiation of Method { (In = &|;)* // Set default/only value (InOut = &;)* // Set default/only read/write reference to (Out = &|;)* // Set default/only value }) ) (Ports { (Entry { (Actions { ((NoActionExit )|)? })? } )* (Exit { (Condition ;)? (NextNode ;) (Actions { })? })+ }) })* } // A Flow may in principle contain 0 or more FlowNodes by virtue of being a // Group but STIL's integral type contains none. Method Flow { IsA Group; } // STIL and User Defined Methods Method { // Absence of statement implies 'IsA Test'. IsA Test|Group inherits // functions and data. Multiple inheritance is virtual, i.e., only one // copy of Test|Group|Method data is ever inherited. (IsA Test|Group|;)* // Method can't inherit from itself (In ()? = &|;)* // Set default value (InOut ()? = &;)* // Set default read/write reference to (Out ()? = &|;)* // Set default value } // Test Object Instantiation // used above Test { ((In)? = &|;)* // Setting default value for parameter defined in Method ((InOut)? = &;)* // Setting read/write reference parameter defined in Method ((Out)? = &|;)* // Setting default value for parameter defined in Method }