NASIUM L.S.E.

Grammaire

Les symboles terminaux peuvent être nommés ou anonymes. Les symboles terminaux nommés sont écrits en majuscules, et sont décrits par une expression régulière écrite entre cotices. Les symboles terminaux anonymes sont écrits dans les règles de grammaire entre apostrophes.

Exemple: un symbole terminal nommé:

    IDENTIFICATEUR       = /[A-Z][0-9A-Z]*/. 

Exemple: un symbole terminal anonyme:

    'AFFICHER' 

Les symboles non-terminaux sont écrits en minuscules.

Les règles de grammaire ont la forme :

    symbole-non-terminal ::= partie-droite . 

La partie droite peut être (a et b sont des parties droites) :

Le symbole initial de la grammaire est debut.

nil représente le vide.

Symboles terminaux : 

    NOMBRE               = /[-+]?[0-9]+\.[0-9]+[Ee][-+]?[0-9]+?/.

    NUMERO               = /[0-9]+/.

    LITCHAINE            = /'(('')?[^']*)*'/.

    PROCIDENT            = /&[A-Z][0-9A-Z]*/.

    IDENTIFICATEUR       = /[A-Z][0-9A-Z]*/.

    COMMENTAIRE          = /\*.*$/.


Règles de grammaire : 

    debut                ::= ligne-programme | liste-inst-ou-decl | affic | nil.

    ligne-programme      ::= NUMERO (liste-inst-ou-decl | decl-procedure [';' liste-inst-ou-decl]).

    decl-procedure       ::= 'PROCEDURE' procident '(' (')' [decl-local] | liste-identificateur ')' [decl-local]).

    decl-local           ::= 'LOCAL' liste-identificateur.

    liste-inst-ou-decl   ::= instruction [';' liste-inst-ou-decl] | decl [';' liste-inst-ou-decl] | COMMENTAIRE.

    decl                 ::= decl-chaine | decl-tableau.

    decl-chaine          ::= 'CHAINE' liste-identificateur.

    decl-tableau         ::= 'TABLEAU' liste-decl-tabl.

    liste-decl-tabl      ::= decl-tabl {',' decl-tabl}.

    decl-tabl            ::= identificateur '[' expression [',' expression] ']'.

    instruction          ::= liberation | affectation | appel | lire | afficher | aller-en | si-alors-sinon | terminer | pause | debut-fin | faire | retour | resultat | garer | charger | supprimer | executer.

    liberation           ::= 'LIBERER' liste-identificateur.

    affectation          ::= reference '_' expression.

    appel                ::= procident '(' [liste-argument] ')'.

    lire                 ::= 'LIRE' liste-reference.

    affic                ::= '?' (format [liste-expression] | liste-expression).

    afficher             ::= 'AFFICHER' (format [liste-expression] | liste-expression).

    format               ::= '[' liste-spec ']'.

    liste-spec           ::= specification {',' specification}.

    specification        ::= LITCHAINE | '/' | 'X' | 'C' | 'L' | 'U' | 'F' NUMERO '.' NUMERO | 'E' NUMERO '.' NUMERO | spec-rep-fois (LITCHAINE | '/' | 'X' | 'C' | 'L') | spec-rep-num (LITCHAINE | '/' | 'X' | 'C' | 'L' | 'U' | 'F' NUMERO '.' NUMERO | 'E' NUMERO '.' NUMERO).

    spec-rep-num         ::= NUMERO.

    spec-rep-fois        ::= '*'.

    aller-en             ::= 'ALLER' 'EN' expression.

    si-alors-sinon       ::= 'SI' disjonction 'ALORS' instruction ['SINON' instruction].

    terminer             ::= 'TERMINER'.

    pause                ::= 'PAUSE'.

    debut-fin            ::= 'DEBUT' liste-inst-ou-decl 'FIN'.

    faire                ::= 'FAIRE' expression 'POUR' identificateur '_' expression ['PAS' expression] ('JUSQUA' expression | 'TANT' 'QUE' disjonction).

    retour               ::= 'RETOUR' ['EN' expression].

    resultat             ::= 'RESULTAT' expression.

    garer                ::= 'GARER' identificateur ',' expression ',' expression.

    charger              ::= 'CHARGER' identificateur ',' expression ',' expression [',' identificateur].

    supprimer            ::= 'SUPPRIMER' expression [',' expression].

    executer             ::= 'EXECUTER' expression [',' expression].

    expression           ::= terme-signe {('-' terme | '+' terme | '!' terme)}.

    terme-signe          ::= ['-'] terme.

    terme                ::= facteur {('*' facteur | '/' facteur)}.

    facteur              ::= simple {'^' simple}.

    simple               ::= 'SI' disjonction 'ALORS' expression 'SINON' expression | procident ['(' [liste-argument] ')'] | '(' disjonction ')' | reference | at | LITCHAINE | NOMBRE | NUMERO.

    liste-argument       ::= expression {',' expression}.

    liste-expression     ::= expression {',' expression}.

    liste-identificateur ::= identificateur {',' identificateur}.

    disjonction          ::= conjonction {'OU' conjonction}.

    conjonction          ::= condition {'ET' condition}.

    condition            ::= 'NON' condition | expression [('=' | '<' | '<=' | '#' | '>' | '>=') expression].

    reference            ::= identificateur [('[' expression [',' expression] ']' | '(' [liste-argument] ')')].

    liste-reference      ::= reference {',' reference}.

    identificateur       ::= IDENTIFICATEUR.

    at                   ::= '@'.

    procident            ::= PROCIDENT.