For a while, the C++ shortcomings of the .map file processor meant that I completely ignored those errors. But v11.1.0 has come out (MCUXpresso IDE v11.1.0 [Build 3209] [2019-12-12]), and it has pretty much fixed all of them, so I gave it another try. Unfortunately, there's still a problem, and it has to do with ld's PROVIDE keyword.
First, an explanation: You can tell ld that, if it cannot find one symbol, to PROVIDE a different symbol in its place. If the required symbol is given, then the PROVIDE is ignored.
For example, you could specify a default function, and then a table of function pointers pre-populated with a three different entries:
typedef void Fn(void);
// User defined functions
extern void Fn1(void);
extern void Fn2(void);
extern void Fn3(void);
// Table of callable functions
Fn *table[] = { &Fn1, &Fn2, &Fn3 };
// Default implementation
void DefaultFn(void) {
// Do default stuff here
} // DefaultFn(void)
This would require all three Fn#() functions to be defined somewhere - except that the linker script has the following lines:
PROVIDE ( Fn1 = DefaultFn );
PROVIDE ( Fn2 = DefaultFn );
PROVIDE ( Fn3 = DefaultFn );
Now, unless the programmer provides one of the Fn#() functions, DefaultFn() will do the job. Yes, this is similar to weak functions and weak substitutions, but a different way to achieve the same end - and somewhat more portable.
Your parser, however, doesn't recognise PROVIDE as a keyword, and gets confused by the opening parenthesis:
missing '=' at '('
Again, ld has no problem with this syntax: only your parser does.