RailwayContainer ::= Route* Region*;
abstract RailwayElement ::= <id:int>;
Region : RailwayElement ::= TrackElement* Sensor*;
Semaphore : RailwayElement ::= <Signal:Signal>;
Route : RailwayElement ::= <Active:boolean> SwitchPosition* <_impl_requires:RefList<Sensor>> <_impl_entry:Semaphore> <_impl_exit:Semaphore>;
SwitchPosition : RailwayElement ::= <Position:Position> <_impl_target:Switch>;
Sensor : RailwayElement ::= <_impl_monitors:RefList<TrackElement>>;
abstract TrackElement : RailwayElement ::= <_impl_monitoredBy:RefList<Sensor>> <_impl_connectsTo:RefList<TrackElement>>;
Segment : TrackElement ::= <Length:int> Semaphore*;
Switch : TrackElement ::= <CurrentPosition:Position> <_impl_positions:RefList<SwitchPosition>>;