(lexer and parser done. Next is semantic analysis and code generator.) Dans le cadre du projet de compilation de S3, nous avons décider de proposer un nouveau language inspiré de Pascal, C et Java. C'est un language assez simple vue le temps alloué au projet. Ci-dessous notre grammaire.
- Const
- Num (numeric)
- String
- NULL
- Commentaire
Mots-clé et tokens | Symboles spéciaux et tokens | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
az AZ = + - * / % {} <> () , ; :
Il s’agit de la fonction principale. Tout traitement ou commentaire doit se faire à l’intérieur du main. On précise le type de retour numerique (num), un string ou rien (null). La fonction main:
Main ( [type ID [, type ID]] ) : TYPE_RETOUR {
DECLARATIONS() ;
INSTS() ;
}
num| string | NULL
num | string
CONSTS() ;
NUMERIC() ;
STRINGS() ;
const type ID= VAL [, type ID=VAL] ; | eps
NUM | STRING
num ID [, ID ] ; | eps
string ID [, ID ] ; |eps
begin
INST() { ; INST()}
return [ ID | NUM | NULL | eps ];```
INSTS() | AFFEC |IF |WHILE |DO_WHILE |FOR | SCAN |PRINT |eps```
ID = EXPR() | CONCAT() ;
WORDS() + WORDS() ;
ID | STRING
If ( COND() ) { INST() ; }
[ else { INST () ; } | ELIF() ]
elif ( COND() ) { INST() }
[ else { INST();} |ELIF() ]
while( COND){ INST() } ;
do{ INST ()} while(COND() ) ;
for ID in EXPR : EXPR [desc | asc] { INST (); }
scan( id [ , id]) ;
print(EXPR|CONCAT [,EXPR|CONCAT])
EXPR RELOP EXPR | true | false
== | != | < |<= | > | >=
TERM [ ADDOP TERM]
+ | -
FACT [ MULOP FACT]
* | / | %
ID | NUM | (EXPR)```
Letter [letter|number ]*
Number [number ]
" MOTS[MOTS] "
number | letter
0|…|9
A|..|Z|a|..|z
- Toutes les déclarations dans CONSTS, NUMS and STRINGS
- Les arguments de la fonctions main sont considéré comme déjà déclaré sans valeur initiale. Ils sont soit de type num, soit de type string.
- Une constante doit être soit de type num ou string.
- Il est possible de concatener deux strings. (la taille maximale des strings est fixé est 100 pour ce petit compilateur)
- Une constante ne peut pas changer de valeur.
- PAS DE DOUBLE DECLARATIONS
- Apres BEGIN, tous les symboles doivent être déjà déclarés
- Le traitement doit se faire à l’intérieur de la fonction main.
- Il est nécessaire de préciser le type du retour de la fonction main ; num, string ou NULL. Si la fonction ne retourne rien, utiliser NULL. Il faut s'assurer que le type valeur retournée corrspond à ce qu'a été précisé au préalable.
- Les commentaires ne doivent pas être interprétés.
- Un commentaire peut être écrit n’importe où.
- On peut pas faire des opérations entre un string et un entier.
- Si la fonction ne retourne rien, on peut diectement utiliser return;
- Pour les conditions, true et false sont équivalent à 1 et 0 resp.
Ci dessous les instrcutions pour la génération du p-code: ADD, SUB, MUL, DIV, MOD, CCT, EQL, NEQ, GTR, LSS, GEQ, LEQ, PRN, INN, INT, LDI, LDA, LDV, STO, BRN, BZE, HLT