Approche semi-formelle

Supposons que V1, V2 et V3 soient trois vecteurs.
Alors V1.V2 désigne généralement le produit scalaire de V1 et de V2 (et est un nombre). Sachant que l'écriture λV est souvent utilisée pour désigner le produit scalaire du réel λ par le vecteur V, une 'expression' telle que (V1.V2)V3 a un sens et elle correspond au produit (loi externe) du scalaire V1.V2 par le vecteur V3.
De la même façon  V1.(V2+V3) représente le produit scalaire du vecteur V1 par la somme des deux vecteurs V2 et V3 , et est donc un nombre.
On peut donc donner du sens à des expressions complexes du type:
((λV1)+(μV2)).(V3∧V4) qui sera un nombre égal à un produit scalaire d'une somme de deux multiples avec un produit vectoriel.
On peut ainsi former toutes sortes d'expressions, pourvu qu'elles aient un sens !
Par ailleurs, on utilise dans de telles expressions des 'abus d'écriture' consistant à omettre des parenthèses conformément à des 'règles d'usage'.
Dans notre exemple on écrira , par exemple, plus souvent plus simplement  'λV1+μV2' au lieu de '(λV1)+(μV2)', parce qu'on convient de 'règles de priorité implicites', nous verrons cela plus en détail au prochain paragraphe.
Les expressions peuvent donc être définies récursivement:
  1. Les constantes sont des expressions.
  2. Les variables sont des expressions.
  3. En substituant des expressions aux paramètres d'un opérateur on obtient des expressions (pourvu que chaque expression soit d'un type compatible avec le paramètre auquel elle est subsituée).

Café Python

Voici un exemple de programme d'analyse syntaxique d'une expression donnée sous forme de chaîne et sans espaces.
En cas de succès la fonction retourne une arbre sous forme de liste (type Lisp ou Scheme), en cas d'échec la valeur Faux.