La syntaxe d'Ada


Elément de base du langage


Lettre ::= A|B|C|D|E|F|...|Z
Chiffre ::= 0|1|2|3|...|9
AlphaNumérique ::= Lettre | Chiffre
Identificateur ::= Lettre {[TraitBas] AlphaNumérique}
LittéralNumerique ::= LittéralDécimal| LittéralBasé
Nombre ::= Chiffre{[TraitBas] Chiffre}
Exposant ::= E [+ | -] Nombre
LittéralDécimal ::= Nombre [. Nombre] [Exposant]
Base ::= Nombre
ChiffreGénéralisé ::= Chiffre | A | B | C | D | E | F
NuméralBasé ::= ChiffreGénéralisé {[TraitBas] ChiffreGénéralisé}
ElémentDeChaine ::= "" | CaractèreGraphiqueNonGuillemets
LittéralChaine ::= " ElémentDeChaine "
Commentaire ::= -- {CaractèreNonFinDeLigne}

Types Scalaires

DéclarationSimple ::= DéclarationDeType | DéclarationDeSousType | DéclationDObjet | DéclarationDeNombre
    | DéclarationDeSousProgramme | DéclarationDePaquetage | DéclarationDeGénérique | DéclarationDException
    | InstanciationDeGénérique | DéclarationDeSurnom | DéclarationDeSousProgrammeAbstrait

DéclarationDObjet ::= ListeDIdentificateur : [ aliased ] [ constant ] IndicationDeSousType [:= Expression];
    |
ListeDIdentificateur : [ aliased ] [ constant ] DéfinitionDeTypeTableau [:= Expression];
   
| DéclarationDeTacheIndividuelle | DéclarationDObjetProtégéIndividuel
DéclarationDeNombre ::= ListeDIdentificateur : [ constant ] := ExpressionStatique;
ListeDIdentificateur ::= Identificateur {, Identificateur}
InstructionAffectation ::=  NomDeVariable := Expression;
InstructionBloc ::= [Identificateur :] [ declare PartieDéclarative]
    begin
SuiteDInstructions end [Identificateur] ;
DéclarationDeType ::= DéclarationComplèteDeType | DéclarationDeTypeIncomplet
    | DéclarationDeTypePrivé | DéclarationDExtensionPrivée
DéclarationComplèteDeType ::= type Identificateur [PartieDiscriminantConnus] is
    DéfinitionDeType ; |DéclarationDeTypeTache | DéclarationDeTypeProtégé
DéfinitionDeType ::= DéfinitionDeTypeEnumeratif | DéfinitionDeTypeEntier | DéfinitionDeTypeRéel
    |DéfinitionDeTypeTableau | DéfinitionDeTypeArticle | DéfinitionDeTypeAccès | DéfinitionDeTypeDérivé
DéclarationDeSousType ::= subtype Identificateur is IndicationDeSousType ;
IndicationDeSousType ::= Identificateur [Contrainte]
Contrainte ::= ContrainteScalaire | ContrainteComposée
ContrainteScalaire ::= ContrainteIntervalle | ContrainteDeChiffre | ContrainteDeDelta
ContrainteComposée ::= ContrainteDIndice | ContraiteDeDiscriminant
ContrainteIntervalle ::= range Intervalle
Intervalle ::= ExpressionSimple .. ExpressionSimple | RéférenceAttributRange
DéfinitionDeTypeEnumeratif ::= Identificateur  {, Identificateur}
Nom ::= NomDirect | DéréférenciationExplicite | NomIndexé | Tranche | NomComposé
    | RéférenceDAttribut | ConversionDeType | AppelDeFonction
NomDirect ::= Identificateur | SymboleOpérateur
Préfixe ::= Nom | DéréférenciationImplicite
DéréférenciationExplicite ::= Nom .all
DéréférenciationImplicite ::= Nom
RéférenceDAttribut ::= Préfixe ' DésignateurDAttribut
RéférenceDeLAttributRange ::= Préfixe ' DésignateurDeLAttributRange
DésignateurDAttribut ::= Identificateur [(ExpressionStatique)] | Acces | Delta | Digits
DésignateurDeLAttributRange ::= Range [(ExpressionStatique)]
Expression ::= Relation {Op1 Relation}
Op1 ::= and | and then | or | or else | xor
Relation ::= ExpressionSimple [OpérateurRelationnel ExpressionSimple]
    | ExpressionSimple [ not ] in Intervalle | ExpressionSimple [ not ] in NomDeSousType
