Eliminate automata to string casts
This CIF to CIF transformation eliminates casts of automata to strings.
This transformation supports a subset of CIF specifications. The following restrictions apply:
Component definitions and component instantiations are not supported.
No preprocessing is currently performed by this CIF to CIF transformation. To increase the subset of specifications that can be transformed, apply the following CIF to CIF transformations (in the given order):
All casts of automata to strings, using either implicit automaton
self references or explicit automata references, are eliminated. If the referred automaton has only a single location, the cast is replaced by a string literal with the name of that location. If the automaton has multiple locations, the cast is replaced by an
if expression, using the locations of the automaton as guards, and string literals containing the location names as values. For nameless locations the string literal
"*" is used.
For instance, consider the following CIF specification:
automaton a: alg string x = <string>self; location: initial; end automaton b: alg string x = <string>self; location l1: initial; location l2: end
This is transformed to the following CIF specification:
automaton a: alg string x = "*"; location: initial; end automaton b: alg string x = if l1: "l1" elif l2: "l2" else "l3" end; location l1: initial; location l2; location l3; end
if expressions are usually larger than the original cast expressions. The increase is linear in terms of the number of locations times the number of casts.
This transformation introduces 'if' expressions for automaton to string casts, for automata with at least two locations. The guards of such 'if' expressions refer to the locations of the automata. To eliminate such location references, apply the Eliminate the use of locations in expressions CIF to CIF transformation.