compilation/spf.lark
Anthony Debucquoy a22bc69491
Adding range
2025-03-20 21:37:08 +01:00

118 lines
2.5 KiB
Plaintext

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
| expressionleft "[" expression "]" -> list_get
?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_seq "}" -> while_loop
| "pour" "chaque" type VARIABLE "dans" expression "faire" "{" instruction_seq "}" -> for_loop
?literal: ENTIER -> entier
| booleen
| ESCAPED_STRING -> string
list: "[" expression? ("," expression)* "]"
range: "[" expression ":" expression "]"
controls: test
| loop
test: "si" expression "alors" "{" instruction_seq "}" ("sinon" "{" instruction_seq "}")?
instruction_seq: (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