Quelles sont les règles d’parsing des expressions en C?

Comment puis-je comprendre l’parsing syntaxique d’expressions comme

a = b+++++b---c--; 

en C?

Je viens de composer l’expression ci-dessus, et oui, je peux vérifier les résultats à l’aide de n’importe quel compilateur, mais ce que je veux savoir, c’est la règle de base que je devrais connaître pour comprendre l’parsing syntaxique de telles expressions en C.

De la norme 6.2 (4):

Si le stream d’entrée a été analysé dans des jetons de prétraitement jusqu’à un caractère donné, le jeton de prétraitement suivant est la séquence de caractères la plus longue pouvant constituer un jeton de prétraitement.

Ils ajoutent même l’exemple:

EXEMPLE 2 Le fragment de programme x +++++ y est analysé comme suit: x ++ ++ + y, ce qui ne respecte pas une contrainte sur les opérateurs d’incrémentation, même si l’parsing x ++ + ++ y peut générer une expression correcte.

Donc, votre déclaration:

 a = b+++++b---c--; 

Est équivalent à:

 a = b ++ ++ + b -- - c -- ; 

Les opérateurs impliqués sont ++ , -- , + et - . Quelques parenthèses et des espaces aideront ici:

 a = ((b++)++) + (b--) - (c--); 

Je ne sais pas exactement comment fonctionne l’parsing syntaxique, mais il n’y a pas d’ambiguïté (voir la réponse de Dingo), alors je suppose que cela pourrait être fait avec quelques règles simples comme:

  • Un ou plusieurs caractères font un nom de variable, le type le plus simple “d’expression”
  • Les opérateurs + et - combinent deux “expressions”
  • Les opérateurs ++ et -- sont le suffixe d’une “expression”

Pour lever l’ambiguïté, vous pouvez atsortingbuer à ++ et -- une priorité supérieure à + et - .

Je sais combien vous connaissez bien les parsingurs, alors juste au cas où: http://en.wikipedia.org/wiki/LL_parser

Si vous avez besoin d’une description formelle de la grammaire, consultez la description du générateur d’parsingur: https://javacc.dev.java.net/servlets/ProjectDocumentList?folderID=110.