refactor(parser): add the new catala-metadata markup

This commit is contained in:
Emile Rolley 2021-10-01 10:01:25 +02:00
parent 8c7d538cfb
commit 9aaa614410
22 changed files with 307 additions and 327 deletions

View File

@ -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

View File

@ -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

View File

@ -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 -> \

View File

@ -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 -> \

View File

@ -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

View File

@ -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))
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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 :

View File

@ -1,10 +1,6 @@
## The US Tax Code
> Begin metadata
```catala
```catala-metadata
declaration structure Person:
data id content integer
```
> End metadata

View File

@ -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

View File

@ -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

View File

@ -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—

View File

@ -0,0 +1,2 @@
[RESULT] Computation successful! Results:
[RESULT] a = A ()

View File

@ -0,0 +1,2 @@
[RESULT] Computation successful! Results:
[RESULT] b = B ()

View 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
```