ExpressionSimple ::= [ OpérateurUnaireAdditif ] terme {OpérateurBinaireAdditif Terme}
Terme ::= Facteur {OpérateurMultiplicatif Facteur}
Facteur ::= Primaire [ ** primaire] | abs Primaire | not Primaire
Primaire ::= Identificateur | null | LittéralChaine | Agrégat | Nom | ExpresionQualifiée
    | Allocateur | ( Expression )
OpérateurLogique ::= and | or | xor
OpérateurRelationnel ::= = | /= | < | <= | > | >=
OpérateurBinaireAdditif ::= + | - | &
OpérateurUnaireAdditif ::= + | -
OpérateurMultiplicatif ::= * | / | mod | rem
OpérateurPrioritaire ::= ** | abs | not
ConversionDeType ::= NomDeSousType ( Expression ) | NomDeSousType ( Nom )
ExpressionQualifiée ::= NomDeSousType ' ( Expression ) | NomDeSousType ' agrégat

Structures De Contrôle

SuiteDInstructions ::= Intruction { Instruction }
Instruction ::= [ Etiquette ] InstructionSimple | [ Etiquette ] InstructionComposée
InstructionSimple ::= InstructionNulle | InstructionAffectation |  InstructionExit | InstructionGoto
    | InstructionAppelDeProcédure | InstructionReturn | InstructionDAppelDEntrée | InstructionRequeue
    | InstructionDelay | InstructionAbort | InstructionRaise | InstructionMachine
InstructionComposée ::= InstructionIf | InstructionCase | InstructionLoop | InstructionBloc
    | InstructionAccept | InstructionSelect
Etiquette ::= Identificateur
InstructionNulle ::= null ;
InstructionIf ::= if Condition then SuiteDInstructions
    { elsif Condition then SuiteDInstructions }
    [ else SuiteDInstructions]
    end if ;
Condition ::= ExpressionBooléenne
InstructionCase ::= case Expression is AlternativeDInstructionCase { AlternativeDInstructionCase } end case ;
AlternativeDInstructionCase ::= when ListeDechoixDiscrets => SuiteDInstructions
ListeDechoixDiscrets ::= ChoixDiscret { | ChoixDiscret }
ChoixDiscret ::= Expression | IntervalleDiscret | others
IntervalleDiscret ::= IndicateurDeSousTypeDiscret | Intervalle
InstructionLoop ::= [Identificateur : ] [SchémaDItération] loop SuiteDInstructions end loop [Identificateur] ;
SchémaDItération ::= While Condition | for SpécificationDuParamètreDeBoucle
SpécificationDuParamètreDeBoucle ::= Identificateur in [ reverse ] DéfinitionDeSousTypeDiscret
InstructionExit ::= exit [ Identificateur ] [ when Condition] ;
IntructionGoto ::= goto Identificateur ;


Tableaux et articles

