Once defined, a symbol variable may be used on any succeeding command line. A symbol variable is identified to the input interpreter by preceding the variable name with a $ sign. The input interpreter identifies the variable name and substitutes the value of the variable in its place. Standard syntax rules require that the variable name must be delimited by blanks and cannot contain embedded blanks. The following example illustrates this point. The values of variable N1 and N2 are defined and then used to compute the value of N3.
symb n1 = 20 symb n2 = 40
symb n3 = $n1 + $n2
The input interpreter performs variable substitution in a single pass from right to left as shown here.
symb n4 = $n1 + $n2 + $n3 /*<-- parser starts from here and works to the left side
This approach allows for variable names to be composed of other variables as shown below. Several examples of the symbol substitution functionality are:
symb n = 3 symb sum3 = 300.7 symb name = sum3 symb test1 = $sum$n symb test2 = $$name
where, for the last assignment statement, the interpreter first evaluates $NAME to SUM3 before proceeding to evaluate $SUM3 and consequently, the value of TEST2 will be 300.7. Similarly, TEST1 will also be set to 300.7 since $N will first be evaluated to 3 before proceeding to evaluate $SUM3.
In certain situations, the user may need to guide the input interpreter by using parenthesis to physically denote the name of Symbol variables to evaluate. For example:
symb nrun = 3 symb name = a text file = model$(name)$(nrun)results
This sets text variable FILE to MODELA3RESULTS. If the parentheses are not included, the interpreter does not evaluate the variable names properly.
The input interpreter identifies a variable name to evaluate as the string between the $ and a terminating character. Terminating characters include: blank, period, comma, $, ( , ) , and /. Therefore, the following text string representing a file name would be set to /USA/RUN1.20
symb job = 1 symb project = usa symb index = 20 text filename = /$project/run$job.$index
Controlling Formats for Variable Substitutions in Text Strings
When arithmetic operations are performed, the full numerical precision of all variables is maintained throughout the Symbol substitution process. However, when performing symbol substitution within text strings to generate labels, filenames, etc., a user may need control over the formatting of the text substitution. Typically, a user will want to control the appearance of the values of floating point variables. For example:
symb theta = 90.5 symb phi = 25.5 text filename = data.theta.$theta.phi.$phi
if a user generates a file name containing the value of real variables THETA and PHI, the default format for a floating point value substitution is (g15.7) in Fortran convention which produces the following value for FILENAME:
To change the format, a user must define the format of the variable of interest using Fortran format syntax for a single variable. The symbol name must be followed immediately by the % sign and then a valid single variable format enclosed in parentheses The following illustrates the use of the formatting construct.
text filename = data.theta.$theta.phi.$phi%(f5.1)
Once a format for a particular variable type is specified, the default format for that type of variable is set to the format declaration and used in interpreting the rest of the input line. As the input interpreter evaluates the line from right to left, declaring a format for PHI causes the same format to be used for THETA, producing the following value for FILENAME:
Note that leading blanks produced by a specified format are stripped by default during the substitution process. Succeeding input lines revert to the original default format for real variable substitutions.
In certain cases, a user may not want the leading blanks stripped during the substitution process. Embedding the “<” character between the % and the start of the format specification causes any leading blanks to be present in the substituted string. Embedding the “>” character between the % and the start of the format specification causes any leading blanks to be filled with zeros in the substituted string. For example, the following statements:
symb n1 = 20 symb data1 = 30.5238 text label1 = 'values:$n1 & $data1' text label2 = 'values:$n1%(i5) & $data1%(f6.1)' text label3 = 'values:$n1%<(i5) & $data1%<(f6.1)' text label4 = 'values:$n1%>(i5) & $data1%>(f6.1)'
produce the following results:
- label1 = values:20 & 30.52380
- label2 = values:20 & 30.5
- label3 = values: 20 & 30.5
- label4 = values:00020 & 0030.5
THE IF, ELSEIF, ELSE and ENDIF STATEMENTS
Symbol supports the IF, ELSEIF, ELSE and ENDIF statements in order to provide structured, conditional branching constructs. An example of the use of these statement is:
if ( $n eq 1 ) then symb comment = first elseif ( $n eq $nlast ) then symb comment = last else symb comment = middle endif
An IF conditional must begin with an IF statement and terminate with an ENDIF statement. The basic form of the IF statement is:
- IF ( datum1 op datum2 ) THEN
where op is any of the conditional operators: EQ, NE, LT, LE, GT and GE whose meanings correspond to their usage in Fortran. datum1 and datum2 can be either numeric or character data. Multiple conditionals may be used in a single IF statement by using the AND or OR Boolean operators. The order of conditionals may be controlled through the use of parenthesis. Several examples are:
if ( $n eq 1 and $x ne 0.0 ) then
if ( $n eq 1 and ( $x ne 0.0 or $y ne 0.0 ) ) then
The form of the ELSEIF statement is similar to the IF statement.
The ELSE and ENDIF statements have no other input parameters on the command line.
Once an IF statement is encountered, the following input lines down to the terminating ENDIF statement are read in and stored as an IF procedure which is then invoked. If an ENDIF statement is accidentally omitted from the input file, the code will read to the end of the file and terminate with an error.
Nested sets of IF statements are allowed.
An example is:
if ( $n eq 1 ) then if ( $iset eq 1 ) then symb comment = first1 elseif ( $iset eq 2 ) then symb comment = first2 endif elseif ( $n eq $nlast ) then if ( $iset eq 1 ) then symb comment = last1 elseif ( $iset eq 2 ) then symb comment = last2 endif endif
- Including the STOP command within an IF/ELSEIF logic block will result in termination of the job at the time the STOP command is read. Use SYMB #EXIT to provide a code termination statement within an IF/ELSEIF logic block.
- In-line functions on and IF/ELSEIF line are not interpreted. e.g., do not use use commands such as: IF ( ABS ( $N ) EQ 1 ) THEN
THE END$ STATEMENT
The END$ statement identifies a line in the input command file and has the form:
- linename = from 1 to 8 character name identifying this line
The program does not require that linename be unique. That is, more than one END$ statement can have the same name.
The END$ statement is used to identify the location in the input stream to branch to for GOTO statements and the ending points of do loops and procedures defined with the DO and PROC statements, respectively.