In C++, the symbols '<' and '>' are used for comparisons as well as for signifying a template argument. Thus, the code snippet
[...] Foo < Bar > [...]
might be interpreted as any of the following two ways:
How does the parser for a C++ compiler efficiently decide between those two possibilities?
If Foo
is known to be a template name (e.g. a template <...> Foo ...
declaration is in scope, or the compiler sees a template Foo
sequence), then Foo < Bar
cannot be a comparison. It must be a beginning of a template instantiation (or whatever Foo < Bar >
is called this week).
If Foo
is not a template name, then Foo < Bar
is a comparison.
In most cases it is known what Foo
is, because identifiers generally have to be declared before use, so there's no problem to decide one way or the other. There's one exception though: parsing template code. If Foo<Bar>
is inside a template, and the meaning of Foo
depends on a template parameter, then it is not known whether Foo
is a template or not. The language standard directs to treat it as a non-template unless preceded by the keyword template
.
The parser might implement this by feeding context back to the lexer. The lexer recognizes Foo
as different types of tokens, depending on the context provided by the parser.