Joerg Schuelke schrieb:

So, why not? In the further reading the main thesis.
1.      As far as possible simple syntax, which fits into the up to
        date implemented language.
2.      Maximal implementation of this syntax. No needless
        restrictions.
3.      Effectiveness in view of the implementation.
4.      Effectiveness in view of the compiling process.
5.      Features:
        A view at the C-preprocessor tells us "stringification,
        concatenation, variadic macros" (I hate C too, but it is a
        starting point to make it better)
See:http://gcc.gnu.org/onlinedocs/cpp/ Macro definitions inside a macro definition are possible this
        time. For me it would be the export from unit interfaces and
        macro parameters.
[...]
at issue 4.
        A construct of the kind {$I mac_id(mac_paramlist)} instead
        of the simpler mac_id(mac_paramlist) for the use of an macro
        would solve some of the problems. Even in respect of the
        separation of true pascal code and preprocessor code it would
        be nice.

A general decision is required: do we *want* explicit or implicit macro expansion?

IMO an important use for macros is the ability to modify parts of the code, without touching the code to be modified. E.g. replacing DebugLn by a NOP macro allows to remove all debug output from a unit - much harder to do with $IFDEF.


The use of macros takes place in contexts which are different from those
in ordinary pascal constructs. For example the handing over of a
unknown number of parameters would be helpful. Obviously this leads to
the use of .. as ellipsis.

Issue variadic macros:

        {$define dp(x,y..):=
                dbgstr(%x%,[%y..%]);
        }

The same effect can be achieved by an invocation like
  dp(x,[y,z]);
just as in Format().


Remark: Up to now it is not clear what a token is for the preprocessor.
The simplest is to only recognize the tokens for the preprocessor
himself and to pass on the others unchanged as chars. The advantage of
this: maybe it fits better in the present scanner, maybe efficiency.

Macros should be stored as tokens, compatible with the scanner's Record and Replay methods. The preprocesor must not distinguish between identifiers and reserved words, see the implementation of context-sensitive directive handling. The detection of macro identifiers can be done in the keyword recognition, eventually resulting a tkMacro token.

What about syntactical checks while reading the macro replacement text?
No need for that, only the parameters are recognized and some kind of
mark inserted instead of them.

Macro arguments can be stored as identifiers, which then are found (during macro expansion) in the top-level symbol table. Eventually a new symbol type "MacroArgument" has to be introduced, that enforces argument substition, stringification etc.


Detail work:

1.      What about , and ) delimiting token in mac_paramlist.

IMO a macro parameter list should follow the language conventions, so that a procedure identifier can be replaced by a macro identifier, forcing macro expansion instead of generating an procedure call. I.e. the preprocessor is a *postprocessor* for scanner tokens.


One problem which I can see is the structure of the fpc scanner. His
interface is "really fat". Maybe further thinkings brings it out:
It is impossible to do that without rewriting the whole scanner. But I
will do that thinkings.

That's one more reason to position the preprocessor *after* the scanner, or at the end of the tokenizer to prevent another call level.


Sorry the bad English folks, but it was the harder work for me to
translate it, then it is for you, to read it.

Nice work :-)

As mentioned at the begin, I don't like special syntax for macro identifiers, invocation and parameters. The worth of your attempt, to speed up macro processing, must be determined after it has been implemented. IMO similar effects can be obtained by removing (not introducing) some of the C preprocessor misfeatures, which have not been considered yet. Candidates are recursive macro expansion and (also recursive?) expansion of macro parameters, as well as concatenation.

DoDi

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to