[antlr-interest] Parsing problem in C++

David Wigg wiggjd at bcs.org.uk
Tue Nov 9 05:26:06 PST 2010


I updated the CPP_parser from Antlr1 to Antlr2. Ramin Zaghi has done a
great job to convert that to run under Antlr3. However, we do still
have a problem with understanding one particular piece of code.

This is in an include file, iosfwd (1998). shown below. The line in question is
for (_N = 0; !eq(*_U, _E(0)); ++_U)
and I would like to know what _E(0) is in order to able to parse it
properly. It must be something that returns a value (like a pointer?).
It looks to me like very early C code for a typecast but a later
version (2007) of iosfwd has something similar, "_Elem()", in that
position so I suppose it can't be a typecast.
Is it a function? It can't be a class because a class doesn't return a value.

I hope some C++ expert can help. If so, it would be a great help if
he/she could quote chapter and verse from Stroustrup's book (Third
Edition, or indeed any other) as well since that would help to get our
C++ grammar file correct..

Thanks.

David Wigg

template<class _E>
        struct char_traits {
        typedef _E char_type;
        typedef _E int_type;
        typedef streampos pos_type;
        typedef streamoff off_type;
        typedef mbstate_t state_type;
        static void __cdecl assign(_E& _X, const _E& _Y)
                {_X = _Y; }
        static bool __cdecl eq(const _E& _X, const _E& _Y)
                {return (_X == _Y); }
        static bool __cdecl lt(const _E& _X, const _E& _Y)
                {return (_X < _Y); }
        static int __cdecl compare(const _E *_U, const _E *_V, size_t _N)
                {for (size_t _I = 0; _I < _N; ++_I, ++_U, ++_V)
                        if (!eq(*_U, *_V))
                                return (lt(*_U, *_V) ? -1 : +1);
                return (0); }
        static size_t __cdecl length(const _E *_U)
                {size_t _N;
                for (_N = 0; !eq(*_U, _E(0)); ++_U)  // I would like
to know what _E(0) is to parse it
                        ++_N;
                return (_N); }
        static _E * __cdecl copy(_E *_U, const _E *_V, size_t _N)
                {_E *_S = _U;
                for (; 0 < _N; --_N, ++_U, ++_V)
                        assign(*_U, *_V);
                return (_S); }
        static const _E * __cdecl find(const _E *_U, size_t _N,
                const _E& _C)
                {for (; 0 < _N; --_N, ++_U)
                        if (eq(*_U, _C))
                                return (_U);
                return (0); }
        static _E * __cdecl move(_E *_U, const _E *_V, size_t _N)
                {_E *_Ans = _U;
                if (_V < _U && _U < _V + _N)
                        for (_U += _N, _V += _N; 0 < _N; --_N)
                                assign(*--_U, *--_V);
                else
                        for (; 0 < _N; --_N, ++_U, ++_V)
                                assign(*_U, *_V);
                return (_Ans); }
        static _E * __cdecl assign(_E *_U, size_t _N, const _E& _C)
                {_E *_Ans = _U;
                for (; 0 < _N; --_N, ++_U)
                        assign(*_U, _C);
                return (_Ans); }
        static _E __cdecl to_char_type(const int_type& _C)
                {return ((_E)_C); }
        static int_type __cdecl to_int_type(const _E& _C)
                {return ((int_type)_C); }
        static bool __cdecl eq_int_type(const int_type& _X,
                const int_type& _Y)
                {return (_X == _Y); }
        static int_type __cdecl eof()
                {return ((-1)); }
        static int_type __cdecl not_eof(const int_type& _C)
                {return (_C != eof() ? _C : !eof()); }
        };


More information about the antlr-interest mailing list