/
m_language.cleanpeg
61 lines (51 loc) · 3.03 KB
/
m_language.cleanpeg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
comment = r'\#.*'
symbol = r'\w+'
symbol_enumeration = symbol ("," symbol)*
float = r'\d+\.\d+'
integer = r'\d+'
string = '"' r'[^"]*' '"'
interval = symbol ".." symbol # Some intervals are "03..06" so we must keep the prefix "0"
brackets = "[" symbol "]"
enumeration_item = (interval / integer / symbol)
enumeration = enumeration_item ("," enumeration_item)*
loop_variable1 = "un" symbol "dans" enumeration
loop_variable2 = symbol "=" enumeration
loop_variables = (loop_variable1 ("et" loop_variable1)*) / (loop_variable2 (";" loop_variable2)*)
application = "application" symbol ";"
applications_reference = "application" ":" symbol_enumeration
enchaineur = "enchaineur" symbol applications_reference ";"
value_type = "type" ("BOOLEEN" / "DATE_AAAA" / "DATE_JJMMAAAA" / "DATE_MM" / "ENTIER" / "REEL")
variable_calculee_subtype = ("base" / "restituee")
variable_calculee_tableau = "tableau[" integer "]"
variable_calculee = symbol ":" variable_calculee_tableau? "calculee" variable_calculee_subtype* ":" string value_type? ";"
variable_const = symbol ":" "const" "=" float ";"
variable_saisie_alias = "alias" symbol
variable_saisie_attribute = symbol "=" integer
variable_saisie_restituee = "restituee"
variable_saisie_subtype = ("contexte" / "famille" / "penalite" / "revenu")
variable_saisie = symbol ":" "saisie" variable_saisie_subtype variable_saisie_attribute* variable_saisie_restituee? variable_saisie_alias ":" string value_type? ";"
variable = (variable_calculee / variable_const / variable_saisie)
loop_expression = loop_variables ":" expression
function_arguments = expression ("," expression)*
function_call = symbol "(" (loop_expression / function_arguments) ")"
ternary_operator = "si" expression "alors" expression ("sinon" expression)? "finsi"
group = "(" expression ")"
factor_literal = (float / symbol) # Some symbols start with a digit and make it hard to parse with (float / integer / symbol)
factor = sum_operator? (("pour" loop_expression) / ternary_operator / function_call / (symbol brackets) / factor_literal / group)
product_operator = ("*" / "/")
product_expression = factor (product_operator factor)*
sum_operator = ("+" / "-")
sum_expression = product_expression (sum_operator product_expression)*
comparaison = sum_expression ((">=" / "<=" / "!=" / ">" / "<" / "=") sum_expression)?
dans = comparaison (("non"? "dans") "(" enumeration ")")?
expression = dans (("et" / "ou") dans)*
formula = symbol brackets? "=" expression ";"
pour_formula = "pour" loop_variables ":" formula
enchaineur_reference = "enchaineur" ":" symbol ";"
regle = "regle" symbol+ ":" applications_reference ";" enchaineur_reference? (pour_formula / formula)+
verif_condition = "si" expression "alors" "erreur" symbol+ ";"
verif = "verif" symbol+ ":" applications_reference ";" verif_condition+
erreur_type = ("anomalie" / "discordance" / "informative")
erreur = symbol ":" erreur_type ":" string ":" string ":" string ":" string (":" string)? ";"
sortie = "sortie(" symbol ")" ";"
m_source_file = (comment / application / enchaineur / variable / regle / verif / erreur / sortie)+ EOF