L'analyseur lexical utilise ce qui est généralement appelé un "maximum de munch" algorithme pour créer des jetons. Cela signifie que c'est la lecture de caractères, il maintient la lecture des caractères jusqu'à ce qu'il rencontre quelque chose qui ne peut pas être partie de la même jeton que ce qu'il a déjà (par exemple, si elle a été la lecture des chiffres de telle sorte à ce qu'il a est un nombre, si elle rencontre une A
, il sait que ne peuvent pas faire partie du nombre. donc, il s'arrête et laisse l' A
dans le tampon d'entrée à utiliser comme le début de la prochaine jeton). Il renvoie alors que le jeton à l'analyseur.
Dans ce cas, cela signifie que +++++
obtient lexed comme a ++ ++ + b
. Depuis le premier post-incrémentation donne une rvalue, la seconde ne peut pas être appliquée, et le compilateur indique une erreur.
Juste FWIW, en C++, vous pouvez surcharger operator++
de rendement une lvalue, ce qui permet que cela fonctionne. Par exemple:
struct bad_code {
bad_code &operator++(int) {
return *this;
}
int operator+(bad_code const &other) {
return 1;
}
};
int main() {
bad_code a, b;
int c = a+++++b;
return 0;
}
La compile et s'exécute (bien qu'il ne fait rien) avec les compilateurs C++ que j'ai à portée de main (VC++, g++, Comeau).