A syntax-directed approach to the semantics of concurrent languages