the semicolon in Pascal is a statement separator and the keyword "end" is not a statement, therefore, a semicolon should not be present before an "end".
The presence of a semicolon before the "end" causes an empty statement which as far as the compiler is concerned means nothing, thereby in turn generates nothing.
as far as your questions:
1. there is no guideline encouraging or discouraging the presence of empty statements but, generally speaking, superfluous semicolons should be avoided particularly when they may be visually "offensive", e.g, you can have a long list of semicolons following an "end" as in "end;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" (that last sequence compiles without errors because each semicolon indicates an empty statement.)
2. The only practical impact is that the semicolon takes space in the source code and, as such must be scanned, the parser will interpret as an empty statement which means it will simply be ignored/discarded.
3. No, there is no directive to instruct the compiler to flag superfluous semicolons. At least not at this time.
Thoughts ? ... if placing a semicolon somewhere doesn't look good, just don't put one, if one is required the compiler will complain and then you can add it knowing it is required. Other than that, don't sweat the semicolons.
Lastly, empty statements (semicolons) can be useful in a few occasions, here is an example:
if <some error condition> then
{$if FORCE_ERROR_CONDITION} ; {$endif}
begin
<some statements>
end;
defining {$define FORCE_ERROR_CONDITION} forces the <some statements> part of the "if" to be executed because the <some error condition> ends up controlling the empty statement instead of the statements in <some statements>. This allows you to test that <some statements> do what you intended without having to find a case that causes the <some error condition> to be triggered. I used that extensively for testing my code. Saves a lot of time in not having to contrive cases to trigger errors.
HTH.