La syntaxe est définie au niveau XL0. La phase XL0 du compilateur peut être configurée en utilisant un fichier de description de la syntaxe, où sont définies des propriétés telles que la représentation du texte et les priorités des opérateurs. Un fichier de syntaxe basique définit les notations mathématiques communes tel que + pour l'addition, ainsi que la priorité des opérations.
L'arbre syntaxique est composé de 7 types de nœuds : 4 types de feuilles (entier, réel, texte et symbole) et 3 types de nœuds internes (infixe, préfixe et bloc).
2
. Le signe #
peut indiquer une base différente de 10, par exemple (2#1001
). Un caractère souligné (ou underscore) comme séparateur peut aider la lecture, par exemple 1_000_000
.2.5
. Les notations de base et les séparateurs peuvent être utilisés de la même façon pour les entiers, par exemple 16#F.FFF#E-10
est une représentation littérale valide d'un réel."Salut"
ou 'a'
, mais le fichier syntaxique peut être utilisé pour ajouter d'autres séparateurs, dont ceux dédiés aux textes à lignes multiples.Salut
. XL0 préserve la casse, mais XL1 ignore la casse et le caractère souligné ce qui fait que MonsieurDupont
et Monsieur_Dupont
sont le même nom. Un symbole est une séquence de caractères non alpha-numériques, par exemple *
ou =/=
.A+1
ou 2 and 3
. En particulier, un nœud infixe combiné à un infixe "nouvelle-ligne" permet de séparer deux lignes.Write "Salut"
. Ceci est aussi utilisé dans le notation postfixe, par exemple 3!
ou Open?
.(A)
ou [Index]
. Une indentation est représentée en interne par un nœud bloc.Avec le fichier de syntaxe par défaut, le code suivant est valide pour XL0, indépendamment de la sémantique :
A = B + "Salut"
Il est décomposé en :
infix("=", symbol("A"), infix("+", symbol("B"), text("Salut")))
Le design de XL a commencé aux alentours de 1992, sous le nom LX (Langage eXpérimental). Le projet a été mis dans le domaine du logiciel libre en 2000, dans le cadre du projet "Mozart" qui visait à fournir des capacité de métaprogrammation multi-langage. Les premiers compilateurs étaient écrits en C++, mais cela rendait l'écriture d'extensions de compilateurs compliquée, car C++ ne permettait pas d'offrir le niveau d'abstraction voulu (par exemple un équivalent de translate
). Les aspects multi-langage rendaient les arbres syntaxiques difficile à manipuler en respectant la sémantique de chaque langage.
Une réécriture complète du compilateur a commencé en 2003, abandonnant l'idée de support multi-langage qui avait montré ses limites, et focalisant sur la facilité d'écriture des extensions. L'arbre syntaxique abstrait a été réduit à sept types de nœud seulement pour représenter tous les programmes. Ce nouveau compilateur s'est auto-compilé en 2004 (bien qu'avec des capacités réduites et une dépendance à C++ dans le code généré). Depuis, tout le développement se fait en XL.
En 2007, le langage offre un grand nombre de fonctionnalités avancées, mais manque encore d'une librairie fonctionnelle.
XL a été inspiré par un grand nombre d'autres langages. Dans l'ordre alphabétique :