DéfinitionDeTypeTableau ::= DéfinitionDeTypeTableauNonContraint | DéfinitionDeTypeTableauContraint
DéfinitionDeTypeTableauNonContraint ::= array ( DéfinitionDeSousTypeDIndice { , DéfinitionDeSousTypeDIndice }
                            of DéfinitionDeComposant
DéfinitionDeTypeTableauContraint ::= array ( DéfinitionDeSousTypeDiscret { , DéfinitionDeSousTypeDiscret } )
                            of DéfinitionDeComposant
DéfinitionDeSousTypeDIndice ::= MarqueDeSousType range <>
DéfinitionDeSousTypeDiscret ::= IndicationDeSousTypeDiscret | Intervalle
DéfinitionDeComposant ::= IndicationDeSousType
ContrainteDIndice ::= ( IntervalleDiscret , IntervalleDiscret )
NomIndexé ::= Préfixe ( Expression, Expression )
Tranche ::= Préfixe (IntervalleDiscret)
ListeDAssociationDeComposantDArticle ::= AssociationDeComposantDArticle { , AssociationDeComposantDArticle }
                            | null record
AssociationDeComposantDArticle ::=  [ ListeDeChoixDeComposants => ] Expression
ListeDeChoixDeComposants ::= NomDeSelecteurDeComposant { | NomDeSelecteurDeComposant } | others
DéfinitionDeTypeArticle ::= [[ abstract ] tagged ] [ limited ] DéfinitionDArticle
DéfinitionDArticle ::= record ListeDeComposants end record | null record
ListeDeComposants ::= ElémentComposant { ElémentComposant } | { ElémentComposant } PartieVariable | null ;
ElémentComposant ::= DéclarationDeComposant | ClauseDeReprésentation
DéclarationDeComposant ::= ListeDIdentificateurDéfinissant : DéfinitionDeComposant [ := ExpressionParDéfaut] ;
ExpressionParDéfaut ::= Expression
NomComposé ::= Préfixe.NomDeSélecteur
NomDeSélecteur ::= Identificateur | LittéralCaractère | SymboleOpérateur

Sous-Programmes


DéclarationDeSousProgramme ::= SpécificationDeSousProgramme ;
SpécificationDeSousProgramme ::= procedure NomDUnitéDeProgrammeDéfinissant ProfilDesParamètres |
                function DésignateurDéfinissant ProfilDesParamètresEtRésultat
ProfilDesParamètres ::= [PartieFormelle]
ProfilDesParamètresEtRésultat ::= [PartieFormelle] return MarqueDeSousType
Désignateur ::= [NomDUnitéparent . ] Identificateur | SymboleOpérateur
DésignateurDéfinissant ::= NomDUniteDeProgrammeDéfinissant | SymboleDOpérateurDéfinissant
NomDUnitéDeProgrammeDéfinissant ::= [NomDUnitéparent . ] IdentificateurDéfinnisant
NomDUnitéparent ::= Nom
SymboleOpérateur ::= LittéralChaine
SymboleDOpérateurDéfinissant ::= SymboleOpérateur
PartieFormelle ::= ( SpécificationDeParamètre { , SpécificationDeParamètre } )
SpécificationDeParamètre ::= ListeDIdentificateurDéfinissant : Mode MarqueDeSousType [ := ExpressionParDéfaut ]
             | ListeDIdentificateurDéfinissant : DéfinitionDAccès [ := ExpressionParDéfaut ]
Mode ::= in | in out | out
CorpsDeSousProgramme ::= SpécificationDeSousProgramme is
                PartieDéclarative
                begin
                   SuiteDInstructionTraitée
                end Désignateur ;
InstructionDAppelDeProcédure ::= NomDeProcédure PartieParamètreEffectif ;
AppelDeFonction ::= NomDeFonction PartieParamètreEffectif
PartieParamètreEffectif ::= Expression | NomDeVariable
InstructionReturn ::= return [Expression] ;

Type accès

DéfinitionDeTypeAccès ::= DéfinitionDetypeAccèsAObjet | DéfinitionDeTypeAccèsASousProgramme
DéfinitionDetypeAccèsAObjet ::= acces [ ModificateurDAccèsGénéralisé ] IndicationDeSousType
ModificateurDAccèsGénéralisé ::= all | constant
DéfinitionDeTypeAccèsASousProgramme ::= acces [ protected ] procedure ProfilDesParamètres
                | acces [ protected ] function ProfilDesParamètresEtRésultat
DéfinitionDAccès ::= acces MarqueDeSousType
DéclarationDeTypeIncomplet ::= type IdentificateurDéfinissant [ PartieDiscriminant ] ;
Allocateur ::= new IndicationDeSousType | new ExpressionQualifiée

Paquetages et types privés

 DéclarationDePaquetage ::= SpécificationDePaquetage ;
SpécificationDePaquetage ::=
    package NomDUniteDeProgrammeDéfinissant is
       { ElémentDéclaratifDeBase }
    [ private
       { ElémentDéclaratifDeBase }]
    end [[ NomDUnitéParent . ] Identificateur]
CorpsDePaquetage ::=
    package body NomDUniteDeProgrammeDéfinissant is
       PartieDéclarative
    [ begin
       SuiteDInstructionTraitée ]
    end [[ NomDUnitéParent . ] Identificateur]
PartieDéclarative ::= { ElémentDéclaratif }
ElémentDéclaratif ::= ElémentDéclaratifDeBase | Corps
ElémentDéclaratifDeBase ::= DéclarationSimple | ClauseDeRepresentation | ClauseUse
Corps ::= CorpsVrai | CorpsSouche
CorpsVrai ::= CorpsDeSousProgramme | CorpsDeSousPacketage | CorpsDeTache | CorpsProtegé
ClauseUse ::= ClauseUseDePaquetage | ClauseUseDeType
ClauseUseDePaquetage ::= use NomDePaquetage { , NomDePaquetage } ;
ClauseUseDeType ::= use type MarqueDeSousType { , MarqueDeSousType } ;
DéclarationDeTypePrivé ::= type IdentificateurDéfinissant [ PartieDiscriminants ] is
             [[ abstract ] tagged ] [ limited ] private ;
DéfinitionDeTypeDérivé ::=  [ abstract ] new IndicationDeSousTypeParent [ PartieEtendueDUnArticle]