Grammaire


h1 4/20/2007 11:54:00 AM

J'ai parlé ici-même, il y a presque un an, d'une petite astuce pour obtenir un langage sans point-virgule dans les séquences, juste un peu whitespace-sensitive, tout en utilisant le générateur de parser (ocaml)yacc. Je suis toujours dans cette optique, car je veux garder cette syntaxe légère, et je crois toujours qu'écrire mon parser à la main est source d'emmerdes au moins à long terme.

Résume de l'épisode précédent: le seul endroit où le retour à la ligne compte, c'est pour distinguer f ; (1,2) de f(1,2). Bien sûr la première expression n'a peu d'intérêt, la séquence ne servant qu'aux effets de bord que f ne fait pas, mais cela ne se voit pas au stage de l'analyse syntaxique. Ma solution a été d'introduire un token VARLPAR qui regroupe la variable et la parenthèse qui la suit si elles ne sont pas séparées par un retour à la ligne.

Second épisode: liquidsoap est en plein boom. Nous avons de nouveaux contributeurs, de nouveaux utilisateurs, on parle de nous, de nouvelles idées sont implémentées, etc.

Une de ces idées est le cross-fading intelligent. Au lieu de passer au cross-fading une fonction de transition qui décrit comment sont combinés les débuts et fins de piste, on y passe une liste de (condition,transition). La condition est une fonction à qui le smart_cross passe les puissances du signal sonore de part et d'autre de la transition. L'opérateur choisit la première fonction de transition dont la condition est validée. On peut ainsi choisir de superposer, fader, en fonction du volume des débuts et fin de piste. Romain a commencé à coder dans utils.liq l'utilisation du smart cross selon la description que mouke de bide-et-musique nous a faite.

Cet opérateur amène le besoin de coder dans notre langage de script des expressions arithmétiques, des comparaisons, etc. Et j'ai donc du étendre la grammaire. Pour faire simple, disons qu'on ajoute *, /, + et -.

Premier conflit: comment distinguer f(x) \n -1 de f(x)-1. Les deux sont naturels, on ne peut en éliminer aucun d'office. A moins d'empêcher le programmeur d'éclater ses expressions arithmétiques sur plusieurs lignes, ce qui est peu naturel et de toute façon difficilement réalisable dans mon cadre.

