3.3 Language Formal Syntax (BNF)

<header> ::= "Bonjour," <spaces>

<main> ::= "En" <spaces> "sachant" <spaces> "que" <spaces> "les" <spaces> "variables" <spaces> "principales" <spaces> "sont" <spaces> ":" <spaces> [<variable_list>]
 "\;" <spaces> "pourrais-tu" <spaces> "s'il" <spaces> "te" <spaces> "plaît" <spaces> "commencer" <spaces> "la" <spaces> "lecture" <spaces> "ici" <spaces> "?" [<spaces>] <block> [<spaces>] "Merci d'avance," <spaces> "Cordialement," <spaces> <name> <name>

<variable_definition> ::= "-" <spaces> <word> "," <spaces> "de" <spaces> "type" <spaces> <variable_type> "," <spaces> "valant" <spaces> <value> 

<variable_list> ::= <variable_definition> <spaces> [<variable_list>]

<exclusif_or> ::= "ou" <spaces> "exclusif" | "xor"

<arithmetic_operator> ::= "plus" | "moins"
                        | ("divisé" | "multiplié") <spaces> "par"
                        | "modulo"
                        | "fois"

<comparison_operator> ::= "est"
                        | "est" <spaces> "égale" <spaces> "à"
                        | "est" <spaces> "différent" <spaces> "de"
                        | "est" <spaces> "inférieure" <spaces> "à"
                        | "est" <spaces> "supérieure" <spaces> "à"
                        | "est" <spaces> "inférieure" <spaces> "ou" <spaces> "égale" <spaces> "à"
                        | "est" <spaces> "supérieure" <spaces> "ou" <spaces> "égale" <spaces> "à"

<logical_operator> ::= "et" | "ou"

<bitwise_operator> ::= "décalé" <spaces> "binairement" <spaces> "à" <spaces> "gauche"
    | "décalé" <spaces> "binairement" <spaces> "à" <spaces> "droite"
    | "et" <spaces> "binaire"
    | "ou" <spaces> "binaire"
    | <exclusif_or>
 
<operators> ::= <bitwise_operator> | <logical_operator> | <comparison_operator> | <arithmetic_operator>

<parenthesized_condition> ::= "(" <condition> ")"

<condition> ::= <word> [<spaces> <operators> <spaces> (<condition> | <parenthesized_condition>)]
              | <value> [<spaces> <operators> <spaces> (<condition> | <parenthesized_condition>)]

<parameter> ::= "-" <spaces> <word> "," <spaces> "de" <spaces> "type" <spaces> <variable_type>

<parameter_list> ::= <parameter> <spaces> [<parameter_list>]

<function_definition> ::= "J’aimerais" <spaces> "définir" <spaces> "le" <spaces> "bloc" <spaces> "répondant" <spaces> "au" <spaces> "nom" <spaces> "de" <spaces> <word> "," <spaces> "de" <spaces> "type" <spaces> "de" <spaces> "retour" <spaces> <function_type> "," <spaces> "nécessitant" <spaces> "comme" <spaces> "entrée" <spaces> ":" <spaces> [<parameter_list>] "\;" <spaces> "contenant" <spaces> "les" <spaces> "variables" <spaces> ":" <spaces> [<variable_list>] "\;" <spaces> "représenté" <spaces> "par" <spaces> "le" <spaces> "code" <spaces> ("suivant" | "ci-après" | "ci-dessous") "." [<spaces>] <block> <spaces> "Merci."

<text> ::= <symbol> [<text>]

<comment> ::= "*" <text> "*"

<quoted_value> ::= "« " <text> " »"

<block> ::= <statement_list>

<statement_list> ::= <statement> [[<spaces>] <statement_list> [<spaces]]

<statement> ::= <condition_statement> | <return_statement> | <loop_statement> | <display_statement> | <invoke_statement> | <assignment_statement>

<return_statement> ::= "Enfin," <spaces> "renvoie" <spaces> <condition> "." | "Enfin," <spaces> "sors" <spaces> "du" <spaces> "bloc."

<condition_definition> ::= "Si" <spaces> <condition> "," <spaces> "exécute" <spaces> "le" <spaces> "texte" <spaces> ":"

<condition_statement> ::= <condition_definition> <space> <block> "Merci."
    | <condition_definition> <space> <block> "\;" <space> "sinon" <space> "exécute" <space> "le" <space> "texte" <space> ":" <block> "Merci."

<loop_statement> ::= "Tant" <spaces> "que" <condition> <spaces> "exécute" <spaces> "le" <spaces> "code" <spaces> "ci-après" <spaces> ":" <spaces> <block> "Merci."

<display_statement> ::= "Affiche" (<condition> | <quoted_value>) "."

<invoke_params> ::= <condition> ["," <condition>]

<invoke_statement> ::= "J'invoque" <spaces> "le" <spaces> "bloc" <spaces> <word>
    ["," <spaces> "et" <spaces> "j'assigne" <spaces> "la" <spaces> "valeur" <spaces> "de" <spaces> "retour" <spaces> "à" <spaces> "la" <spaces> "variable" <spaces> <word>]
    ["," <spaces> "avec les paramètres" <spaces> <invoke_params>] "."

<assignment_statement> ::= "J'aimerais" <spaces> "que" <spaces> <word> <spaces> "prenne" <spaces> "la" <spaces> "valeur" <spaces> <condition> "." |
    <word> <spaces> "prend" <spaces> "la" <spaces> "valeur" <spaces> <condition>

<variable_type> ::= "entier" <spaces> "naturel" | "booléen"

<function_type> ::= "entier" <spaces> "naturel" | "booléen" | "nul"

<name> ::= <word> "\n"

<variables_list> ::= <variables> | <variables> <spaces> <variables_list>

<variables> ::= <name> "," <spaces> "de" <spaces> "type" <spaces> <type> "," <spaces> "valant" <spaces> <value>

<space> ::= "\t" | "\n" | "\r" | "\f" | "\v"

<spaces> ::= <space> | <space> <spaces>

<number> ::= 0 | 1 | 2 | 3 | ...

<signed_number> ::= "-" <number> | "~" <number> | "non" <spaces> <number>

<value> ::= <signed_number> | <number> | <bool> | <char_value>

<word_char> ::= <printable> | <word_symbol>

<printable> ::= "A" .. "Z"
              | "a" .. "z"
              | "0" .. "9"

<word_symbol> ::= "!" | "\"" | "#" | "$" | "%" | "&" | "'" | "*" | "+" | "-" | "/" 
           | ":" | "\;" | "<" | "=" | ">" | "?" | "@"
           | "[" | "\\" | "]" | "^" | "_" | "{" | "}" | "|" | "~"

<symbol> ::= <word_symbol> | <space> | <printable> | "," | "\t" | "\n" | "(" | ")"

<word> ::= <word_char> | <word_char> <word>

<char_value> ::= "'" <symbol> "'"

<bool> ::= "faux" | "fausse" | "vrai" | "vraie"

As the language is heavily based on the French language, it has shaped many of our syntax decisions :