Études-Mathématique/Syntaxe mots

From Lazi wiki
Jump to: navigation, search

Question

Quel syntaxe pour les mots (mots clés, mots définis etc) et les représentations des mots ?

Étude

Types de mots

Dans le langage Lazi-1 les mots sont typés. Mais indiquer le type des mots dans le code source par une syntaxe spéciale pour chaque mot est lourd, par exemple il est désagréable de mettre un $ devant chaque nom de variables de fonctions.

Un autre système possible est de déduire le type des mots suivant le contexte. On peut utiliser des règles permettant de déduire le type de mot dont des notations pour désambiguïser certains mots.

Représentation des mots

L'ancienne syntaxe est `mot'. Mais il est possible de faire plus léger avec 'mot.

De plus on peut utiliser une règle de syntaxe supplémentaire pour accoler un mot et un opérateur binaire: ainsi x .di 'mot peut aussi s'écrire x .di'mot. Le gros avantage est la simplification des parenthésages car (x .di 'mot) y devient x .di'mot y.

Symboles autorisés dans les noms

Les noms sont aussi utilisés comme opérateurs, donc il faut autoriser des noms comme "+", "=w", "<|>" etc. On ne met jamais de lettre devant un symbole qui n'est pas une lettre pour un nom ou un opérateur (par exemple "x="), donc on n'autorise pas ce cas.

Implémentation

En accolant le mot on transforme un opérateur binaire en un opérateur unaire post-fixé, tout en gardant la même prévalence.

Par Opparenth

Il faut modifier Opparenth pour un nouveau type d'opérateur unaire post-fixe où l'on a la fonction et le second argument, l'argument de l'opérateur étant le premier.

Par une fonction

Sans modifier Opparenth on peut donner comme valeur à l'opérateur la fonction $F x -> f x 'mot. Quand le source est traduit en langage Lazi-compute, l'optimisation fait que la fonction est calculée s'il n'y a pas de collision de variable, c'est à dire si l'argument ne contient pas le nom de variable 'x'. Ce système pose donc deux problèmes:

  • Une collision de variable pourrait faire que la fonction n'est pas calculée.
  • Si on traduit (plus tard) dans un autre langage le calcul pourrait aussi ne pas être fait.

Donc l'implémentation par fonction est moins bien que par Opparenth.

Par une pseudo-fonction

Même technique que "Par une fonction", mais un constructeur est ajouté SourceFm : ReverseArg SourceFm SourceFm. Les arguments sont :

  • la formule correspondant à la fonction
  • le deuxième argument de la fonction.

Réponse

Type des mots

On déduit les types des mots par les règles suivantes :

  • Les mots clés ne sont pas utilisables pour d'autres types.
  • Dans une fonction, un nom :glob:nom est un nom défini.
  • Dans une fonction, si un nom est celui d'une variable alors c'est une variable, sinon c'est un nom défini.
  • En dehors des fonctions, les noms qui ne sont pas des mots clés sont des noms définis.

Représentation des mots

La syntaxe de la représentation d'un mot est 'mot

La représentation d'un mot peut être accolée à droite d'un opérateur binaire , par exemple x .d'mot y. Cela attache le mot à l'opérateur, et donc l'exemple se traduit par (x .d 'mot) y.