Syntaxe concrète

Dans votre répertoire contenant les sources du projet, créez un répertoire parser. Là-dedans, copiez le code dans les fichiers suivants: Parser.java, ParserTest.java, Tree.java, TreeFactory.java, Oper.java. Compilez-les et essayez parser.ParserTest sur le fichier test2. Vous aurez un message d'erreur. Complétez le code. Commencez par Tree.java et TreeFactory.java. Ensuite travaillez sur Oper.java et Parser.java. Les macros dans Oper.java pourraient aussi être remplacés par ceux de Token.java, c'est une question de goût.

Travaillez de nouveau en ètapes en essayant votre programme sur des exemples plus simples.

Attention: Les ";" et "||" séparent des commandes ou processus au lieu de les terminer.

1 Programmes

Un programme se compose d'une composition parallèle ("||") de définitions suivie d'une composition parallèle d'au minimum un processus. La syntaxe des définitions est celle des assignations.

   productions       commentaires   
   prog  -->  defs procs       suite de définitions suivie par suite de processus   

1.1 Définitions

Dans le projet on utilise la syntaxe des assignations. Ce n'est pas le cas pour beaucoup de langages de programmation. Dans notre cas c'est possible, parce que nous n'avons pas besoin d'ajouter d'information sur le type des variables, par exemple, et parce que le traîtement des variables dans la phase de l'interprétation sera particulièrement simple. Une suite de définitions peut être vide.

   productions       commentaires   
   defs  -->  { defs "||" }       syntaxe un peu "dirty" (pourquoi?) mais fonctionelle   

2 Processus

Une suite de processus n'est jamais vide. Un processus commence par le mot clé "proc" suivi d'un identificateur (le nom du processus) et d'un bloc (voir sous Commandes).

   productions       commentaires   
   procs  -->  proc { "||" proc }       au moins un processus   
   proc  -->  "proc" id block         

3 Commandes

Il y a cinq types de commandes, les actions, les assignations, les conditionnels, les boucles et les blocks.

   productions       commentaires   
   Stm  -->  Assign | Loop | While | Cond | Block         

3.1 Actions

Les actions ne seront pas interprétées de la même manière que les autres commandes; elles seront affichées pour spécifier des activités d'un processus. Des actions typiques sont par exemple l'entrée dans une région critique ou la sortie d'une telle région:
    [enter critical region];
    [exit critical region]
    

   productions       commentaires   
   Action  -->  "[" text "]"       voir analyseur lexical   

3.2 Assignations

   productions       commentaires   
   Assign  -->  id ":=" Exp         

3.3 Conditionnels

   productions       commentaires   
   Cond  -->  "if" bool "then" Stm [ "else" Stm ]       longest match   

3.4 Boucles

   productions       commentaires   
   Loop  -->  "loop" Block
   While  -->  "while" Bool Block   
     

3.5 Blocks

   productions       commentaires   
   Block  -->  "{" Stms "}"         

4 Expressions

4.1 Expressions booléennes

Les expressions booléennes les plus basiques sont le test sur l'égalité de deux expressions ("=") ainsi que le test si le résultat d'une expression est plus petit que celui d'une autre ("<"). Une expression booléennes mise entre parenthèses est de nouveau une expression booléenne.

Les expressions booléennes peuvent être composées en utilisant la conjonction ("&") et la négation ("!"). La négation a précédence sur la conjonction, celui a précédence sur tout opérateur de comparaison et arithmétic. L'expression "! a = 0 & a < 5" se groupe donc comme "((!(a = 0)) & (a < 5))". Notez que les arbres abstraits de ces deux expressions sont identiques.

   productions       commentaires   
   Bool  -->  BTerm { "&" BTerm }
   BTerm --> [ "!" ] BFactor
   BFactor --> Exp ( "=" | "<" ) Exp | "(" Bool ")"   
   précédences!   

4.2 Expressions arithmétiques

Les expressions arithmétiques les plus basiques sont les identificateurs et les nombres (voir plus bas).

Les expressions arithmétiques peuvent être composées en utilisant l'addition ("+"), la subtraction ("-"), la multiplication ("*") et la division ("/").

   productions       commentaires   
   Exp --> Term { ( "+" | "-" ) Term }
   Term --> Factor { ( "*" | "/" ) Factor }
   Factor --> num | id | "(" Exp ")"   
   précédences!   

4.3 Identificateurs

Un identificateur commence par une lettre ('a' -- 'z', 'A' -- 'Z') et se termine par une suite de lettres et chiffres ('0' -- '9'). Les identificateurs sont déjà reconnus par l'analyseur lexical (voir next()).

   productions       commentaires   
         voir analyse lexicale   

4.4 Nombres

Un nombre est une suite non-vide de chiffres. Les nombres sont déjà reconnus par l'analyseur lexical (voir next()).

   productions       commentaires   
         voir analyse lexicale   

Christine Röckl
Last modified: Thu Apr 25 16:11:13 DST 2002