start: (instruction)* instruction: declaration ";" | assignation ";" | SHOW_KW expression ("," expression)* ";" -> afficher | ADD_KW expression "dans" VARIABLE ";" -> append | controls expression: expressionleft // TODO: priorité des operator certainement fausse | operator expressionleft: literal | list | range | VARIABLE -> variable | "(" expression ")" //any -> bool operator: expressionleft SAME_OP expression -> equal | expressionleft DIFF_OP expression -> unequal //bool -> bool | expressionleft AND_OP expression -> and_op | expressionleft OR_OP expression -> or_op | NOT_OP expression -> not_op //int -> bool | expressionleft LT_OP expression -> lt | expressionleft LE_OP expression -> le | expressionleft GT_OP expression -> gt | expressionleft GE_OP expression -> ge //int -> int | expressionleft PLUS_OP expression -> plus | expressionleft MINUS_OP expression -> minus | expressionleft TIMES_OP expression -> time | expressionleft DIVIDE_OP expression -> divide | NEG_OP expression -> neg // string/list -> string/list | SIZE_OP expression -> sizeof ?type: BOOL_TYPE | INT_TYPE | STR_TYPE | LIST_TYPE declaration: type VARIABLE (EQUAL_SIGN expression)? assignation: VARIABLE EQUAL_SIGN expression loop: "tant" "que" expression "faire" "{" (instruction)* "}" -> while_loop | "pour" "chaque" type VARIABLE "dans" expression "faire" "{" (instruction)* "}" -> for_loop ?literal: ENTIER -> entier | booleen | ESCAPED_STRING -> string list: "[" expression? ("," expression)* "]" range: "[" expression? ":" expression? "]" controls: test | loop test: "si" expression "alors" "{" instruction* "}" ("sinon" "{" instruction* "}")? ?booleen: TRUE_KW -> true | FALSE_KW -> false TERMINAL: ";" VAR_CHARS: /[a-zA-Zçâêîôûéàèìòùëïü_]/ VARIABLE: VAR_CHARS (VAR_CHARS | /[0-9]/)* EQUAL_SIGN: "=" ENTIER: /0|[1-9][0-9]*/ BOOL_TYPE: "booléen" INT_TYPE: "entier" STR_TYPE: "texte" LIST_TYPE: "liste" SAME_OP: "==" | "vaut" DIFF_OP: "!=" | /ne vaut pas/ AND_OP: "et" OR_OP: "ou" NOT_OP: "not" NEG_OP: "-" PLUS_OP: "+" MINUS_OP: "-" TIMES_OP: "*" DIVIDE_OP: "/" LT_OP: "<" LE_OP: "<=" GT_OP: ">" GE_OP: ">=" CONC_OP: "+" SIZE_OP: "taille" ADD_KW: "ajouter" SHOW_KW: "afficher" TRUE_KW: "vrai" FALSE_KW: "faux" %import common.ESCAPED_STRING COMMENT: /#[^\n]*/ %ignore COMMENT %import common.WS %ignore WS