mirror of
https://github.com/CatalaLang/catala.git
synced 2024-09-19 00:15:39 +03:00
refactor(parser): add the new catala-metadata markup
This commit is contained in:
parent
8c7d538cfb
commit
9aaa614410
@ -66,17 +66,13 @@ mark some as "metadata" so that they are printed differently on lawyer-facing
|
||||
documents. Here's how it works:
|
||||
|
||||
````markdown
|
||||
> Begin metadata # > Début métadonnées en français
|
||||
|
||||
```catala
|
||||
```catala-metadata
|
||||
declaration structure FooBar:
|
||||
data foo content boolean
|
||||
data bar content money
|
||||
|
||||
<your structure/enumeration/scope declarations goes here>
|
||||
```
|
||||
|
||||
> End metadata # > Fin métadonnées en français
|
||||
````
|
||||
|
||||
Again, make sure to regularly check that your example is parsing correctly. The error message from the compiler should help you debug the syntax if need be. You can also
|
||||
|
@ -735,8 +735,6 @@ let rec lex_directive (lexbuf : lexbuf) : token =
|
||||
let prev_pos = lexing_positions lexbuf in
|
||||
match%sedlex lexbuf with
|
||||
| Plus hspace -> lex_directive lexbuf
|
||||
| MR_BEGIN_METADATA -> BEGIN_METADATA
|
||||
| MR_END_METADATA -> END_METADATA
|
||||
| MR_LAW_INCLUDE -> LAW_INCLUDE
|
||||
| ":" ->
|
||||
L.context := Directive_args;
|
||||
@ -754,10 +752,14 @@ let lex_law (lexbuf : lexbuf) : token =
|
||||
if at_bol then
|
||||
match%sedlex lexbuf with
|
||||
| eof -> EOF
|
||||
| "```catala", Plus white_space ->
|
||||
| "```catala", Star white_space, ('\n' | eof) ->
|
||||
L.context := Code;
|
||||
Buffer.clear L.code_buffer;
|
||||
BEGIN_CODE
|
||||
| "```catala-metadata", Star white_space, ('\n' | eof) ->
|
||||
L.context := Code;
|
||||
Buffer.clear L.code_buffer;
|
||||
BEGIN_METADATA
|
||||
| '>' ->
|
||||
L.context := Directive;
|
||||
BEGIN_DIRECTIVE
|
||||
|
@ -102,8 +102,6 @@
|
||||
|
||||
(* Directives *)
|
||||
|
||||
#define MR_BEGIN_METADATA "Begin", Plus hspace, "metadata"
|
||||
#define MR_END_METADATA "End", Plus hspace, "metadata"
|
||||
#define MR_LAW_INCLUDE "Include"
|
||||
#define MX_AT_PAGE \
|
||||
'@', Star hspace, "p.", Star hspace, Plus digit -> \
|
||||
|
@ -109,8 +109,6 @@
|
||||
|
||||
(* Directives *)
|
||||
|
||||
#define MR_BEGIN_METADATA "Début", Plus hspace, "métadonnées"
|
||||
#define MR_END_METADATA "Fin", Plus hspace, "métadonnées"
|
||||
#define MR_LAW_INCLUDE "Inclusion"
|
||||
#define MX_AT_PAGE \
|
||||
'@', Star hspace, "p.", Star hspace, Plus digit -> \
|
||||
|
@ -107,8 +107,6 @@
|
||||
|
||||
(* Directives *)
|
||||
|
||||
#define MR_BEGIN_METADATA "Poczatek", Plus hspace, "metadanych"
|
||||
#define MR_END_METADATA "Koniec", Plus hspace, "metadanych"
|
||||
#define MR_LAW_INCLUDE "Include"
|
||||
#define MX_AT_PAGE \
|
||||
'@', Star hspace, "p.", Star hspace, Plus digit -> \
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -558,7 +558,7 @@ code:
|
||||
| code = list(code_item) { (code, Pos.from_lpos $sloc) }
|
||||
|
||||
metadata_block:
|
||||
| BEGIN_DIRECTIVE BEGIN_METADATA END_DIRECTIVE option(law_text) BEGIN_CODE code_and_pos = code text = END_CODE option(law_text) BEGIN_DIRECTIVE END_METADATA END_DIRECTIVE {
|
||||
| BEGIN_METADATA option(law_text) code_and_pos = code text = END_CODE {
|
||||
let (code, pos) = code_and_pos in
|
||||
(code, (text, pos))
|
||||
}
|
||||
|
@ -58,7 +58,7 @@
|
||||
%token SCOPE FILLED NOT_EQUAL DEFINITION
|
||||
%token STRUCT CONTENT IF THEN DEPENDS DECLARATION
|
||||
%token CONTEXT ENUM ELSE DATE SUM
|
||||
%token BEGIN_METADATA END_METADATA MONEY DECIMAL
|
||||
%token BEGIN_METADATA MONEY DECIMAL
|
||||
%token UNDER_CONDITION CONSEQUENCE LBRACKET RBRACKET
|
||||
%token LABEL EXCEPTION LSQUARE RSQUARE SEMICOLON
|
||||
%token MAXIMUM MINIMUM INIT
|
||||
|
@ -7,9 +7,7 @@ kécessaires au calcul. Cependant, certaines règles de calcul sont implicites
|
||||
dans ces textes et doivent être explicitées pour le calcul informatique. C'est
|
||||
la fonction du bloc de code ci-dessous.
|
||||
|
||||
> Début métadonnées
|
||||
|
||||
```catala
|
||||
```catala-metadata
|
||||
champ d'application EnfantLePlusÂgé:
|
||||
définition le_plus_âgé égal à
|
||||
contenu maximum entier initial Enfant {
|
||||
@ -53,8 +51,6 @@ champ d'application AllocationsFamiliales:
|
||||
sinon 0€
|
||||
```
|
||||
|
||||
> Fin métadonnées
|
||||
|
||||
### Interface du programme
|
||||
|
||||
Le calcul des allocations familiales nécessite un certain nombre d'informations
|
||||
@ -64,9 +60,7 @@ naissance. Le but du block ci-dessous est d'encoder ces dépendances, de telle
|
||||
sorte que l'utilisateur puisse ne doive saisir que le nombre minimal
|
||||
d'informations sur les enfants à charge.
|
||||
|
||||
> Début métadonnées
|
||||
|
||||
```catala
|
||||
```catala-metadata
|
||||
déclaration structure EnfantEntrée:
|
||||
donnée d_identifiant contenu entier
|
||||
donnée d_rémuneration_mensuelle contenu argent
|
||||
@ -99,8 +93,6 @@ champ d'application InterfaceAllocationsFamiliales:
|
||||
rempli
|
||||
```
|
||||
|
||||
> Fin métadonnées
|
||||
|
||||
#### Code de l'éducation
|
||||
|
||||
#### Article L131-1|LEGIARTI000038901859
|
||||
|
@ -4,8 +4,7 @@ Avant de présenter les textes réglementaires qui régissent le calcul des
|
||||
allocations familiales, il est nécessaire de définir les structures de données
|
||||
informatiques qui modélisent la situation dont parlent ces textes législatifs.
|
||||
|
||||
> Début métadonnées
|
||||
```catala
|
||||
```catala-metadata
|
||||
déclaration énumération PriseEnCharge :
|
||||
-- GardeAlternéePartageAllocations
|
||||
-- GardeAlternéeAllocataireUnique
|
||||
@ -158,4 +157,3 @@ champ d'application AllocationsFamiliales:
|
||||
résidence
|
||||
|
||||
```
|
||||
> Fin métadonnées
|
||||
|
@ -1,7 +1,6 @@
|
||||
## Prologue
|
||||
|
||||
> Début métadonnées
|
||||
```catala
|
||||
```catala-metadata
|
||||
déclaration énumération DomicileFiscal:
|
||||
-- France
|
||||
-- HorsDeFrance
|
||||
@ -35,4 +34,3 @@ déclaration champ d'application CalculImpôtSurLeRevenu :
|
||||
contexte montants_sources_revenus contenu MontantsSourcesRevenus
|
||||
contexte domicile_fiscal contenu DomicileFiscal
|
||||
```
|
||||
> Fin métadonnées
|
||||
|
@ -18,8 +18,7 @@ La quotité disponible est la part des biens et droits successoraux qui n'est
|
||||
pas réservée par la loi et dont le défunt a pu disposer librement par des
|
||||
libéralités.
|
||||
|
||||
> Début métadonnées
|
||||
```catala
|
||||
```catala-metadata
|
||||
déclaration structure Enfant:
|
||||
donnée identifiant contenu entier
|
||||
donnée a_renoncé_à_la_succession contenu booléen
|
||||
@ -42,7 +41,6 @@ déclaration champ d'application RéserveHéréditaire:
|
||||
contexte patrimoine_assiette_réserve_héréditaire contenu argent
|
||||
contexte montant_réserve_héréditaire contenu argent
|
||||
```
|
||||
> Fin métadonnées
|
||||
|
||||
######## Article 913 | LEGIARTI000006435557
|
||||
|
||||
|
@ -1,8 +1,6 @@
|
||||
## Title17
|
||||
|
||||
> Begin metadata
|
||||
|
||||
```catala
|
||||
```catala-metadata
|
||||
declaration enumeration Violation_83_135:
|
||||
-- Section286_102
|
||||
-- Section286_122
|
||||
@ -51,7 +49,6 @@ declaration scope Penalty286_83_135:
|
||||
|
||||
context ok condition
|
||||
```
|
||||
> End metadata
|
||||
|
||||
## 286-136 Penalty
|
||||
|
||||
|
@ -57,8 +57,7 @@ inside the law.
|
||||
Let's start our metadata section by declaring the type information for the
|
||||
individual:
|
||||
|
||||
> Begin metadata
|
||||
```catala
|
||||
```catala-metadata
|
||||
declaration structure Individual:
|
||||
# The name of the structure "Individual", must start with an
|
||||
# uppercase letter: this is the CamelCase convention.
|
||||
@ -71,7 +70,6 @@ declaration structure Individual:
|
||||
# "income" and "number_of_children" start by a lowercase letter,
|
||||
# they follow the snake_case convention
|
||||
```
|
||||
> End metadata
|
||||
|
||||
This structure contains two data fields, "income" and "number_of_children". Structures are
|
||||
useful to group together data that goes together. Usually, you
|
||||
@ -82,8 +80,7 @@ but you should aim to optimize code readability.
|
||||
Sometimes, the law gives an enumeration of different situations. These
|
||||
enumerations are modeled in Catala using an enumeration type, like:
|
||||
|
||||
> Begin metadata
|
||||
```catala
|
||||
```catala-metadata
|
||||
declaration enumeration TaxCredit:
|
||||
# The name "TaxCredit" is also written in CamelCase
|
||||
-- NoTaxCredit
|
||||
@ -95,7 +92,6 @@ declaration enumeration TaxCredit:
|
||||
# by the tax credit. This means that if you're in the "ChildrenTaxCredit"
|
||||
# situation, you will also have access to this number of children
|
||||
```
|
||||
> End metadata
|
||||
|
||||
In computer science terms, such an enumeration is called a "sum type" or simply
|
||||
an enum. The combination of structures and enumerations allow the Catala
|
||||
@ -107,8 +103,7 @@ to define the logical context in which these data will evolve. This is done in
|
||||
Catala using "scopes". Scopes are close to functions in terms of traditional
|
||||
programming. Scopes also have to be declared in metadata, so here we go:
|
||||
|
||||
> Begin metadata
|
||||
```catala
|
||||
```catala-metadata
|
||||
declaration scope IncomeTaxComputation:
|
||||
# Scope names use CamelCase
|
||||
context individual content Individual
|
||||
@ -118,7 +113,6 @@ declaration scope IncomeTaxComputation:
|
||||
context fixed_percentage content decimal
|
||||
context income_tax content money
|
||||
```
|
||||
> End metadata
|
||||
|
||||
We now have everything to annotate the contents of article 1, which is copied
|
||||
over below.
|
||||
@ -208,8 +202,7 @@ Catala lets you define functions anywhere in your data. Here's what it looks
|
||||
like in the metadata definition when we want to define a two-brackets tax
|
||||
computation:
|
||||
|
||||
> Begin metadata
|
||||
```catala
|
||||
```catala-metadata
|
||||
declaration structure TwoBrackets:
|
||||
data breakpoint content money
|
||||
data rate1 content decimal
|
||||
@ -219,7 +212,6 @@ declaration scope TwoBracketsTaxComputation :
|
||||
context brackets content TwoBrackets
|
||||
context tax_formula content money depends on money
|
||||
```
|
||||
> End metadata
|
||||
|
||||
And in the code:
|
||||
|
||||
|
@ -59,8 +59,7 @@ la forme et les types de données contenues dans la loi.
|
||||
Commençons notre section métadonnées en déclarant l'information sur le type
|
||||
personne :
|
||||
|
||||
> Début métadonnées
|
||||
```catala
|
||||
```catala-metadata
|
||||
déclaration structure Personne:
|
||||
# Le nom de la structure "Personne", doit commencer
|
||||
# par une lettre majuscule: c'est la convention CamelCase.
|
||||
@ -74,7 +73,6 @@ déclaration structure Personne:
|
||||
# "revenu" and "nombre_enfants" commençent par une lettre minuscule,
|
||||
# ils adhèrent à la convention snake_case
|
||||
```
|
||||
> Fin métadonnées
|
||||
|
||||
Cette structure contient deux champs de de données, "revenu" et "nombre_enfants".
|
||||
Les structures sont utiles pour regrouper des données qui vont ensemble.
|
||||
@ -85,8 +83,7 @@ les données mais vous devrez viser à optimiser la lisibilité du code.
|
||||
Parfois, la loi donne une énumération de différentes situations. Ces énumérations
|
||||
sont modélisés en Catala par le type énumération, comme suit :
|
||||
|
||||
> Début métadonnées
|
||||
```catala
|
||||
```catala-metadata
|
||||
déclaration énumération CréditImpôt:
|
||||
# Le nom "CréditImpôt" s'écrit aussi en CamelCase
|
||||
-- AucunCréditImpôt
|
||||
@ -99,7 +96,6 @@ déclaration énumération CréditImpôt:
|
||||
# d'impôt. Cela signifie que si vous êtes dans la situation
|
||||
# "CréditImpôtEnfants", vous aurez aussi accès à ce nombre d'enfants.
|
||||
```
|
||||
> Fin métadonnées
|
||||
|
||||
En informatique, une telle énumération est appelée "type somme" ou simplement
|
||||
énumération. La combinaison de structures et d'énumération permet au programmeur
|
||||
@ -113,8 +109,7 @@ Les champs d'application sont proches des fonctions en termes de programmation
|
||||
traditionnelle. Les champs d'application doivent avoir été déclarés
|
||||
préalablement dans les métadonnées, de la manière suivante:
|
||||
|
||||
> Début métadonnées
|
||||
```catala
|
||||
```catala-metadata
|
||||
déclaration champ d'application CalculImpôtRevenu:
|
||||
# Les champs d'application utilisent le CamelCase
|
||||
contexte personne contenu Personne
|
||||
@ -124,7 +119,6 @@ déclaration champ d'application CalculImpôtRevenu:
|
||||
contexte pourcentage_fixe contenu décimal
|
||||
contexte impôt_revenu contenu argent
|
||||
```
|
||||
> Fin métadonnées
|
||||
|
||||
Nous avons maintenant tout ce dont nous avons besoin pour annoter le contenu
|
||||
de l'article 1 qui a été copié ci-dessous.
|
||||
@ -217,8 +211,7 @@ Catala vous permet de définir des fonctions partout dans vos données. Voici
|
||||
à quoi cela ressemble dans la définition des métadonnées quand nous voulons
|
||||
définir un calcul de l'impôt sur le revenu à deux tranches :
|
||||
|
||||
> Début métadonnées
|
||||
```catala
|
||||
```catala-metadata
|
||||
déclaration structure DeuxTranches:
|
||||
donnée seuil contenu argent
|
||||
donnée taux1 contenu décimal
|
||||
@ -228,7 +221,6 @@ déclaration champ d'application CalculImpôtDeuxTranches :
|
||||
contexte tranches contenu DeuxTranches
|
||||
contexte formule_imposition contenu argent dépend de argent
|
||||
```
|
||||
> Fin métadonnées
|
||||
|
||||
Et dans le code :
|
||||
|
||||
|
@ -1,10 +1,6 @@
|
||||
## The US Tax Code
|
||||
|
||||
> Begin metadata
|
||||
|
||||
```catala
|
||||
```catala-metadata
|
||||
declaration structure Person:
|
||||
data id content integer
|
||||
```
|
||||
|
||||
> End metadata
|
||||
|
@ -1,8 +1,6 @@
|
||||
## Section 1015
|
||||
|
||||
> Begin metadata
|
||||
|
||||
```catala
|
||||
```catala-metadata
|
||||
declaration enumeration AcquisitionMethod:
|
||||
-- Gift
|
||||
-- Trust
|
||||
@ -31,7 +29,6 @@ declaration scope BasisOfGift:
|
||||
context transferor content Transferor
|
||||
context gift_tax_paid content money
|
||||
```
|
||||
> End metadata
|
||||
|
||||
### (a) Gifts after December 31, 1920
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
## Section 121
|
||||
|
||||
> Begin metadata
|
||||
```catala
|
||||
```catala-metadata
|
||||
declaration structure Period:
|
||||
data begin content date
|
||||
data end content date
|
||||
@ -157,7 +156,6 @@ scope Section121TwoPasses:
|
||||
definition income_excluded_from_gross_income equals
|
||||
second_pass.income_excluded_from_gross_income
|
||||
```
|
||||
> End metadata
|
||||
|
||||
### (a) Exclusion
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
## Section 132
|
||||
|
||||
> Begin metadata
|
||||
```catala
|
||||
```catala-metadata
|
||||
# We only formalize part (c) here
|
||||
declaration enumeration DiscountType:
|
||||
-- Property
|
||||
@ -26,8 +25,6 @@ scope QualifiedEmployeeDiscount:
|
||||
-- Property: false
|
||||
-- Services: true
|
||||
```
|
||||
> End metadata
|
||||
|
||||
|
||||
### (c) Qualified employee discount defined
|
||||
For purposes of this section—
|
||||
|
@ -0,0 +1,2 @@
|
||||
[RESULT] Computation successful! Results:
|
||||
[RESULT] a = A ()
|
@ -0,0 +1,2 @@
|
||||
[RESULT] Computation successful! Results:
|
||||
[RESULT] b = B ()
|
29
tests/test_metadata/good/test_markup_refactoring.catala_en
Normal file
29
tests/test_metadata/good/test_markup_refactoring.catala_en
Normal file
@ -0,0 +1,29 @@
|
||||
# Test the refactored metatdata markup
|
||||
|
||||
```catala-metadata
|
||||
declaration enumeration E:
|
||||
-- A
|
||||
-- B
|
||||
|
||||
declaration scope S:
|
||||
context a content E
|
||||
```
|
||||
|
||||
Some law text...
|
||||
|
||||
```catala-metadata
|
||||
declaration scope S2:
|
||||
context b content E
|
||||
```
|
||||
|
||||
## PROGRAM
|
||||
|
||||
```catala
|
||||
scope S:
|
||||
definition a equals A
|
||||
```
|
||||
|
||||
```catala
|
||||
scope S2:
|
||||
definition b equals B
|
||||
```
|
Loading…
Reference in New Issue
Block a user