- Desktop
- Tools
- PASCAL Programming
- Pascal Language Syntax
Pascal Language Syntax
This chapter covers the Pascal language used in Optuma to write scripts.
Pascal Syntax
Section titled “Pascal Syntax”Overview
Section titled “Overview”Optuma scripting executes scripts written in Pascal syntax. Current Pascal syntax supports:
- begin .. end constructor
- procedure and function declarations
- if .. then .. else constructor
- for .. to .. do .. step constructor
- while .. do constructor
- repeat .. until constructor
- try .. except and try .. finally blocks
- case statements
- array constructors (x:=[ 1, 2, 3 ];)
- ^ , * , / , and , + , - , or , <> , >=, ⇐ , = , > , < , div , mod , xor , shl , shr operators
- access to object properties and methods ( ObjectName.SubObject.Property )
Script Structure
Section titled “Script Structure”Script structure is made of three main parts
a) variable declarations - used to declare variables used in parts b and c.
b) Tool Init procedure - is called once when a tool first initialised
c) Tool Process procedure - is called every time new data is received or when the selection points of the tool are moved.
The scripting language allows for procedures to be declared before the Init and Process functions and can then be used anywhere in the script file.
SCRIPT 1:
Section titled “SCRIPT 1:”procedure DoSomething;begin CallSomething;end;begin CallSomethingElse;end;SCRIPT 2:
Section titled “SCRIPT 2:”begin CallSomethingElse;end;SCRIPT 3:
Section titled “SCRIPT 3:”function MyFunction;begin result:='Ok!';end;SCRIPT 4:Language Features
Section titled “SCRIPT 4:Language Features”CallSomethingElse;Like in pascal, statements should be terminated by ”;” character. Begin..end blocks are allowed to group statements.
Identifiers
Section titled “Identifiers”Identifier names in script (variable names, function and procedure names, etc.) follow the most common rules in pascal : should begin with a character (a..z or A..Z), or ’_’, and can be followed by alphanumeric chars or ’_’ char. Cannot contain any other character or spaces.
Valid identifiers:
Section titled “Valid identifiers:”- VarName
- _Some
- V1A2
Invalid identifiers:
Section titled “Invalid identifiers:”- 2Var
- My Name
- Some-more
- This,is,not,valid
Assign Statements
Section titled “Assign Statements”Just like in Pascal, assign statements (assign a value or expression result to a variable or object property) are built using ”:=”. Examples:
- MyVar := 2;
- Button.Caption := ‘This ’ + ‘is ok.’;
Character Strings
Section titled “Character Strings”Strings (sequence of characters) are declared in pascal using single quote (’) character. Double quotes (”) are not used. You can also use #nn to declare a character inside a string. There is no need to use ’+’ operator to add a character to a string. Some examples:
- A := ‘This is a text’;
- Str := ‘Text ’+‘concat’;
- B := ‘String with CR and LF char at the end’#13#10;
- C := ‘String with ‘#33#34’ characters in the middle’;
Comments
Section titled “Comments”Comments can be inserted inside script. You can use // chars or (* *) or { } blocks. Using // the comment will finish at the end of line.
//This is a comment before ShowMessageShowMessage('Ok');
(* This is another comment *)ShowMessage('More ok;
{ And this is a commentwith two lines }ShowMessage('End of okays');Variables
Section titled “Variables”Variables need to be declared in scripts. You can declare variable by using var directive and its name. A compile error will be raised if variables are used but not declared in the script. Examples:
SCRIPT 1:
Section titled “SCRIPT 1:”procedure Msg;var S;begin S:='Hello world!'; ShowMessage(S);end;SCRIPT 2:
Section titled “SCRIPT 2:”var A;begin A:=0; A:=A+1;end;SCRIPT 3:
Section titled “SCRIPT 3:”var S: string;begin S:='Hello World!'; ShowMessage(S);end;Indexes
Section titled “Indexes”Strings, arrays and array properties can be indexed using ”[” and ”]” chars. For example, if Str is a string variable, the expression Str[3] returns the third character in the string denoted by Str, while Str[I + 1] returns the character immediately after the one indexed by I. More examples:
- MyChar:=MyStr[2];
- MyStr[1]:=‘A’;
- MyArray[1,2]:=1530;
- Lines.Strings[2]:=‘Some text’;
Arrays
Section titled “Arrays”Script support array constructors and support to variant arrays. To construct an array, use ”[” and ”]” chars. You can construct multi-index array nesting array constructors. You can then access arrays using indexes. If array is multi-index, separate indexes using ”,”. If variable is a variant array, script automatically support indexing in that variable. A variable is a variant array is it was assigned using an array constructor, if it is a direct reference to a Delphi variable which is a variant array (see Delphi integration later) or if it was created using VarArrayCreate procedure. Arrays in script are 0-based index. Some examples:
NewArray := [ 2,4,6,8 ];Num:=NewArray[1]; //Num receives "4"MultiArray := [ ['green','red','blue'] , ['apple','orange','lemon'] ];Str:=MultiArray[0,2]; //Str receives 'blue'MultiArray[1,1]:='new orange';NewArray := VarArrayCreate([0,3], vaInt32); // Create an array of integers and init the size without setting valuesNewArray := VarArrayCreate([0,1,0,10], varDouble); // Two dimensional Array of doublesIf Statements
Section titled “If Statements”There are two forms of if statement: if…then and the if…then…else. Like normal pascal, if the if expression is true, the statement (or block) is executed. If there is else part and expression is false, statement (or block) after else is execute. Examples:
if J <> 0 then Result := I/J;if J = 0 then Exit else Result := I/J;if J <> 0 thenbegin Result := I/J; Count := Count + 1;endelse Done := True;While Statements
Section titled “While Statements”A while statement is used to repeat a statement or a block, while a control condition (expression) is evaluated as true. The control condition is evaluated before the statement. Hence, if the constrol condition is false at first iteration, the statement sequence is never executed. The while statement executes its constituent statement (or block) repeatedly, testing expression before each iteration. As long as expression returns True, execution continues. Examples:
while Data[I] <> X do I := I + 1;while I > 0 dobegin if Odd(I) then Z := Z * X; I := I div 2; X := Sqr(X);end;while not Eof(InputFile) dobegin Readln(InputFile, Line); Process(Line);end;Repeat Statements
Section titled “Repeat Statements”The syntax of a repeat statement is repeat statement1; …; statementn; until expression where expression returns a Boolean value. The repeat statement executes its sequence of constituent statements continually, testing expression after each iteration. When expression returns True, the repeat statement terminates. The sequence is always executed at least once because expression is not evaluated until after the first iteration. Examples:
repeat K := I mod J; I := J; J := K;until J = 0;repeat Write('Enter a value (0..9): '); Readln(I);until (I >= 0) and (I <= 9);for c:=1 to 10 do a:=a+c;For Statements
Section titled “For Statements”Scripter support for statements with the following syntax: for counter := initialValue to finalValue do statement For statement set counter to initialValue, repeats execution of statement (or block) and increment value of counter until counter reachs finalValue. Examples:
SCRIPT 1:
Section titled “SCRIPT 1:”for c:=1 to 10 do a:=a+c;SCRIPT 2:
Section titled “SCRIPT 2:”for i:=a to b dobegin j:=i^2; sum:=sum+j;end;Case Statements
Section titled “Case Statements”Scripter support case statements with following syntax:
case selectorExpression of caseexpr1: statement1; ... caseexprn: statementn;else elsestatement;endif selectorExpression matches the result of one of caseexprn expressions, the respective statement (or block) will be execute. Otherwise, elsestatement will be execute. Else part of case statement is optional. Different from Delphi, case statement in script doesn’t need to use only ordinal values. You can use expressions of any type in both selector expression and case expression. Example:
case uppercase(Fruit) of 'lime': ShowMessage('green'); 'orange': ShowMessage('orange'); 'apple': ShowMessage('red');else ShowMessage('black');end;Function and Procedure Declaration
Section titled “Function and Procedure Declaration”Declaration of functions and procedures are similar to Object Pascal in Delphi, with the difference you don’t specify variable types. Just like OP, to return function values, use implicited declared result variable. Parameters by reference can also be used, with the restriction mentioned: no need to specify variable types. Some examples:
procedure HelloWord;begin ShowMessage('Hello world');end;
procedure UpcaseMessage(Msg);begin ShowMessage(Uppercase(Msg));end;
function TodayAsString;begin result:=DateToStr(Date);end;
function Max(A,B);begin if A>B then result:=A else result:=B;end;
procedure SwapValues(var A, B);Var Temp;begin Temp:=A; A:=B; B:=Temp;end;Forum Discussion
Your privacy choices
We use cookies and similar technologies to make the site work, see how it's used, and improve it. Analytics and advertising cookies only run with your consent — see our Privacy Policy for details.