Expression
Formal Definition
A formula that defines the
computation of a value.
Syntax:
expression ::= relation { and
relation }
|
relation { or relation }
|
relation { xor relation }
|
relation [ nand relation ]
|
relation [ nor relation ]
|
relation { xnor relation }
relation ::= shift_expression [ relational_operator shift_expression ]
shift_expression ::= simple_expression [ shift_operator
simple_expression ]
simple_expression ::= [ + | -
] term { adding_operator term }
term ::= factor { multiplying_operator factor }
factor ::= primary [ ** primary
]
| abs primary
| not primary
primary ::= name
| literal
| aggregate
| function_call
| qualified_expression
| type_conversion
| allocator
| ( expression )
qualified_expression ::= type_mark ' ( expression )
|
type_mark ' aggregate
Description
Expressions define the way in which values are computed. They consist
of operands and operators. For example, the expression "1 +
2" adds two integer numbers. The numbers are operands and the
plus sign is a pre-defined adding operator. Each operand has a value
and a type and the type of expression depends on the types of
operands and the operation. The order in which the operations are
performed depends on the priorities assumed in the language (see operators
for details).
If an expression is constructed using logical operators and,
or, xor
or xnor, it may contain a
sequence of operations, but if operations nand
or nor are used, an
expression may contain only one operation of this type (Example 1).
If more are needed, parentheses can be used.
The expression is evaluated from left to right preserving precedence
of operations. If this precedence is to be changed, parentheses
(introducing highest priority) can be applied (Example 2).
An expression may consist of one or more relations. A relation is
created from operands in the form of a shift expression in which the
operands are connected with each other by the relation operator. The
shift expression is written by shifting simple expressions using the
shift operators.
The simple expression consists of the sign operator with operands
being the terms connected with each other by the adding operator.
The term consists of factors, which are connected with each other by
the multiplication operation.
The factor may be so-called primary, possibly preceded by the abs
or not operators or two
primaries connected with an operator **.
The primary can be the name,
literal, aggregate,
function call, type
conversion, allocator
(see respective topics for details). Example 3 presents an example of
a complex expression with several operators.
Examples
Example 1
variable A, B, C, D : bit;
-- operator nand appears only once:
C := A nand B ;
-- operators and, or can be used more than once in one expression:
A := '1' and B and
C or D;
-- multilevel nand operation modeled with parentheses:
A := (D nand B) nand C;
Two logical operations (nand and nor) may appear only once in an
expression, unless parentheses are used.
Example 2
A := '1' and (B and
(C or D));
Without the parentheses, first the and logical operation of '1' and B
would be performed, then C would be and-ed to the result, and finally
D would be or-ed with the rest. With the parentheses, first C would
be or-ed with D, then and-ed with B and finally logical and would be
performed on the result of the operations and logical '1'.
Example 3
A1 := a * (abs b) + 10 <= 256;
Expression composed of several operands. A1 must be of type BOOLEAN
as the relation operator has higher precedence than arithmetic operations.
Important Notes
-
Operators are defined for particular types of operands and this must
be reflected in each expression.
-
Different operators can be mixed in one expression as long as the
operands are of correct (for each individual operator) type.
|