La solution vient de zmdkrbou, qui me propose de distinguer les expressions closes cexpr et les expressions générales expr. Une expression close peut être utilisée sans ambiguité dans une séquence: pour cela on limite les symboles pouvant apparaitre en tête, i.e. on élimine donc les négatifs -42, qui ne sont présents que dans les expressions générales. On peut obtenir une expression close représentant un négatif en l'entourant de parenthèses. Dans la plupart des règles, on peut continuer à utiliser des expressions générales, mais la règle de séquençage d'expression est restreinte aux expressions closes. Ainsi f(x) - 1, où que soient les retours à la ligne, sera la valeur de f(x) décrémentée de 1. Et on écrira f(x) (-1) (en général sur deux lignes, mais rien n'oblige) pour signifier qu'on évalue f(x) et qu'on retourne -1.

On tient le bon bout, mais l'histoire ne s'arrête pas là, et yacc m'en a fait baver. On a dans notre grammaire la règle (1) expr: cexpr, qui dit qu'une expression close est aussi une expression, et la règle (2) cexpr: cexpr PLUS expr. J'avais laissé un expr à droite du PLUS car l'ambiguité vue ci-dessus n'est présente qu'en début d'expression.

Sachant que l'automate d'analyse syntaxique doit décider de ce qu'il fait en ne regardant qu'un symbole en avant, comment savoir dans la situation cexpr PLUS ... si la cexpr doit être considérée comme une expr, auquel cas on réduit la règle (1), ou s'il faut avancer dans la règle (2) en mangeant de suite le +. L'automate est bête, pour lui une addition peut arriver après une expression générale car une expression générale peut être, en particulier, close. On ne peut le guider qu'avec des priorités, je mets donc une priorité plus faible à la coercion (1) qu'à la règle (2).

Et là, c'est le drame. Les priorités entre l'addition et la multiplication ne sont plus du tout respectées, l'analyseur parenthèse tout à droite comme un sale. On lui donne 2*3+1 il lit 2*(3+1). Après masse de bataille, je m'aperçois que la formulation de la règle (2), bien qu'inambigue, pose problème. On a expr: cexpr PLUS expr | cexpr MULT expr .... Le problème est que l'automate défavorise maintenant la coercion expr:cexpr. Du coup quand il voit le + après le 3 il ne va pas réduire l'expression close 3 en expression pour réduire ensuite l'expression close 2*3. Il va préférer manger le +, ce qui conduit à réduire l'expression close 3+1 en premier.

Au final la règle (2) doit s'écrire cexpr: cexpr PLUS cexpr. Et on n'y perd pas trop. On ne peut plus écrire 3+-1 mais il faut parenthéser en 3+(-1).

La morale: c'est toujours possible d'utiliser le couple lex/yacc pour une syntaxe sans point-virgule, en limitant énormément la sensibilité aux blancs (espace et retour à la ligne), ouf. Par contre l'automate de yacc est bien bête sur une production du type expr: cexpr.

Un jour faudra que je voie si c'est si difficile de ne pas ignorer les retours à la ligne à l'analyse syntaxique, et de les traiter explicitement partout dans la grammaire. A priori c'est lourd, comme il ne compte pas dans la majorité des cas. Mais une astuce n'est pas à exclure..

Libellés : , ,

Libertés


h1 4/05/2007 03:38:00 PM

Ceci est un post en préparation pour Dolebraï...

Je suis tombé récemment sur Diogène, un éditeur de culture libre, qui se pose une question intéressante: Qu'est-ce que les arts libres ? Je rebondis sur leur opinion.

La culture libre est une véritable provocation au système capitaliste du copyright.


Non. Diffuser librement une oeuvre ne veut pas dire renoncer au copyright, c'est à dire à son droit d'auteur. Creative Commons décrit par exemple ses licences comme un moyen de changer les termes de son droit d'auteur, passer du "tous droits réservés" à "certains droits réservés", en offrant au public certaines libertés.

Le copyright est une bonne chose. Il a été instauré pour éviter que les auteurs soient dépossédés de leurs oeuvres et gardent certains droit fondamentaux, auparavant détenus par les éditeurs. Le droit d'auteur a aussi introduit certains droits pour le public, comme la garantie d'utilisation libre d'une oeuvre, la copie privée, le droit de courte citation ou de satyre. De nos jours il faudrait même défendre le droit d'auteur, car les droits des auteurs et du public sont menacés par les majors de la distribution musicale (qui attaquent le droit à la copie privée), voire par la SACEM (qui ne laisse pas la possibilité à ses adhérents de diffuser librement leurs oeuvres).

L’art libre, c’est aussi mettre en oeuvre la philosophie du don, une philosophie à développer aujourd’hui plus que jamais, car le capitalisme a mangé tous les cerveaux (ou presque) de nos contemporains.


Bien sûr. Le don c'est beau. Le partage et l'échange c'est aussi créatif et utile. Et il est vrai que cela devient très important de nos jours, où pour se faire encore plus de gros sous sur la culture, certains poids lourds tentent de la verrouiller de plus en plus.

Les arts libres, c’est de la culture faite par les pauvres, pour les pauvres ! [...] En effet, la philosophie du don ne peut fonctionner que si on accepte de vivre de rien, sans consommer ce qui est payant, donc en ne consommant que de la culture ou des produits gratuits. Cela implique de vivre en grande partie hors du système !


Certainement pas, ni en théorie ni en pratique. D'abord dans les faits, les gens qui produisent et consomment de la culture libre ne sont pas tant hors du système que ça, ce ne sont pas les plus démunis, ne serait-ce que parce que la culture libre passe par le net. Et puis donner ne doit pas vouloir dire accepter de ne rien attendre en échange -- c'est quelquechose qu'on retrouve aussi dans le logiciel libre, où l'on donne en attendant des dons en échange.

De nombreux artistes diffusent librement leur musique parce que c'est la meilleure opportunité qu'ils ont pour être visibles. Cela ne veut pas dire qu'ils n'espèrent pas vivre le leur musique. Cela n'exclut pas non plus que certains envisagent d'abandonner les licences libres s'ils peuvent gagner mieux leur vie ainsi.

Les licences d'art libre sont un moyen ouvert à chacun de diffuser son art, tout en défendant son droit d'auteur, et éventuellement d'en vivre, en se faisant connaître, ce qui permet de faire des concerts, etc. La culture libre c'est aussi un bel idéal, surtout dans le contexte actuel, mais pas seulement.