============== Note technique ============== Éléments de la grammaire du rythme ---------------------------------- Définitions Dans cette partie, un symbole désigne une chaîne de caractères, les symboles sont les éléments primitifs de l'interprétation, ici Notes o d ! [ f t q ronde, blanche, noire, croche, double, triple et quadruple croche ; Silences - = < > k x w pause, demi-pause, soupir, demi-soupir, quart, huitième et seizième de soupir. Ces symboles peuvent être pointés '.', liés '_'. Un lexème est un groupe de caractères signifiant du point de vue de l'analyseur lexical ; les notes et silences pointés, liés. Un jeton et un jeton symbolique sont propres à l'analyseur syntaxique. Un jeton est un caractère (exemple de lexème se réduisant à un monème) auquel est associé sa valeur dans la table ASCII dans [0-255]. Le seul jeton du logiciel de compilation du rythme est la barre '|'. Un jeton symbolique est un lexème (ou monème) auquel est associé une valeur, par défaut dans [256-65535], par déclaration dans le programme d'analyse lexicale comme "%token SRND, SBCL, SNOR, SRNDP", qui déclare les lexèmes ronde, blanche, noire, ronde pointée, comme des jetons à valeur supérieure à 255 (au-delà de la table ASCII). Le nom choisi de jeton symbolique est dû au fait qu'il apparaît dans le programme comme une chaîne de caractères SRND, SBCL, SNOR, SRNDP. Il est pratique de manipuler les lexèmes de l'analyse lexical, et donc les jetons, jetons symboliques de l'analyse syntaxique par des macro- définitions (SRND, SBCL, SNOR, SRNDP) plutôt que comme des caractères ; étant donné aussi, que le nombre de lexèmes et donc de jetons dépassera la limite des 256 permis par la table ASCII. Seul, n'est pas un jeton symbolique, le jeton barre '|' qui apparaît tel quel dans le programme d'analyse syntaxique (et lexical). Le générateur d'analyseur lexical, permet aussi d'associés des macro- définitions dans une partie spécifique avant un premier "%%" sous la forme "srnd o", "sbcl d", "snor !", "spointee \.", ce qui permet, ici de composer en utilisant les accolades deux monèmes pour constituer un lexème, puis d'envoyer son jeton symbolique à l'analyseur syntaxique : {srnd} renvoyer SRND; {sbcl} renvoyer SBCL; {snor} renvoyer SNOR; {srnd}{spointee} renvoyer SRDNP; Le fichier "nom.tab.h" est inclus au début du programme d'analyse lexical et contient les jetons symboliques et leur valeur. Il a été généré par la compilation du programme d'analyse syntaxique qui contient la déclaration "%token ...". Les symboles notes et silences ------------------------------ Notes o d ! [ f t q Notes pointées "o." "d." "!." etc Notes doublement pointées "o.." "d.." "!.." Notes liées "o_" "d_" "!_" Notes pointées et liées "o._" "d._" "!._" Notes dbl. pointées et liées "o.._" "d.._" "!.._" Silences - = < > k x w /idem/ À ces symboles seront associés les symboles terminaux de la grammaire : SRND, SBCL, SNOR SRNDP, SBCLP, SNORP SRNDPP, SBCLPP, SNORPP SRNDL, SBCLL, SNORL SRNDPL, SBCLPL, SNORPL SRNDPPL, SBCLPPL, SNORPPL P ajouté signifie pointé, PP doublement pointé et L lié. Il y a principalement deux types de lexèmes pour trois types de jetons symboliques. Les lexèmes (symboles notes et silences) terminés par une espace et ceux qui ne le sont pas ; faisant partie d'un temps. ( SRND, SBCL, SNOR SRNDP, SBCLP, SNORP SRNDPP, SBCLPP, SNORPP ) SRNDE, SBCLE, SNORE SRNDPE, SBCLPE, SNORPE SRNDPPE, SBCLPPE, SNORPPE ( SRNDL, SBCLL, SNORL SRNDPL, SBCLPL, SNORPL SRNDPPL, SBCLPPL, SNORPPL ) E ajouté signifie terminé par une espace. On s'aperçoit ici que les lexèmes terminés par une espace ne sont pas ceux qui sont terminés par un lié ; ils les excluent. En traitant les deux groupes mis entre parenthèses comme un seul groupe, le troisième type de jetons symboliques est celui qui contrairement aux lexèmes entrés avec une espace signifiant une fin explicite du temps (par l'utilisateur et donc à vérifier), signifie une fin implicite du temps. SRNDE2, SBCLE2, SNORE2 SRNDPE2, SBCLPE2, SNORPE2 SRNDPPE2, SBCLPPE2, SNORPPE2 ( SRND, SBCL, SNOR SRNDP, SBCLP, SNORP SRNDPP, SBCLPP, SNORPP ) SRNDE, SBCLE, SNORE SRNDPE, SBCLPE, SNORPE SRNDPPE, SBCLPPE, SNORPPE ( SRNDL, SBCLL, SNORL SRNDPL, SBCLPL, SNORPL SRNDPPL, SBCLPPL, SNORPPL ) E2 ajouté signifie qui implique une fin de temps. Le jeton symbolique de fin implicite du temps est réalisé par une fonction d'accumulation et un test avant d'envoyer le jeton à l'analyseur syntaxique : {srnd} { accu(64); si ( plein ) alors envoyer SRNDE2; sinon envoyer SRND; } Le test à 'plein' est vrai si la valeur du temps est atteinte ou dépassée et est fixé par la fonction accu(). On a vu qu'il y a principalement trois types de jetons symboliques mais il manque les lexèmes liés terminant implicitement le temps. SRNDE2, SBCLE2, SNORE2 SRNDPE2, SBCLPE2, SNORPE2 SRNDPPE2, SBCLPPE2, SNORPPE2 ( SRND, SBCL, SNOR SRNDP, SBCLP, SNORP SRNDPP, SBCLPP, SNORPP ) SRNDE, SBCLE, SNORE SRNDPE, SBCLPE, SNORPE SRNDPPE, SBCLPPE, SNORPPE ( SRNDL, SBCLL, SNORL SRNDPL, SBCLPL, SNORPL SRNDPPL, SBCLPPL, SNORPPL ) SRNDL2, SBCLL2, SNORL2 SRNDPL2, SBCLPL2, SNORPL2 SRNDPPL2, SBCLPPL2, SNORPPL2 E2, L2 ajouté signifie qui impliquent une fin de temps. Les temps --------- On retrouve les cinq, ou quatre paquets, de symboles (jetons symboliques) pour la constitution des temps : temps, temps_lié temps_E temps_E2 temps_L2 Pour cela, les symboles terminaux ont été regroupés par éléments rythmiques : elt_ryt, elt_ryt_lie elt_ryt_E elt_ryt_E2 elt_ryt_L2 Ce qui permet d'écrire temps_E2 comme temps_E2: elt_ryt temps_E2 | elt_ryt_lie temps_E2 | elt_ryt_E2 ; | signifie << ou >> dans cette règle récursive droite. temps comme temps : elt_ryt temps | elt_ryt_lie temps | elt_ryt ; Les éléments rythmiques en E2, L2 font appel à une fonction temps_fin() qui réinitialise le booléen 'plein' fixé par l'accumulation des valeurs du temps. Les éléments rythmiques en E font appel à une fonction temps_E() qui teste le booléen 'plein' afin de savoir si l'espace explicite, demandé par l'utilisateur du compilateur, est justifiée ; sinon le temps n'est pas ajouté. Un ajout de temps signifie que les lexèmes qui composent le temps et qui ont été cumulés dans un tampon de caractères, vont être structurés en données : allocation mémoire d'une structure temps et affectation, recopie. Note : on s'aperçoit ici que la tâche principale d'un compilateur (de la partie-avant ou frontal de compilation) est de mettre sous forme de colonne les données entrées. Les mesures parfaites, semi-parfaites et incomplètes ---------------------------------------------------- Les mesures se composent de temps comme les temps d'éléments rythmiques. Les mesures sont parfaites si leur nombre de temps fixé par des indications de mesure (2 / 4 deux temps à la noire) est complet : 2/4 ! ! || est une mesure parfaite. Il existe des mesures surchargées qui sont parfaites mais pour lesquelles le dernier temps comporte une valeur qui dépasse le total de la mesure : 2/4 ! d || est une mesure parfaite surchargée, le dernier temps sera sérié en noire 2/4 ! ! || Les mesures semi-parfaites comportent un nombre de temps inférieur à celui fixé par les indications de (la) mesure : 2/4 ! || est une mesure semi-parfaite. Cela est indiquée par "Dernier temps complet" et la mesure devient 2/4 ! ! || Les mesures incomplètes comportent un nombre de temps inférieur à celui fixé par les indications de mesure et un dernier temps qui est soit en sous-effectif, soit comporte un reliquat : 2/4 [ || est une mesure incomplète et en sous-effectif. Elle sera complétée comme 2/4 [[ ! || Un exemple de mesure avec reliquat est : 2/4 !.|| est une mesure incomplète avec reliquat. Elle sera complétéé comme 2/4 !. [ || Par contre "2/4 !. ||" avec une espace, est une mesure incomplète et en sous-effectif. Note : le cas d'une mesure incomplète avec reliquat n'est pas à confondre avec celui d'une mesure parfaite surchargée ; le nombre de temps est complet dans cette dernière alors qu'il est incomplet dans l'autre.