I think the best soulution would be like you suggested to add the '$'
character to the valid basic source character set to allow identifiers
containeing a $. I therefore tested out how different major compilers
and versions of these compilers handle this. The following compilers
and versions of the compilers allow a '$' character within the
identifiers (of macros):
gcc 2.95, 3.1, 3.2, 3.3.3, 3.4.3 and 4.0.2
icc (intel c compiler) 8.0, 8.1
I would corroborate for the fact that it seems like there is some
traction for allowing '$' characters within identifiers in major
compiler preprocessors.
I have not been able to reproduce the error you got with GCC or with
any other compiler . Which compiler and version did you use when you
got your error message?
Thanks
Andreas
Andreas Sæbjørnsen wrote:
> When preprocessing the code
> #define $jack int test;
> $jack
> using any preprocessor using the wave library, in this case
> the samples/lexed_tokens/lexed_tokens preprocessor , gives
> the following error:
>
> PP_DEFINE (#369) at test.C ( 1/ 1): >#define<
> SPACE (#393) at test.C ( 1/ 8): > <
> lexed_tokens:
> /home/saebjornsen1/projects/boost/boost/wave/token_ids.hpp:497
> : boost::wave::util::flex_string<char,
> std::char_traits<char>, std::allocator<char>,
> boost::wave::util::CowString<boost::wave::util::AllocatorStrin
> gStorage<char, std::allocator<char> >, char*> >
> boost::wave::get_token_name(boost::wave::token_id): Assertion
> `id < T_LAST_TOKEN-T_FIRST_TOKEN' failed.
> Aborted
>
> using the preprocesor cpp (from the gcc team) I get (as cpp test.C ):
> # 1 "test.C"
> # 1 "<built-in>"
> # 1 "<command line>"
> # 1 "test.C"
>
> int test;
>
> I believe the problem lies in that the lexer does not
> recognize the '$' as a valid character within the name of
> macro definition.
Accordingly to the Standard the '$' character is _not_ part of the basic
source character set (see 2.2.1 [lex.charset ]). For this reason it won't get
recognized as the part of a identifier.
I fixed the lexed_tokens sample (actually the Wave library) so you won't get
an assertion anymore, but a meaningful output. Now the output is:
PP_DEFINE (#369) at test.cpp ( 1/ 1): >#define<
SPACE (#393) at test.cpp ( 1/ 8): > <
<UnknownToken> (#36 ) at test.cpp ( 1/ 9): >$<
IDENTIFIER (#381) at test.cpp ( 1/10): >jack<
SPACE (#393) at test.cpp ( 1/14): > <
INT (#335) at test.cpp ( 1/15): >int<
SPACE (#393) at test.cpp ( 1/18): > <
IDENTIFIER (#381) at test.cpp ( 1/19): >test<
SEMICOLON (#297) at test.cpp ( 1/23): >;<
NEWLINE (#395) at test.cpp ( 1/24): >\n<
NEWLINE (#395) at test.cpp ( 2/ 1): >\n<
<UnknownToken> (#36 ) at test.cpp ( 3/ 1): >$<
IDENTIFIER (#381) at test.cpp ( 3/ 2): >jack<
NEWLINE (#395) at test.cpp ( 3/ 6): >\n<
BTW: when using the wave driver for the code given above you get:
test.cpp(1): error: ill formed preprocessor directive: #define
What certainly could be done additionally is to add the '$' character to the
valid basic source character set to allow identifiers conatining a '$', but
this weakens the Standards conformance of Wave. Any suggestions?
HTH
Regards Hartmut
_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users