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]