Many years ago, I wrote the following regular expression:
^(?:\s*)(class)?(?:\s*)(constructor|destructor|function|operator|procedure)(?:\s*)(\w+\.)*(\w+)(?:\s*)((?:\()((?:\;?\s*)(const|var|out)?(?:\s*)&?(\w+)(,\s*\w+)*(?:\s*\:\s*)&?((\w*)\.)*(\w+)(\s*\=\s*(''.*''|\w+|\d+))?)*(?:\)))*((?:\:\s*)((\w*)\.)*(\w+))?;
to parse the Delphi syntax for declaration of a routine.
Since the addition of generics to Delphi, the above regular expression no longer works, if and when there is a generic type in the declaration.
If I treat a simple generic type declaration as just an identifier, then it would be simple to expand the above regular expression.
However, it seems to me that a generic type declaration can be yet another generic type expression.
More investigations needed, I think.
In 2017, with the release of Delphi 10.2 Tokyo, Embarcadero introduced a specialized implementation of the Observer pattern into the System.Classes unit. While it has been in the wild for 9 years, it remains a "hidden" architecture for many, primarily because it serves as the invisible engine behind LiveBindings. Other than live bindings, you can also use the Observer pattern as a way to update component settings to the Windows registry, an .ini file, or persist it elsewhere.
System.Classes