compilation/spf.lark

124 lines
2.3 KiB
Plaintext
Raw Normal View History

start: (instruction)*
2025-03-16 11:16:19 +01:00
2025-03-19 16:29:54 +01:00
instruction: declaration ";"
2025-04-29 21:38:31 +02:00
| assignation ";"
| SHOW_KW expression ("," expression)* ";" -> afficher
| ADD_KW expression "dans" VARIABLE ";" -> append
| controls
2025-03-16 11:16:19 +01:00
// rule finishing by u are "UnambigiousED"
expression: logical
logical: comparison logicalu?
logicalu: AND_OP logical
| OR_OP logical
comparison: sumterm comparisonu?
comparisonu: SAME_OP comparison
| DIFF_OP comparison
| LT_OP comparison
| LE_OP comparison
| GT_OP comparison
| GE_OP comparison
sumterm: multterm sumtermu?
sumtermu: PLUS_OP sumterm
| MINUS_OP sumterm
multterm: priority multtermu?
multtermu: TIMES_OP multterm
| DIVIDE_OP multterm
priority: finalterm
| finalterm "[" expression "]" -> list_get
| SIZE_OP finalterm
| NEG_OP finalterm
| NOT_OP finalterm
finalterm: "(" expression ")"
| literal
| list
| range
| VARIABLE -> variable
2025-03-18 00:06:22 +01:00
2025-03-19 16:29:54 +01:00
?type: BOOL_TYPE
| INT_TYPE
| STR_TYPE
| LIST_TYPE
2025-03-17 17:53:00 +01:00
2025-03-19 16:29:54 +01:00
declaration: type VARIABLE (EQUAL_SIGN expression)?
2025-03-17 17:53:00 +01:00
assignation: VARIABLE EQUAL_SIGN expression
2025-03-20 21:11:17 +01:00
loop: "tant" "que" expression "faire" "{" instruction_seq "}" -> while_loop
| "pour" "chaque" type VARIABLE "dans" expression "faire" "{" instruction_seq "}" -> for_loop
2025-03-16 11:16:19 +01:00
2025-03-19 16:29:54 +01:00
?literal: ENTIER -> entier
2025-03-17 23:19:02 +01:00
| booleen
2025-03-19 16:29:54 +01:00
| ESCAPED_STRING -> string
2025-03-16 11:50:54 +01:00
2025-03-19 16:29:54 +01:00
list: "[" expression? ("," expression)* "]"
2025-03-16 11:50:54 +01:00
2025-03-20 21:37:08 +01:00
range: "[" expression ":" expression "]"
2025-03-16 11:50:54 +01:00
2025-03-16 11:16:19 +01:00
controls: test
| loop
2025-03-20 21:11:17 +01:00
test: "si" expression "alors" "{" instruction_seq "}" ("sinon" "{" instruction_seq "}")?
instruction_seq: (instruction*)
2025-03-16 11:50:54 +01:00
2025-03-20 13:27:57 +01:00
?booleen: TRUE_KW -> true
| FALSE_KW -> false
2025-03-20 13:27:57 +01:00
2025-03-17 17:53:00 +01:00
TERMINAL: ";"
2025-03-16 11:50:54 +01:00
2025-03-17 17:53:00 +01:00
VAR_CHARS: /[a-zA-Zçâêîôûéàèìòùëïü_]/
VARIABLE: VAR_CHARS (VAR_CHARS | /[0-9]/)*
2025-03-16 11:16:19 +01:00
2025-03-17 17:53:00 +01:00
EQUAL_SIGN: "="
2025-03-16 11:16:19 +01:00
2025-03-18 00:06:22 +01:00
ENTIER: /0|[1-9][0-9]*/
2025-03-16 11:16:19 +01:00
2025-03-17 17:53:00 +01:00
BOOL_TYPE: "booléen"
INT_TYPE: "entier"
STR_TYPE: "texte"
LIST_TYPE: "liste"
2025-03-16 11:16:19 +01:00
2025-03-17 23:19:02 +01:00
SAME_OP: "==" | "vaut"
2025-03-19 16:29:54 +01:00
DIFF_OP: "!=" | /ne vaut pas/
2025-03-17 23:19:02 +01:00
2025-03-18 00:06:22 +01:00
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"
LBRAC: "["
RBRAC: "]"
2025-03-18 00:06:22 +01:00
ADD_KW: "ajouter"
SHOW_KW: "afficher"
2025-03-16 11:50:54 +01:00
TRUE_KW: "vrai"
FALSE_KW: "faux"
2025-03-16 11:50:54 +01:00
2025-03-17 17:53:00 +01:00
%import common.ESCAPED_STRING
COMMENT: /#[^\n]*/
%ignore COMMENT
2025-03-16 11:50:54 +01:00
%import common.WS
%ignore WS