Basic Syntax
Revised: October 2022Programming, much like art, has significant flexibility for coders: there is no "one right way" to enter your code into the engine. You pass a filename to the engine via the command line or a configuration file. The MP parser is capable of processing even obfuscated pascal source, as the grammar specifies each token is separated by a form of white space or operator. As an example, the following both represent acceptable (valid) syntax under MP:
Begin
If A>1 then Writeln('Greater');
End.
and
Begin
If (A>1)
then
Writeln('Greater');
End.
Visually they are clearly different. However, consider the following syntactic rule:
Any consecutive letters are first considered an IDENTIFIER until tested against the grammar as a possible keyword or reserved word.
Thus any form of separator (space, punctuation which is usually an operator, or end of line) can be placed anywhere that will not break the flow of logic. Meaning, you could not do, for example, the following - MP does its best to decipher (parse) the code, but there are limits to extrapolation (guessing!):
If A>
1
Blocks of Code
All code in Pascal dialects are usually grouped between a Begin and an End; just like 'C', C#, JavaScript, etc. use { and }, Pascal was designed to convey the logic is spoken out loud. That is where "Begin" is much shorter than "Open Brace", and "End" is shorter than "Closed Brace". I point this out in long/verbal form, as for many years the argument has been based upon typed characters.
Object Oriented Pascal
Personally I enjoy the evolution of the Modern Pascal OOP programming style.
Type MyObjDefinition = Class Protected AValue:Longint; Public Procedure Init; {more like Turbo Pascal instead of Delphi} Procedure Free; End;
In Modern Pascal, your Class can be a descendent of another, like Class(TComponent), and Modern Pascal does not have the reserved words Constructor nor Destructor. Again, Modern Pascal's primary focus is speed, and reducing the Reserved Words tree during parsing by just 2 commands does impact the performance on a couple million lines of code.
Another difference is Modern Pascal uses self instantiation, to achieve this, the developer must implement the VMT (Virtual Memory Tree) of each class in the MyObjDefinition.Init definition, like so:
Procedure MyObjDefinition.Free; Begin End; Procedure MyObjDefinition.Init; Begin // Build the RTTI by hand: with Self do begin TMethod(@Free):=[@MyObjDefinition.Free,@Self]; // Links the FREE method to this class! End; End;Now we have informed the parser how to define the VMT/RTTI of MyObjDefinition. To use it becomes just as simple:
Var
MOD:MyObjDefinition;
Begin
MOD.Init; {Slick!}
// Now you could call methods of MOD here, and when you are finished with MOD:
MOD.Free;
End;
So it requires a little extra typing that other compilers and IDEs inject under the hood during compile time. We did not elect to follow the practice of the compiler making assumptions as we have had scenarios where we needed to control everything at a granular level on some of our multi-gigabyte projects. Now, you the developer have complete control over the VMT/RTTI layer without having a masters degree in compiler development.