From e431e194dea40feae3a9e54ccd5d58e1b214f0d5 Mon Sep 17 00:00:00 2001 From: Louis Gesbert Date: Thu, 19 Aug 2021 18:26:06 +0200 Subject: [PATCH 1/7] Factorise lexer translations --- .gitattributes | 1 + compiler/surface/dune | 15 + .../surface/{lexer_pl.ml => lexer.cppo.ml} | 527 +++++++++++----- compiler/surface/lexer_common.ml | 6 +- compiler/surface/lexer_common.mli | 4 +- compiler/surface/lexer_en.cppo.ml | 135 ++++ compiler/surface/lexer_en.ml | 575 ----------------- compiler/surface/lexer_fr.cppo.ml | 141 +++++ compiler/surface/lexer_fr.ml | 580 ------------------ compiler/surface/lexer_pl.cppo.ml | 139 +++++ compiler/surface/parser.messages | 90 +-- compiler/surface/parser.mly | 20 +- compiler/surface/tokens.mly | 2 +- 13 files changed, 852 insertions(+), 1383 deletions(-) rename compiler/surface/{lexer_pl.ml => lexer.cppo.ml} (58%) create mode 100644 compiler/surface/lexer_en.cppo.ml delete mode 100644 compiler/surface/lexer_en.ml create mode 100644 compiler/surface/lexer_fr.cppo.ml delete mode 100644 compiler/surface/lexer_fr.ml create mode 100644 compiler/surface/lexer_pl.cppo.ml diff --git a/.gitattributes b/.gitattributes index 2968a5f7..b5343497 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,3 +3,4 @@ french_law/js/french_law.js binary french_law/ocaml/law_source/allocations_familiales.ml binary french_law/ocaml/law_source/unit_tests/tests_allocations_famiales.ml binary french_law/python/src/allocations_familiales.py binary +compiler/surface/lexer*.cppo.ml text encoding=latin-1 diff --git a/compiler/surface/dune b/compiler/surface/dune index 69e51a4e..9c5d3a5d 100644 --- a/compiler/surface/dune +++ b/compiler/surface/dune @@ -14,6 +14,21 @@ (preprocess (pps sedlex.ppx visitors.ppx))) +(rule + (with-stdout-to + lexer_en.ml + (run %{bin:cppo} %{dep:lexer_en.cppo.ml} %{dep:lexer.cppo.ml}))) + +(rule + (with-stdout-to + lexer_fr.ml + (run %{bin:cppo} %{dep:lexer_fr.cppo.ml} %{dep:lexer.cppo.ml}))) + +(rule + (with-stdout-to + lexer_pl.ml + (run %{bin:cppo} %{dep:lexer_pl.cppo.ml} %{dep:lexer.cppo.ml}))) + (menhir (modules tokens) (flags --only-tokens)) diff --git a/compiler/surface/lexer_pl.ml b/compiler/surface/lexer.cppo.ml similarity index 58% rename from compiler/surface/lexer_pl.ml rename to compiler/surface/lexer.cppo.ml index 5b7c0a47..af358784 100644 --- a/compiler/surface/lexer_pl.ml +++ b/compiler/surface/lexer.cppo.ml @@ -18,83 +18,292 @@ open Utils module L = Lexer_common module R = Re.Pcre -(** Same as {!val: Surface.Lexer_common.token_list_language_agnostic}, but with tokens specialized - to Polish. *) +(* The localised strings and regexps for the tokens and specific parsing rules + are defined as CPPO macros in the `lexer_XX.cppo.ml` files. + + - `MS_*` macros define token strings + - `MR_*` are sedlex regexps matching the token (inferred from the strings if absent, + but should be present for any token containing spacing, and for any non-latin1 + character) + - `MX_*` are full matching rules of the form `sedlex regexp -> ocaml expression` +*) + +(* Avoid the need for defining the regexps when they are simple strings *) +#ifndef MR_SCOPE + #define MR_SCOPE MS_SCOPE +#endif +#ifndef MR_CONSEQUENCE + #define MR_CONSEQUENCE MS_CONSEQUENCE +#endif +#ifndef MR_DATA + #define MR_DATA MS_DATA +#endif +#ifndef MR_DEPENDS + #define MR_DEPENDS MS_DEPENDS +#endif +#ifndef MR_DECLARATION + #define MR_DECLARATION MS_DECLARATION +#endif +#ifndef MR_CONTEXT + #define MR_CONTEXT MS_CONTEXT +#endif +#ifndef MR_DECREASING + #define MR_DECREASING MS_DECREASING +#endif +#ifndef MR_INCREASING + #define MR_INCREASING MS_INCREASING +#endif +#ifndef MR_OF + #define MR_OF MS_OF +#endif +#ifndef MR_COLLECTION + #define MR_COLLECTION MS_COLLECTION +#endif +#ifndef MR_ENUM + #define MR_ENUM MS_ENUM +#endif +#ifndef MR_INTEGER + #define MR_INTEGER MS_INTEGER +#endif +#ifndef MR_MONEY + #define MR_MONEY MS_MONEY +#endif +#ifndef MR_TEXT + #define MR_TEXT MS_TEXT +#endif +#ifndef MR_DECIMAL + #define MR_DECIMAL MS_DECIMAL +#endif +#ifndef MR_DATE + #define MR_DATE MS_DATE +#endif +#ifndef MR_DURATION + #define MR_DURATION MS_DURATION +#endif +#ifndef MR_BOOLEAN + #define MR_BOOLEAN MS_BOOLEAN +#endif +#ifndef MR_SUM + #define MR_SUM MS_SUM +#endif +#ifndef MR_FILLED + #define MR_FILLED MS_FILLED +#endif +#ifndef MR_DEFINITION + #define MR_DEFINITION MS_DEFINITION +#endif +#ifndef MR_LABEL + #define MR_LABEL MS_LABEL +#endif +#ifndef MR_EXCEPTION + #define MR_EXCEPTION MS_EXCEPTION +#endif +#ifndef MR_DEFINED_AS + #define MR_DEFINED_AS MS_DEFINED_AS +#endif +#ifndef MR_MATCH + #define MR_MATCH MS_MATCH +#endif +#ifndef MR_WILDCARD + #define MR_WILDCARD MS_WILDCARD +#endif +#ifndef MR_WITH + #define MR_WITH MS_WITH +#endif +#ifndef MR_UNDER_CONDITION + #define MR_UNDER_CONDITION MS_UNDER_CONDITION +#endif +#ifndef MR_IF + #define MR_IF MS_IF +#endif +#ifndef MR_THEN + #define MR_THEN MS_THEN +#endif +#ifndef MR_ELSE + #define MR_ELSE MS_ELSE +#endif +#ifndef MR_CONDITION + #define MR_CONDITION MS_CONDITION +#endif +#ifndef MR_CONTENT + #define MR_CONTENT MS_CONTENT +#endif +#ifndef MR_STRUCT + #define MR_STRUCT MS_STRUCT +#endif +#ifndef MR_ASSERTION + #define MR_ASSERTION MS_ASSERTION +#endif +#ifndef MR_VARIES + #define MR_VARIES MS_VARIES +#endif +#ifndef MR_WITH_V + #define MR_WITH_V MS_WITH_V +#endif +#ifndef MR_FOR + #define MR_FOR MS_FOR +#endif +#ifndef MR_ALL + #define MR_ALL MS_ALL +#endif +#ifndef MR_WE_HAVE + #define MR_WE_HAVE MS_WE_HAVE +#endif +#ifndef MR_FIXED + #define MR_FIXED MS_FIXED +#endif +#ifndef MR_BY + #define MR_BY MS_BY +#endif +#ifndef MR_RULE + #define MR_RULE MS_RULE +#endif +#ifndef MR_EXISTS + #define MR_EXISTS MS_EXISTS +#endif +#ifndef MR_IN + #define MR_IN MS_IN +#endif +#ifndef MR_SUCH + #define MR_SUCH MS_SUCH +#endif +#ifndef MR_THAT + #define MR_THAT MS_THAT +#endif +#ifndef MR_AND + #define MR_AND MS_AND +#endif +#ifndef MR_OR + #define MR_OR MS_OR +#endif +#ifndef MR_XOR + #define MR_XOR MS_XOR +#endif +#ifndef MR_NOT + #define MR_NOT MS_NOT +#endif +#ifndef MR_MAXIMUM + #define MR_MAXIMUM MS_MAXIMUM +#endif +#ifndef MR_MINIMUM + #define MR_MINIMUM MS_MINIMUM +#endif +#ifndef MR_FILTER + #define MR_FILTER MS_FILTER +#endif +#ifndef MR_MAP + #define MR_MAP MS_MAP +#endif +#ifndef MR_INIT + #define MR_INIT MS_INIT +#endif +#ifndef MR_CARDINAL + #define MR_CARDINAL MS_CARDINAL +#endif +#ifndef MR_YEAR + #define MR_YEAR MS_YEAR +#endif +#ifndef MR_MONTH + #define MR_MONTH MS_MONTH +#endif +#ifndef MR_DAY + #define MR_DAY MS_DAY +#endif +#ifndef MR_TRUE + #define MR_TRUE MS_TRUE +#endif +#ifndef MR_FALSE + #define MR_FALSE MS_FALSE +#endif +#ifndef MR_IntToDec + #define MR_IntToDec MS_IntToDec +#endif +#ifndef MR_GetDay + #define MR_GetDay MS_GetDay +#endif +#ifndef MR_GetMonth + #define MR_GetMonth MS_GetMonth +#endif +#ifndef MR_GetYear + #define MR_GetYear MS_GetYear +#endif + let token_list : (string * token) list = [ - ("zakres", SCOPE); - ("konsekwencja", CONSEQUENCE); - ("data", DATA); - ("zalezy od", DEPENDS); - ("deklaracja", DECLARATION); - ("kontekst", CONTEXT); - ("malejacy", DECREASING); - ("rosnacy", INCREASING); - ("z", OF); - ("kolekcja", COLLECTION); - ("enumeracja", ENUM); - ("calkowita", INTEGER); - ("pieniÄ…dze", MONEY); - ("tekst", TEXT); - ("dziesiÄ™tny", DECIMAL); - ("czas", DATE); - ("czas trwania", DURATION); - ("zerojedynkowy", BOOLEAN); - ("suma", SUM); - ("spelnione", FILLED); - ("definicja", DEFINITION); - ("etykieta", LABEL); - ("wyjÄ…tek", EXCEPTION); - ("wynosi", DEFINED_AS); - ("pasuje", MATCH); - ("ze wzorem", WITH); - ("cokolwiek", WILDCARD); - ("pod warunkiem", UNDER_CONDITION); - ("jezeli", IF); - ("wtedy", THEN); - ("inaczej", ELSE); - ("typu", CONTENT); - ("struktura", STRUCT); - ("asercja", ASSERTION); - ("rozna", VARIES); - ("wraz z", WITH_V); - ("dla", FOR); - ("wszystkie", ALL); - ("mamy", WE_HAVE); - ("staloprzecinkowa", FIXED); - ("przez", BY); - ("zasada", RULE); - ("istnieje", EXISTS); - ("takie ze", SUCH); - ("to", THAT); - ("i", AND); - ("lub", OR); - ("xor", XOR); - ("nie", NOT); - ("maximum", MAXIMUM); - ("minimum", MINIMUM); - ("filtr", FILTER); - ("mapuj", MAP); - ("poczatkowy", INIT); - ("liczba", CARDINAL); - ("rok", YEAR); - ("miesiac", MONTH); - ("dzien", DAY); - ("prawda", TRUE); - ("falsz", FALSE); + (MS_SCOPE, SCOPE); + (MS_CONSEQUENCE, CONSEQUENCE); + (MS_DATA, DATA); + (MS_DEPENDS, DEPENDS); + (MS_DECLARATION, DECLARATION); + (MS_CONTEXT, CONTEXT); + (MS_DECREASING, DECREASING); + (MS_INCREASING, INCREASING); + (MS_OF, OF); + (MS_COLLECTION, COLLECTION); + (MS_ENUM, ENUM); + (MS_INTEGER, INTEGER); + (MS_MONEY, MONEY); + (MS_TEXT, TEXT); + (MS_DECIMAL, DECIMAL); + (MS_DATE, DATE); + (MS_DURATION, DURATION); + (MS_BOOLEAN, BOOLEAN); + (MS_SUM, SUM); + (MS_FILLED, FILLED); + (MS_DEFINITION, DEFINITION); + (MS_LABEL, LABEL); + (MS_EXCEPTION, EXCEPTION); + (MS_DEFINED_AS, DEFINED_AS); + (MS_MATCH, MATCH); + (MS_WILDCARD, WILDCARD); + (MS_WITH, WITH); + (MS_UNDER_CONDITION, UNDER_CONDITION); + (MS_IF, IF); + (MS_THEN, THEN); + (MS_ELSE, ELSE); + (MS_CONDITION, CONDITION); + (MS_CONTENT, CONTENT); + (MS_STRUCT, STRUCT); + (MS_ASSERTION, ASSERTION); + (MS_VARIES, VARIES); + (MS_WITH_V, WITH_V); + (MS_FOR, FOR); + (MS_ALL, ALL); + (MS_WE_HAVE, WE_HAVE); + (MS_FIXED, FIXED); + (MS_BY, BY); + (MS_RULE, RULE); + (MS_EXISTS, EXISTS); + (MS_IN, IN); + (MS_SUCH, SUCH); + (MS_THAT, THAT); + (MS_AND, AND); + (MS_OR, OR); + (MS_XOR, XOR); + (MS_NOT, NOT); + (MS_MAXIMUM, MAXIMUM); + (MS_MINIMUM, MINIMUM); + (MS_FILTER, FILTER); + (MS_MAP, MAP); + (MS_INIT, INIT); + (MS_CARDINAL, CARDINAL); + (MS_YEAR, YEAR); + (MS_MONTH, MONTH); + (MS_DAY, DAY); + (MS_TRUE, TRUE); + (MS_FALSE, FALSE); ] @ L.token_list_language_agnostic -(** Localised builtin functions - - @note (EmileRolley): shouldn't the builtin functions also be translated ? *) -let builtins : (string * Ast.builtin_expression) list = - [ - ("integer_to_decimal", IntToDec); - ("get_day", GetDay); - ("get_month", GetMonth); - ("get_year", GetYear); - ] +(** Localised builtin functions *) +let lex_builtin (s : string) : Ast.builtin_expression option = + let lexbuf = Utf8.from_string s in + match%sedlex lexbuf with + | MS_IntToDec, eof -> Some IntToDec + | MS_GetDay, eof -> Some GetDay + | MS_GetMonth, eof -> Some GetMonth + | MS_GetYear, eof -> Some GetYear + | _ -> None (** Regexp matching any digit character. @@ -125,215 +334,195 @@ let rec lex_code (lexbuf : lexbuf) : token = (* End of code section *) L.context := Law; END_CODE (Buffer.contents L.code_buffer) - | "zakres" -> + | MR_SCOPE -> L.update_acc lexbuf; SCOPE - | "data" -> + | MR_DATA -> L.update_acc lexbuf; DATA - | "zalezy", space_plus, "od" -> + | MR_DEPENDS -> L.update_acc lexbuf; DEPENDS - | "deklaracja" -> + | MR_DECLARATION -> L.update_acc lexbuf; DECLARATION - | "kontekst" -> + | MR_CONTEXT -> L.update_acc lexbuf; CONTEXT - | "malejacy" -> + | MR_DECREASING -> L.update_acc lexbuf; DECREASING - | "rosnacy" -> + | MR_INCREASING -> L.update_acc lexbuf; INCREASING - | "z" -> + | MR_OF -> L.update_acc lexbuf; OF - | "kolekcja" -> + | MR_COLLECTION -> L.update_acc lexbuf; COLLECTION - | "enumeracja" -> + | MR_ENUM -> L.update_acc lexbuf; ENUM - | "calkowita" -> + | MR_INTEGER -> L.update_acc lexbuf; INTEGER - | "pieni", 0x0105, "dze" -> + | MR_MONEY -> L.update_acc lexbuf; MONEY - | "tekst" -> + | MR_TEXT -> L.update_acc lexbuf; TEXT - | "dziesi", 0x0119, "tny" -> + | MR_DECIMAL -> L.update_acc lexbuf; DECIMAL - | "czas" -> + | MR_DATE -> L.update_acc lexbuf; DATE - | "czas", space_plus, "trwania" -> + | MR_DURATION -> L.update_acc lexbuf; DURATION - | "zerojedynkowy" -> + | MR_BOOLEAN -> L.update_acc lexbuf; BOOLEAN - | "suma" -> + | MR_SUM -> L.update_acc lexbuf; SUM - | "spelnione" -> + | MR_FILLED -> L.update_acc lexbuf; FILLED - | "definicja" -> + | MR_DEFINITION -> L.update_acc lexbuf; DEFINITION - | "etykieta" -> + | MR_LABEL -> L.update_acc lexbuf; LABEL - | "wyj", 0x0105, "tek" -> + | MR_EXCEPTION -> L.update_acc lexbuf; EXCEPTION - | "wynosi" -> + | MR_DEFINED_AS -> L.update_acc lexbuf; DEFINED_AS - | "pasuje" -> + | MR_MATCH -> L.update_acc lexbuf; MATCH - | "ze", space_plus, "wzorem" -> + | MR_WITH -> L.update_acc lexbuf; WITH - | "cokolwiek" -> + | MR_WILDCARD -> L.update_acc lexbuf; WILDCARD - | "pod", space_plus, "warunkiem" -> + | MR_UNDER_CONDITION -> L.update_acc lexbuf; UNDER_CONDITION - | "jezeli" -> + | MR_IF -> L.update_acc lexbuf; IF - | "konsekwencja" -> + | MR_CONSEQUENCE -> L.update_acc lexbuf; CONSEQUENCE - | "wtedy" -> + | MR_THEN -> L.update_acc lexbuf; THEN - | "inaczej" -> + | MR_ELSE -> L.update_acc lexbuf; ELSE - | "warunek" -> + | MR_CONDITION -> L.update_acc lexbuf; CONDITION - | "typu" -> + | MR_CONTENT -> L.update_acc lexbuf; CONTENT - | "struktura" -> + | MR_STRUCT -> L.update_acc lexbuf; STRUCT - | "asercja" -> + | MR_ASSERTION -> L.update_acc lexbuf; ASSERTION - | "rozna" -> + | MR_VARIES -> L.update_acc lexbuf; VARIES - | "wraz", space_plus, "z" -> + | MR_WITH_V -> L.update_acc lexbuf; WITH_V - | "dla" -> + | MR_FOR -> L.update_acc lexbuf; FOR - | "wszystkie" -> + | MR_ALL -> L.update_acc lexbuf; ALL - | "mamy" -> + | MR_WE_HAVE -> L.update_acc lexbuf; WE_HAVE - | "staloprzecinkowa" -> + | MR_FIXED -> L.update_acc lexbuf; FIXED - | "przez" -> + | MR_BY -> L.update_acc lexbuf; BY - | "zasada" -> - (* 0xE8 is è *) + | MR_RULE -> + L.update_acc lexbuf; L.update_acc lexbuf; RULE - | "istnieje" -> + | MR_EXISTS -> L.update_acc lexbuf; EXISTS - | "in" -> + | MR_IN -> L.update_acc lexbuf; IN - | "takie", space_plus, "ze" -> + | MR_SUCH -> L.update_acc lexbuf; SUCH - | "to" -> + | MR_THAT -> L.update_acc lexbuf; THAT - | "i" -> + | MR_AND -> L.update_acc lexbuf; AND - | "lub" -> + | MR_OR -> L.update_acc lexbuf; OR - | "xor" -> + | MR_XOR -> L.update_acc lexbuf; XOR - | "nie" -> + | MR_NOT -> L.update_acc lexbuf; NOT - | "maximum" -> + | MR_MAXIMUM -> L.update_acc lexbuf; MAXIMUM - | "minimum" -> + | MR_MINIMUM -> L.update_acc lexbuf; MINIMUM - | "filtr" -> + | MR_FILTER -> L.update_acc lexbuf; FILTER - | "mapuj" -> + | MR_MAP -> L.update_acc lexbuf; MAP - | "poczatkowy" -> + | MR_INIT -> L.update_acc lexbuf; INIT - | "liczba" -> + | MR_CARDINAL -> L.update_acc lexbuf; CARDINAL - | "prawda" -> + | MR_TRUE -> L.update_acc lexbuf; TRUE - | "falsz" -> + | MR_FALSE -> L.update_acc lexbuf; FALSE - | "rok" -> + | MR_YEAR -> L.update_acc lexbuf; YEAR - | "miesiac" -> + | MR_MONTH -> L.update_acc lexbuf; MONTH - | "dzien" -> + | MR_DAY -> L.update_acc lexbuf; DAY - | digit, Star (digit | ','), Opt ('.', Rep (digit, 0 .. 2)), Star hspace, "PLN" -> - let extract_parts = R.regexp "([0-9]([0-9,]*[0-9]|))(.([0-9]{0,2})|)" in - let str = Utf8.lexeme lexbuf in - let parts = R.get_substring (R.exec ~rex:extract_parts str) in - (* Integer literal*) - let units = parts 1 in - let remove_commas = R.regexp "," in - let units = - Runtime.integer_of_string (R.substitute ~rex:remove_commas ~subst:(fun _ -> "") units) - in - let cents = - try Runtime.integer_of_string (parts 4) with Not_found -> Runtime.integer_of_int 0 - in - L.update_acc lexbuf; - MONEY_AMOUNT (units, cents) - | Plus digit, '.', Star digit -> - let extract_code_title = R.regexp "([0-9]+)\\.([0-9]*)" in - let dec_parts = R.get_substring (R.exec ~rex:extract_code_title (Utf8.lexeme lexbuf)) in - (* Integer literal*) - L.update_acc lexbuf; - DECIMAL_LITERAL - (Runtime.integer_of_string (dec_parts 1), Runtime.integer_of_string (dec_parts 2)) + | MX_MONEY_AMOUNT + | MX_DECIMAL_LITERAL | "<=@" -> L.update_acc lexbuf; LESSER_EQUAL_DATE @@ -373,28 +562,28 @@ let rec lex_code (lexbuf : lexbuf) : token = | "/^" -> L.update_acc lexbuf; DIVDURATION - | "<=", 0x24 -> + | "<=", MR_MONEY_OP_SUFFIX -> L.update_acc lexbuf; LESSER_EQUAL_MONEY - | '<', 0x24 -> + | '<', MR_MONEY_OP_SUFFIX -> L.update_acc lexbuf; LESSER_MONEY - | ">=", 0x24 -> + | ">=", MR_MONEY_OP_SUFFIX -> L.update_acc lexbuf; GREATER_EQUAL_MONEY - | '>', 0x24 -> + | '>', MR_MONEY_OP_SUFFIX -> L.update_acc lexbuf; GREATER_MONEY - | '+', 0x24 -> + | '+', MR_MONEY_OP_SUFFIX -> L.update_acc lexbuf; PLUSMONEY - | '-', 0x24 -> + | '-', MR_MONEY_OP_SUFFIX -> L.update_acc lexbuf; MINUSMONEY - | '*', 0x24 -> + | '*', MR_MONEY_OP_SUFFIX -> L.update_acc lexbuf; MULTMONEY - | '/', 0x24 -> + | '/', MR_MONEY_OP_SUFFIX -> L.update_acc lexbuf; DIVMONEY | "<=." -> @@ -486,7 +675,7 @@ let rec lex_code (lexbuf : lexbuf) : token = ALT | "++" -> L.update_acc lexbuf; - CONCAT + PLUSPLUS | '.' -> L.update_acc lexbuf; DOT @@ -524,9 +713,9 @@ let rec lex_directive (lexbuf : lexbuf) : token = let prev_pos = lexing_positions lexbuf in match%sedlex lexbuf with | Plus hspace -> lex_directive lexbuf - | "Poczatek", Plus hspace, "metadanych" -> BEGIN_METADATA - | "Koniec", Plus hspace, "metadanych" -> END_METADATA - | "Include" -> LAW_INCLUDE + | MR_BEGIN_METADATA -> BEGIN_METADATA + | MR_END_METADATA -> END_METADATA + | MR_LAW_INCLUDE -> LAW_INCLUDE | ":" -> L.context := Directive_args; COLON diff --git a/compiler/surface/lexer_common.ml b/compiler/surface/lexer_common.ml index 5b931673..9e7ae853 100644 --- a/compiler/surface/lexer_common.ml +++ b/compiler/surface/lexer_common.ml @@ -79,15 +79,15 @@ let token_list_language_agnostic : (string * token) list = (":", COLON); (";", SEMICOLON); ("--", ALT); - ("++", CONCAT); + ("++", PLUSPLUS); ] module type LocalisedLexer = sig val token_list : (string * Tokens.token) list (** Same as {!val: token_list_language_agnostic}, but with tokens specialized to a given language. *) - val builtins : (string * Ast.builtin_expression) list - (** Associative list of string to their corresponding builtins *) + val lex_builtin : string -> Ast.builtin_expression option + (** Simple lexer for builtins *) val lex_code : Sedlexing.lexbuf -> Tokens.token (** Main lexing function used in code blocks *) diff --git a/compiler/surface/lexer_common.mli b/compiler/surface/lexer_common.mli index 804d2b04..f0b2a8a5 100644 --- a/compiler/surface/lexer_common.mli +++ b/compiler/surface/lexer_common.mli @@ -46,8 +46,8 @@ module type LocalisedLexer = sig (** Same as {!val: token_list_language_agnostic}, but with tokens whose string varies with the input language. *) - val builtins : (string * Ast.builtin_expression) list - (** Associative list of string to their corresponding builtins *) + val lex_builtin : string -> Ast.builtin_expression option + (** Simple lexer for builtins *) val lex_code : Sedlexing.lexbuf -> Tokens.token (** Main lexing function used in a code block *) diff --git a/compiler/surface/lexer_en.cppo.ml b/compiler/surface/lexer_en.cppo.ml new file mode 100644 index 00000000..836cf648 --- /dev/null +++ b/compiler/surface/lexer_en.cppo.ml @@ -0,0 +1,135 @@ +(* -*- coding: iso-latin-1 -*- *) + +(* This file is part of the Catala compiler, a specification language for tax and social benefits + computation rules. Copyright (C) 2020 Inria, contributors: Denis Merigoux + , Emile Rolley + + Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + in compliance with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software distributed under the License + is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + or implied. See the License for the specific language governing permissions and limitations under + the License. *) + +(* Defining the lexer macros for English *) + +(* Tokens and their corresponding sedlex regexps *) + +#define MS_SCOPE "scope" +#define MS_CONSEQUENCE "consequence" +#define MS_DATA "data" +#define MS_DEPENDS "depends on" +#define MR_DEPENDS "depends", space_plus, "on" +#define MS_DECLARATION "declaration" +#define MS_CONTEXT "context" +#define MS_DECREASING "decreasing" +#define MS_INCREASING "increasing" +#define MS_OF "of" +#define MS_COLLECTION "collection" +#define MS_ENUM "enumeration" +#define MS_INTEGER "integer" +#define MS_MONEY "money" +#define MS_TEXT "text" +#define MS_DECIMAL "decimal" +#define MS_DATE "date" +#define MS_DURATION "duration" +#define MS_BOOLEAN "boolean" +#define MS_SUM "sum" +#define MS_FILLED "fulfilled" +#define MS_DEFINITION "definition" +#define MS_LABEL "label" +#define MS_EXCEPTION "exception" +#define MS_DEFINED_AS "equals" +#define MS_MATCH "match" +#define MS_WILDCARD "anything" +#define MS_WITH "with pattern" +#define MR_WITH "with", space_plus, "pattern" +#define MS_UNDER_CONDITION "under condition" +#define MR_UNDER_CONDITION "under", space_plus, "condition" +#define MS_IF "if" +#define MS_THEN "then" +#define MS_ELSE "else" +#define MS_CONDITION "condition" +#define MS_CONTENT "content" +#define MS_STRUCT "structure" +#define MS_ASSERTION "assertion" +#define MS_VARIES "varies" +#define MS_WITH_V "with" +#define MS_FOR "for" +#define MS_ALL "all" +#define MS_WE_HAVE "we have" +#define MR_WE_HAVE "we", space_plus, "have" +#define MS_FIXED "fixed" +#define MS_BY "by" +#define MS_RULE "rule" +#define MS_EXISTS "exists" +#define MS_IN "in" +#define MS_SUCH "such" +#define MS_THAT "that" +#define MS_AND "and" +#define MS_OR "or" +#define MS_XOR "xor" +#define MS_NOT "not" +#define MS_MAXIMUM "maximum" +#define MS_MINIMUM "minimum" +#define MS_FILTER "filter" +#define MS_MAP "map" +#define MS_INIT "initial" +#define MS_CARDINAL "number" +#define MS_YEAR "year" +#define MS_MONTH "month" +#define MS_DAY "day" +#define MS_TRUE "true" +#define MS_FALSE "false" + +#define MR_MONEY_OP_SUFFIX '$' + +(* Builtins *) + +#define MS_IntToDec "integer_to_decimal" +#define MS_GetDay "get_day" +#define MS_GetMonth "get_month" +#define MS_GetYear "get_year" + +(* 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 -> \ + let s = Utf8.lexeme lexbuf in \ + let i = String.index s '.' in \ + AT_PAGE (int_of_string (String.trim (String.sub s i (String.length s - i)))) + +(* More complex cases *) + +#define MX_MONEY_AMOUNT \ + 0x24, Star hspace, digit, Star (digit | ','), Opt ('.', Rep (digit, 0 .. 2)) -> \ + let extract_parts = R.regexp "([0-9]([0-9,]*[0-9]|))(.([0-9]{0,2})|)" in \ + let full_str = Utf8.lexeme lexbuf in \ + let only_numbers_str = String.trim (String.sub full_str 1 (String.length full_str - 1)) in \ + let parts = R.get_substring (R.exec ~rex:extract_parts only_numbers_str) in \ + (* Integer literal*) \ + let units = parts 1 in \ + let remove_commas = R.regexp "," in \ + let units = \ + Runtime.integer_of_string (R.substitute ~rex:remove_commas ~subst:(fun _ -> "") units) \ + in \ + let cents = \ + try Runtime.integer_of_string (parts 4) with Not_found -> Runtime.integer_of_int 0 \ + in \ + L.update_acc lexbuf; \ + MONEY_AMOUNT (units, cents) + +#define MX_DECIMAL_LITERAL \ + Plus digit, '.', Star digit -> \ + let extract_code_title = R.regexp "([0-9]+)\\.([0-9]*)" in \ + let dec_parts = R.get_substring (R.exec ~rex:extract_code_title (Utf8.lexeme lexbuf)) in \ + (* Integer literal*) \ + L.update_acc lexbuf; \ + DECIMAL_LITERAL \ + (Runtime.integer_of_string (dec_parts 1), Runtime.integer_of_string (dec_parts 2)) diff --git a/compiler/surface/lexer_en.ml b/compiler/surface/lexer_en.ml deleted file mode 100644 index a508f4c9..00000000 --- a/compiler/surface/lexer_en.ml +++ /dev/null @@ -1,575 +0,0 @@ -(* This file is part of the Catala compiler, a specification language for tax and social benefits - computation rules. Copyright (C) 2020 Inria, contributors: Denis Merigoux - , Emile Rolley - - Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - in compliance with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software distributed under the License - is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - or implied. See the License for the specific language governing permissions and limitations under - the License. *) - -open Tokens -open Sedlexing -open Utils -module L = Lexer_common -module R = Re.Pcre - -(** Same as {!val: Surface.Lexer_common.token_list_language_agnostic}, but with tokens specialized - to English. *) -let token_list : (string * token) list = - [ - ("scope", SCOPE); - ("consequence", CONSEQUENCE); - ("data", DATA); - ("depends on", DEPENDS); - ("declaration", DECLARATION); - ("context", CONTEXT); - ("decreasing", DECREASING); - ("increasing", INCREASING); - ("of", OF); - ("collection", COLLECTION); - ("enumeration", ENUM); - ("integer", INTEGER); - ("money", MONEY); - ("text", TEXT); - ("decimal", DECIMAL); - ("date", DATE); - ("duration", DURATION); - ("boolean", BOOLEAN); - ("sum", SUM); - ("fulfilled", FILLED); - ("definition", DEFINITION); - ("label", LABEL); - ("exception", EXCEPTION); - ("equals", DEFINED_AS); - ("match", MATCH); - ("anything", WILDCARD); - ("with pattern", WITH); - ("under condition", UNDER_CONDITION); - ("if", IF); - ("then", THEN); - ("else", ELSE); - ("content", CONTENT); - ("structure", STRUCT); - ("assertion", ASSERTION); - ("varies", VARIES); - ("with", WITH_V); - ("for", FOR); - ("all", ALL); - ("we have", WE_HAVE); - ("fixed", FIXED); - ("by", BY); - ("rule", RULE); - ("exists", EXISTS); - ("such", SUCH); - ("that", THAT); - ("and", AND); - ("or", OR); - ("xor", XOR); - ("not", NOT); - ("maximum", MAXIMUM); - ("minimum", MINIMUM); - ("filter", FILTER); - ("map", MAP); - ("initial", INIT); - ("number", CARDINAL); - ("year", YEAR); - ("month", MONTH); - ("day", DAY); - ("true", TRUE); - ("false", FALSE); - ] - @ L.token_list_language_agnostic - -(** Localised builtin functions *) -let builtins : (string * Ast.builtin_expression) list = - [ - ("integer_to_decimal", IntToDec); - ("get_day", GetDay); - ("get_month", GetMonth); - ("get_year", GetYear); - ] - -(** Regexp matching any digit character. - - @note can not be used outside the current module (@see < - https://github.com/ocaml-community/sedlex#lexer-specifications >). *) -let digit = [%sedlex.regexp? '0' .. '9'] - -(** Regexp matching at least one space. *) -let space_plus = [%sedlex.regexp? Plus white_space] - -(** Regexp matching white space but not newlines *) -let hspace = [%sedlex.regexp? Sub (white_space, Chars "\n\r")] - -(** Main lexing function used in code blocks *) -let rec lex_code (lexbuf : lexbuf) : token = - let prev_lexeme = Utf8.lexeme lexbuf in - let prev_pos = lexing_positions lexbuf in - match%sedlex lexbuf with - | white_space -> - (* Whitespaces *) - L.update_acc lexbuf; - lex_code lexbuf - | '#', Star (Compl '\n'), '\n' -> - (* Comments *) - L.update_acc lexbuf; - lex_code lexbuf - | "```" -> - (* End of code section *) - L.context := Law; - END_CODE (Buffer.contents L.code_buffer) - | "scope" -> - L.update_acc lexbuf; - SCOPE - | "data" -> - L.update_acc lexbuf; - DATA - | "depends", space_plus, "on" -> - L.update_acc lexbuf; - DEPENDS - | "declaration" -> - L.update_acc lexbuf; - DECLARATION - | "context" -> - L.update_acc lexbuf; - CONTEXT - | "decreasing" -> - L.update_acc lexbuf; - DECREASING - | "increasing" -> - L.update_acc lexbuf; - INCREASING - | "of" -> - L.update_acc lexbuf; - OF - | "collection" -> - L.update_acc lexbuf; - COLLECTION - | "enumeration" -> - L.update_acc lexbuf; - ENUM - | "integer" -> - L.update_acc lexbuf; - INTEGER - | "money" -> - L.update_acc lexbuf; - MONEY - | "text" -> - L.update_acc lexbuf; - TEXT - | "decimal" -> - L.update_acc lexbuf; - DECIMAL - | "date" -> - L.update_acc lexbuf; - DATE - | "duration" -> - L.update_acc lexbuf; - DURATION - | "boolean" -> - L.update_acc lexbuf; - BOOLEAN - | "sum" -> - L.update_acc lexbuf; - SUM - | "fulfilled" -> - L.update_acc lexbuf; - FILLED - | "definition" -> - L.update_acc lexbuf; - DEFINITION - | "label" -> - L.update_acc lexbuf; - LABEL - | "exception" -> - L.update_acc lexbuf; - EXCEPTION - | "equals" -> - L.update_acc lexbuf; - DEFINED_AS - | "match" -> - L.update_acc lexbuf; - MATCH - | "with", space_plus, "pattern" -> - L.update_acc lexbuf; - WITH - | "anything" -> - L.update_acc lexbuf; - WILDCARD - | "under", space_plus, "condition" -> - L.update_acc lexbuf; - UNDER_CONDITION - | "if" -> - L.update_acc lexbuf; - IF - | "consequence" -> - L.update_acc lexbuf; - CONSEQUENCE - | "then" -> - L.update_acc lexbuf; - THEN - | "else" -> - L.update_acc lexbuf; - ELSE - | "condition" -> - L.update_acc lexbuf; - CONDITION - | "content" -> - L.update_acc lexbuf; - CONTENT - | "structure" -> - L.update_acc lexbuf; - STRUCT - | "assertion" -> - L.update_acc lexbuf; - ASSERTION - | "varies" -> - L.update_acc lexbuf; - VARIES - | "with" -> - L.update_acc lexbuf; - WITH_V - | "for" -> - L.update_acc lexbuf; - FOR - | "all" -> - L.update_acc lexbuf; - ALL - | "we", space_plus, "have" -> - L.update_acc lexbuf; - WE_HAVE - | "fixed" -> - L.update_acc lexbuf; - FIXED - | "by" -> - L.update_acc lexbuf; - BY - | "rule" -> - (* 0xE8 is è *) - L.update_acc lexbuf; - RULE - | "exists" -> - L.update_acc lexbuf; - EXISTS - | "in" -> - L.update_acc lexbuf; - IN - | "such" -> - L.update_acc lexbuf; - SUCH - | "that" -> - L.update_acc lexbuf; - THAT - | "and" -> - L.update_acc lexbuf; - AND - | "or" -> - L.update_acc lexbuf; - OR - | "xor" -> - L.update_acc lexbuf; - XOR - | "not" -> - L.update_acc lexbuf; - NOT - | "maximum" -> - L.update_acc lexbuf; - MAXIMUM - | "minimum" -> - L.update_acc lexbuf; - MINIMUM - | "filter" -> - L.update_acc lexbuf; - FILTER - | "map" -> - L.update_acc lexbuf; - MAP - | "initial" -> - L.update_acc lexbuf; - INIT - | "number" -> - L.update_acc lexbuf; - CARDINAL - | "true" -> - L.update_acc lexbuf; - TRUE - | "false" -> - L.update_acc lexbuf; - FALSE - | "year" -> - L.update_acc lexbuf; - YEAR - | "month" -> - L.update_acc lexbuf; - MONTH - | "day" -> - L.update_acc lexbuf; - DAY - | 0x24, Star hspace, digit, Star (digit | ','), Opt ('.', Rep (digit, 0 .. 2)) -> - let extract_parts = R.regexp "([0-9]([0-9,]*[0-9]|))(.([0-9]{0,2})|)" in - let full_str = Utf8.lexeme lexbuf in - let only_numbers_str = String.trim (String.sub full_str 1 (String.length full_str - 1)) in - let parts = R.get_substring (R.exec ~rex:extract_parts only_numbers_str) in - (* Integer literal*) - let units = parts 1 in - let remove_commas = R.regexp "," in - let units = - Runtime.integer_of_string (R.substitute ~rex:remove_commas ~subst:(fun _ -> "") units) - in - let cents = - try Runtime.integer_of_string (parts 4) with Not_found -> Runtime.integer_of_int 0 - in - L.update_acc lexbuf; - MONEY_AMOUNT (units, cents) - | Plus digit, '.', Star digit -> - let extract_code_title = R.regexp "([0-9]+)\\.([0-9]*)" in - let dec_parts = R.get_substring (R.exec ~rex:extract_code_title (Utf8.lexeme lexbuf)) in - (* Integer literal*) - L.update_acc lexbuf; - DECIMAL_LITERAL - (Runtime.integer_of_string (dec_parts 1), Runtime.integer_of_string (dec_parts 2)) - | "<=@" -> - L.update_acc lexbuf; - LESSER_EQUAL_DATE - | "<@" -> - L.update_acc lexbuf; - LESSER_DATE - | ">=@" -> - L.update_acc lexbuf; - GREATER_EQUAL_DATE - | ">@" -> - L.update_acc lexbuf; - GREATER_DATE - | "-@" -> - L.update_acc lexbuf; - MINUSDATE - | "+@" -> - L.update_acc lexbuf; - PLUSDATE - | "<=^" -> - L.update_acc lexbuf; - LESSER_EQUAL_DURATION - | "<^" -> - L.update_acc lexbuf; - LESSER_DURATION - | ">=^" -> - L.update_acc lexbuf; - GREATER_EQUAL_DURATION - | ">^" -> - L.update_acc lexbuf; - GREATER_DURATION - | "+^" -> - L.update_acc lexbuf; - PLUSDURATION - | "-^" -> - L.update_acc lexbuf; - MINUSDURATION - | "/^" -> - L.update_acc lexbuf; - DIVDURATION - | "<=", 0x24 -> - L.update_acc lexbuf; - LESSER_EQUAL_MONEY - | '<', 0x24 -> - L.update_acc lexbuf; - LESSER_MONEY - | ">=", 0x24 -> - L.update_acc lexbuf; - GREATER_EQUAL_MONEY - | '>', 0x24 -> - L.update_acc lexbuf; - GREATER_MONEY - | '+', 0x24 -> - L.update_acc lexbuf; - PLUSMONEY - | '-', 0x24 -> - L.update_acc lexbuf; - MINUSMONEY - | '*', 0x24 -> - L.update_acc lexbuf; - MULTMONEY - | '/', 0x24 -> - L.update_acc lexbuf; - DIVMONEY - | "<=." -> - L.update_acc lexbuf; - LESSER_EQUAL_DEC - | "<." -> - L.update_acc lexbuf; - LESSER_DEC - | ">=." -> - L.update_acc lexbuf; - GREATER_EQUAL_DEC - | ">." -> - L.update_acc lexbuf; - GREATER_DEC - | "+." -> - L.update_acc lexbuf; - PLUSDEC - | "-." -> - L.update_acc lexbuf; - MINUSDEC - | "*." -> - L.update_acc lexbuf; - MULTDEC - | "/." -> - L.update_acc lexbuf; - DIVDEC - | "<=" -> - L.update_acc lexbuf; - LESSER_EQUAL - | '<' -> - L.update_acc lexbuf; - LESSER - | ">=" -> - L.update_acc lexbuf; - GREATER_EQUAL - | '>' -> - L.update_acc lexbuf; - GREATER - | '+' -> - L.update_acc lexbuf; - PLUS - | '-' -> - L.update_acc lexbuf; - MINUS - | '*' -> - L.update_acc lexbuf; - MULT - | '/' -> - L.update_acc lexbuf; - DIV - | "!=" -> - L.update_acc lexbuf; - NOT_EQUAL - | '=' -> - L.update_acc lexbuf; - EQUAL - | '%' -> - L.update_acc lexbuf; - PERCENT - | '(' -> - L.update_acc lexbuf; - LPAREN - | ')' -> - L.update_acc lexbuf; - RPAREN - | '{' -> - L.update_acc lexbuf; - LBRACKET - | '}' -> - L.update_acc lexbuf; - RBRACKET - | '[' -> - L.update_acc lexbuf; - LSQUARE - | ']' -> - L.update_acc lexbuf; - RSQUARE - | '|' -> - L.update_acc lexbuf; - VERTICAL - | ':' -> - L.update_acc lexbuf; - COLON - | ';' -> - L.update_acc lexbuf; - SEMICOLON - | "--" -> - L.update_acc lexbuf; - ALT - | "++" -> - L.update_acc lexbuf; - CONCAT - | '.' -> - L.update_acc lexbuf; - DOT - | uppercase, Star (uppercase | lowercase | digit | '_' | '\'') -> - (* Name of constructor *) - L.update_acc lexbuf; - CONSTRUCTOR (Utf8.lexeme lexbuf) - | lowercase, Star (lowercase | uppercase | digit | '_' | '\'') -> - (* Name of variable *) - L.update_acc lexbuf; - IDENT (Utf8.lexeme lexbuf) - | Plus digit -> - (* Integer literal*) - L.update_acc lexbuf; - INT_LITERAL (Runtime.integer_of_string (Utf8.lexeme lexbuf)) - | _ -> L.raise_lexer_error (Pos.from_lpos prev_pos) prev_lexeme - -let rec lex_directive_args (lexbuf : lexbuf) : token = - let prev_lexeme = Utf8.lexeme lexbuf in - let prev_pos = lexing_positions lexbuf in - match%sedlex lexbuf with - | '@', Star hspace, "p.", Star hspace, Plus digit -> - let s = Utf8.lexeme lexbuf in - let i = String.index s '.' in - AT_PAGE (int_of_string (String.trim (String.sub s i (String.length s - i)))) - | Plus (Compl white_space) -> DIRECTIVE_ARG (Utf8.lexeme lexbuf) - | Plus hspace -> lex_directive_args lexbuf - | '\n' | eof -> - L.context := Law; - END_DIRECTIVE - | _ -> L.raise_lexer_error (Pos.from_lpos prev_pos) prev_lexeme - -let rec lex_directive (lexbuf : lexbuf) : token = - let prev_lexeme = Utf8.lexeme lexbuf in - let prev_pos = lexing_positions lexbuf in - match%sedlex lexbuf with - | Plus hspace -> lex_directive lexbuf - | "Begin", Plus hspace, "metadata" -> BEGIN_METADATA - | "End", Plus hspace, "metadata" -> END_METADATA - | "Include" -> LAW_INCLUDE - | ":" -> - L.context := Directive_args; - COLON - | '\n' | eof -> - L.context := Law; - END_DIRECTIVE - | _ -> L.raise_lexer_error (Pos.from_lpos prev_pos) prev_lexeme - -(** Main lexing function used outside code blocks *) -let lex_law (lexbuf : lexbuf) : token = - let prev_lexeme = Utf8.lexeme lexbuf in - let ((_, start_pos) as prev_pos) = lexing_positions lexbuf in - let at_bol = Lexing.(start_pos.pos_bol = start_pos.pos_cnum) in - if at_bol then - match%sedlex lexbuf with - | eof -> EOF - | "```catala", Plus white_space -> - L.context := Code; - Buffer.clear L.code_buffer; - BEGIN_CODE - | '>' -> - L.context := Directive; - BEGIN_DIRECTIVE - | Plus '#', Star hspace, Plus (Compl '\n'), Star hspace, ('\n' | eof) -> - L.get_law_heading lexbuf - | _ -> ( - (* Nested match for lower priority; `_` matches length 0 so we effectively retry the - sub-match at the same point *) - let lexbuf = lexbuf in - (* workaround sedlex bug, see https://github.com/ocaml-community/sedlex/issues/12 *) - match%sedlex lexbuf with - | Star (Compl '\n'), ('\n' | eof) -> LAW_TEXT (Utf8.lexeme lexbuf) - | _ -> L.raise_lexer_error (Pos.from_lpos prev_pos) prev_lexeme) - else - match%sedlex lexbuf with - | eof -> EOF - | Star (Compl '\n'), ('\n' | eof) -> LAW_TEXT (Utf8.lexeme lexbuf) - | _ -> L.raise_lexer_error (Pos.from_lpos prev_pos) prev_lexeme - -(** Entry point of the lexer, distributes to {!val: lex_code} or {!val: lex_law} depending of {!val: - Surface.Lexer_common.is_code}. *) -let lexer (lexbuf : lexbuf) : token = - match !L.context with - | Law -> lex_law lexbuf - | Code -> lex_code lexbuf - | Directive -> lex_directive lexbuf - | Directive_args -> lex_directive_args lexbuf diff --git a/compiler/surface/lexer_fr.cppo.ml b/compiler/surface/lexer_fr.cppo.ml new file mode 100644 index 00000000..4494f6b6 --- /dev/null +++ b/compiler/surface/lexer_fr.cppo.ml @@ -0,0 +1,141 @@ +(* -*- coding: iso-latin-1 -*- *) + +(* This file is part of the Catala compiler, a specification language for tax and social benefits + computation rules. Copyright (C) 2020 Inria, contributors: Denis Merigoux + , Emile Rolley + + Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + in compliance with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software distributed under the License + is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + or implied. See the License for the specific language governing permissions and limitations under + the License. *) + +(* WARNING: this file must be saved as Latin-1 and not utf8, sedlex requires it *) + +(* Defining the lexer macros for French *) + + +(* Tokens and their corresponding sedlex regexps *) + +#define MS_SCOPE "champ d'application" +#define MR_SCOPE "champ", space_plus, "d'application" +#define MS_CONSEQUENCE "conséquence" +#define MS_DATA "donnée" +#define MS_DEPENDS "dépend de" +#define MR_DEPENDS "dépend", space_plus, "de" +#define MS_DECLARATION "déclaration" +#define MS_CONTEXT "contexte" +#define MS_DECREASING "décroissant" +#define MS_INCREASING "croissant" +#define MS_OF "de" +#define MS_COLLECTION "collection" +#define MS_ENUM "énumération" +#define MS_INTEGER "entier" +#define MS_MONEY "argent" +#define MS_TEXT "texte" +#define MS_DECIMAL "décimal" +#define MS_DATE "date" +#define MS_DURATION "durée" +#define MS_BOOLEAN "booléen" +#define MS_SUM "somme" +#define MS_FILLED "rempli" +#define MS_DEFINITION "définition" +#define MS_LABEL "étiquette" +#define MS_EXCEPTION "exception" +#define MS_DEFINED_AS "égal à" +#define MR_DEFINED_AS "égal", space_plus, "à" +#define MS_MATCH "selon" +#define MS_WILDCARD "n'importe quel" +#define MR_WILDCARD "n'importe", space_plus, "quel" +#define MS_WITH "sous forme" +#define MR_WITH "sous", space_plus, "forme" +#define MS_UNDER_CONDITION "sous condition" +#define MR_UNDER_CONDITION "sous", space_plus, "condition" +#define MS_IF "si" +#define MS_THEN "alors" +#define MS_ELSE "sinon" +#define MS_CONDITION "condition" +#define MS_CONTENT "contenu" +#define MS_STRUCT "structure" +#define MS_ASSERTION "assertion" +#define MS_VARIES "varie" +#define MS_WITH_V "avec" +#define MS_FOR "pour" +#define MS_ALL "tout" +#define MS_WE_HAVE "on a" +#define MR_WE_HAVE "on", space_plus, "a" +#define MS_FIXED "fixé" +#define MS_BY "par" +#define MS_RULE "règle" +#define MS_EXISTS "existe" +#define MS_IN "dans" +#define MS_SUCH "tel" +#define MS_THAT "que" +#define MS_AND "et" +#define MS_OR "ou" +#define MS_XOR "ou bien" +#define MR_XOR "ou", space_plus, "bien" +#define MS_NOT "non" +#define MS_MAXIMUM "maximum" +#define MS_MINIMUM "minimum" +#define MS_FILTER "filtre" +#define MS_MAP "application" +#define MS_INIT "initial" +#define MS_CARDINAL "nombre" +#define MS_YEAR "an" +#define MS_MONTH "mois" +#define MS_DAY "jour" +#define MS_TRUE "vrai" +#define MS_FALSE "faux" + +#define MR_MONEY_OP_SUFFIX 0x20AC (* The euro sign *) + +(* Builtins *) + +#define MS_IntToDec "entier_vers_décimal" +#define MS_GetDay "accès_jour" +#define MS_GetMonth "accès_mois" +#define MS_GetYear "accès_année" + +(* 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 -> \ + let s = Utf8.lexeme lexbuf in \ + let i = String.index s '.' in \ + AT_PAGE (int_of_string (String.trim (String.sub s i (String.length s - i)))) + +(* More complex cases *) + +#define MX_MONEY_AMOUNT \ + digit, Star (digit | hspace), Opt (',', Rep (digit, 0 .. 2)), Star hspace, 0x20AC -> \ + let extract_parts = R.regexp "([0-9]([0-9 ]*[0-9]|))(,([0-9]{0,2})|)" in \ + let str = Utf8.lexeme lexbuf in \ + let parts = R.get_substring (R.exec ~rex:extract_parts str) in \ + (* Integer literal*) \ + let units = parts 1 in \ + let remove_spaces = R.regexp " " in \ + let units = \ + Runtime.integer_of_string (R.substitute ~rex:remove_spaces ~subst:(fun _ -> "") units) \ + in \ + let cents = \ + try Runtime.integer_of_string (parts 4) with Not_found -> Runtime.integer_of_int 0 \ + in \ + L.update_acc lexbuf; \ + MONEY_AMOUNT (units, cents) + +#define MX_DECIMAL_LITERAL \ + Plus digit, ',', Star digit -> \ + let extract_code_title = R.regexp "([0-9]+),([0-9]*)" in \ + let dec_parts = R.get_substring (R.exec ~rex:extract_code_title (Utf8.lexeme lexbuf)) in \ + (* Integer literal*) \ + L.update_acc lexbuf; \ + DECIMAL_LITERAL \ + (Runtime.integer_of_string (dec_parts 1), Runtime.integer_of_string (dec_parts 2)) diff --git a/compiler/surface/lexer_fr.ml b/compiler/surface/lexer_fr.ml deleted file mode 100644 index c7e059ac..00000000 --- a/compiler/surface/lexer_fr.ml +++ /dev/null @@ -1,580 +0,0 @@ -(* This file is part of the Catala compiler, a specification language for tax and social benefits - computation rules. Copyright (C) 2020 Inria, contributors: Denis Merigoux - , Emile Rolley - - Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - in compliance with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software distributed under the License - is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - or implied. See the License for the specific language governing permissions and limitations under - the License. *) - -open Tokens -open Sedlexing -open Utils -module L = Lexer_common -module R = Re.Pcre - -(** Same as {!val: Surface.Lexer_common.token_list_language_agnostic}, but with tokens specialized - to French. *) -let token_list : (string * token) list = - [ - ("champ d'application", SCOPE); - ("conséquence", CONSEQUENCE); - ("donnée", DATA); - ("dépend de", DEPENDS); - ("déclaration", DECLARATION); - ("contexte", CONTEXT); - ("décroissant", DECREASING); - ("croissant", INCREASING); - ("de", OF); - ("collection", COLLECTION); - ("énumération", ENUM); - ("entier", INTEGER); - ("argent", MONEY); - ("texte", TEXT); - ("decimal", DECIMAL); - ("date", DATE); - ("durée", DURATION); - ("booléen", BOOLEAN); - ("somme", SUM); - ("rempli", FILLED); - ("définition", DEFINITION); - ("étiquette", LABEL); - ("exception", EXCEPTION); - ("égal à", DEFINED_AS); - ("selon", MATCH); - ("sous forme", WITH); - ("n'importe quel", WILDCARD); - ("sous condition", UNDER_CONDITION); - ("si", IF); - ("alors", THEN); - ("sinon", ELSE); - ("contenu", CONTENT); - ("structure", STRUCT); - ("assertion", ASSERTION); - ("varie", VARIES); - ("avec", WITH_V); - ("pour", FOR); - ("tout", ALL); - ("on a", WE_HAVE); - ("fixé", FIXED); - ("par", BY); - ("règle", RULE); - ("existe", EXISTS); - ("tel", SUCH); - ("que", THAT); - ("et", AND); - ("ou", OR); - ("ou bien", XOR); - ("non", NOT); - ("maximum", MAXIMUM); - ("minimum", MINIMUM); - ("filtre", FILTER); - ("application", MAP); - ("initial", INIT); - ("nombre", CARDINAL); - ("an", YEAR); - ("mois", MONTH); - ("jour", DAY); - ("vrai", TRUE); - ("faux", FALSE); - ] - @ L.token_list_language_agnostic - -(** Localised builtin functions *) -let builtins : (string * Ast.builtin_expression) list = - [ - ("entier_vers_décimal", Ast.IntToDec); - ("accès_jour", Ast.GetDay); - ("accès_mois", Ast.GetMonth); - ("accès_année", Ast.GetYear); - ] - -(** Regexp matching any digit character. - - @note can not be used outside the current module (@see < - https://github.com/ocaml-community/sedlex#lexer-specifications >). *) -let digit = [%sedlex.regexp? '0' .. '9'] - -(** Regexp matching at least one space. *) -let space_plus = [%sedlex.regexp? Plus white_space] - -(** Regexp matching white space but not newlines *) -let hspace = [%sedlex.regexp? Sub (white_space, Chars "\n\r")] - -(** Main lexing function used in code blocks *) -let rec lex_code (lexbuf : lexbuf) : token = - let prev_lexeme = Utf8.lexeme lexbuf in - let prev_pos = lexing_positions lexbuf in - match%sedlex lexbuf with - | white_space -> - (* Whitespaces *) - L.update_acc lexbuf; - lex_code lexbuf - | '#', Star (Compl '\n'), '\n' -> - (* Comments *) - L.update_acc lexbuf; - lex_code lexbuf - | "```" -> - (* End of code section *) - L.context := Law; - END_CODE (Buffer.contents L.code_buffer) - | "champ", space_plus, "d\'application" -> - L.update_acc lexbuf; - SCOPE - | "donn", 0xE9, "e" -> - (* 0xE9 is é *) - L.update_acc lexbuf; - DATA - | "d", 0xE9, "pend", space_plus, "de" -> - L.update_acc lexbuf; - DEPENDS - | "d", 0xE9, "claration" -> - L.update_acc lexbuf; - DECLARATION - | "contexte" -> - L.update_acc lexbuf; - CONTEXT - | "d", 0xE9, "croissant" -> - L.update_acc lexbuf; - DECREASING - | "croissant" -> - L.update_acc lexbuf; - INCREASING - | "de" -> - L.update_acc lexbuf; - OF - | "collection" -> - L.update_acc lexbuf; - COLLECTION - | 0xE9, "num", 0xE9, "ration" -> - L.update_acc lexbuf; - ENUM - | "entier" -> - L.update_acc lexbuf; - INTEGER - | "argent" -> - L.update_acc lexbuf; - MONEY - | "texte" -> - L.update_acc lexbuf; - TEXT - | "d", 0xE9, "cimal" -> - L.update_acc lexbuf; - DECIMAL - | "date" -> - L.update_acc lexbuf; - DATE - | "dur", 0xE9, "e" -> - L.update_acc lexbuf; - DURATION - | "bool", 0xE9, "en" -> - L.update_acc lexbuf; - BOOLEAN - | "somme" -> - L.update_acc lexbuf; - SUM - | "rempli" -> - L.update_acc lexbuf; - FILLED - | "d", 0xE9, "finition" -> - (* 0xE9 is é *) - L.update_acc lexbuf; - DEFINITION - | 0xE9, "tiquette" -> - L.update_acc lexbuf; - LABEL - | "exception" -> - L.update_acc lexbuf; - EXCEPTION - | 0xE9, "gal ", 0x00E0 -> - (* 0xE9 is é *) - L.update_acc lexbuf; - DEFINED_AS - | "selon" -> - L.update_acc lexbuf; - MATCH - | "sous", space_plus, "forme" -> - L.update_acc lexbuf; - WITH - | "n'importe", space_plus, "quel" -> - L.update_acc lexbuf; - WILDCARD - | "sous", space_plus, "condition" -> - L.update_acc lexbuf; - UNDER_CONDITION - | "si" -> - L.update_acc lexbuf; - IF - | "cons", 0xE9, "quence" -> - (* 0xE9 is é *) - L.update_acc lexbuf; - CONSEQUENCE - | "alors" -> - (* 0xE9 is é *) - L.update_acc lexbuf; - THEN - | "sinon" -> - L.update_acc lexbuf; - ELSE - | "condition" -> - L.update_acc lexbuf; - CONDITION - | "contenu" -> - L.update_acc lexbuf; - CONTENT - | "structure" -> - L.update_acc lexbuf; - STRUCT - | "assertion" -> - L.update_acc lexbuf; - ASSERTION - | "varie" -> - L.update_acc lexbuf; - VARIES - | "avec" -> - L.update_acc lexbuf; - WITH_V - | "pour" -> - L.update_acc lexbuf; - FOR - | "tout" -> - L.update_acc lexbuf; - ALL - | "on", space_plus, "a" -> - L.update_acc lexbuf; - WE_HAVE - | "fix", 0xE9 -> - (* 0xE9 is é *) - L.update_acc lexbuf; - FIXED - | "par" -> - L.update_acc lexbuf; - BY - | "r", 0xE8, "gle" -> - (* 0xE8 is è *) - L.update_acc lexbuf; - RULE - | "existe" -> - L.update_acc lexbuf; - EXISTS - | "dans" -> - L.update_acc lexbuf; - IN - | "tel" -> - L.update_acc lexbuf; - SUCH - | "que" -> - L.update_acc lexbuf; - THAT - | "et" -> - L.update_acc lexbuf; - AND - | "ou" -> - L.update_acc lexbuf; - OR - | "ou", space_plus, "bien" -> - L.update_acc lexbuf; - XOR - | "non" -> - L.update_acc lexbuf; - NOT - | "maximum" -> - L.update_acc lexbuf; - MAXIMUM - | "minimum" -> - L.update_acc lexbuf; - MINIMUM - | "filtre" -> - L.update_acc lexbuf; - FILTER - | "application" -> - L.update_acc lexbuf; - MAP - | "initial" -> - L.update_acc lexbuf; - INIT - | "nombre" -> - L.update_acc lexbuf; - CARDINAL - | "vrai" -> - L.update_acc lexbuf; - TRUE - | "faux" -> - L.update_acc lexbuf; - FALSE - | "an" -> - L.update_acc lexbuf; - YEAR - | "mois" -> - L.update_acc lexbuf; - MONTH - | "jour" -> - L.update_acc lexbuf; - DAY - | digit, Star (digit | hspace), Opt (',', Rep (digit, 0 .. 2)), Star hspace, 0x20AC -> - let extract_parts = R.regexp "([0-9]([0-9 ]*[0-9]|))(,([0-9]{0,2})|)" in - let str = Utf8.lexeme lexbuf in - let parts = R.get_substring (R.exec ~rex:extract_parts str) in - (* Integer literal*) - let units = parts 1 in - let remove_spaces = R.regexp " " in - let units = - Runtime.integer_of_string (R.substitute ~rex:remove_spaces ~subst:(fun _ -> "") units) - in - let cents = - try Runtime.integer_of_string (parts 4) with Not_found -> Runtime.integer_of_int 0 - in - L.update_acc lexbuf; - MONEY_AMOUNT (units, cents) - | Plus digit, ',', Star digit -> - let extract_code_title = R.regexp "([0-9]+),([0-9]*)" in - let dec_parts = R.get_substring (R.exec ~rex:extract_code_title (Utf8.lexeme lexbuf)) in - (* Integer literal*) - L.update_acc lexbuf; - DECIMAL_LITERAL - (Runtime.integer_of_string (dec_parts 1), Runtime.integer_of_string (dec_parts 2)) - | "<=@" -> - L.update_acc lexbuf; - LESSER_EQUAL_DATE - | "<@" -> - L.update_acc lexbuf; - LESSER_DATE - | ">=@" -> - L.update_acc lexbuf; - GREATER_EQUAL_DATE - | ">@" -> - L.update_acc lexbuf; - GREATER_DATE - | "-@" -> - L.update_acc lexbuf; - MINUSDATE - | "+@" -> - L.update_acc lexbuf; - PLUSDATE - | "<=^" -> - L.update_acc lexbuf; - LESSER_EQUAL_DURATION - | "<^" -> - L.update_acc lexbuf; - LESSER_DURATION - | ">=^" -> - L.update_acc lexbuf; - GREATER_EQUAL_DURATION - | ">^" -> - L.update_acc lexbuf; - GREATER_DURATION - | "+^" -> - L.update_acc lexbuf; - PLUSDURATION - | "-^" -> - L.update_acc lexbuf; - MINUSDURATION - | "/^" -> - L.update_acc lexbuf; - DIVDURATION - | "<=", 0x20AC -> - L.update_acc lexbuf; - LESSER_EQUAL_MONEY - | '<', 0x20AC -> - L.update_acc lexbuf; - LESSER_MONEY - | ">=", 0x20AC -> - L.update_acc lexbuf; - GREATER_EQUAL_MONEY - | '>', 0x20AC -> - L.update_acc lexbuf; - GREATER_MONEY - | '+', 0x20AC -> - L.update_acc lexbuf; - PLUSMONEY - | '-', 0x20AC -> - L.update_acc lexbuf; - MINUSMONEY - | '*', 0x20AC -> - L.update_acc lexbuf; - MULTMONEY - | '/', 0x20AC -> - L.update_acc lexbuf; - DIVMONEY - | "<=." -> - L.update_acc lexbuf; - LESSER_EQUAL_DEC - | "<." -> - L.update_acc lexbuf; - LESSER_DEC - | ">=." -> - L.update_acc lexbuf; - GREATER_EQUAL_DEC - | ">." -> - L.update_acc lexbuf; - GREATER_DEC - | "+." -> - L.update_acc lexbuf; - PLUSDEC - | "-." -> - L.update_acc lexbuf; - MINUSDEC - | "*." -> - L.update_acc lexbuf; - MULTDEC - | "/." -> - L.update_acc lexbuf; - DIVDEC - | "<=" -> - L.update_acc lexbuf; - LESSER_EQUAL - | '<' -> - L.update_acc lexbuf; - LESSER - | ">=" -> - L.update_acc lexbuf; - GREATER_EQUAL - | '>' -> - L.update_acc lexbuf; - GREATER - | '+' -> - L.update_acc lexbuf; - PLUS - | '-' -> - L.update_acc lexbuf; - MINUS - | '*' -> - L.update_acc lexbuf; - MULT - | '/' -> - L.update_acc lexbuf; - DIV - | "!=" -> - L.update_acc lexbuf; - NOT_EQUAL - | '=' -> - L.update_acc lexbuf; - EQUAL - | '%' -> - L.update_acc lexbuf; - PERCENT - | '(' -> - L.update_acc lexbuf; - LPAREN - | ')' -> - L.update_acc lexbuf; - RPAREN - | '{' -> - L.update_acc lexbuf; - LBRACKET - | '}' -> - L.update_acc lexbuf; - RBRACKET - | '[' -> - L.update_acc lexbuf; - LSQUARE - | ']' -> - L.update_acc lexbuf; - RSQUARE - | '|' -> - L.update_acc lexbuf; - VERTICAL - | ':' -> - L.update_acc lexbuf; - COLON - | ';' -> - L.update_acc lexbuf; - SEMICOLON - | "--" -> - L.update_acc lexbuf; - ALT - | "++" -> - L.update_acc lexbuf; - CONCAT - | '.' -> - L.update_acc lexbuf; - DOT - | uppercase, Star (uppercase | lowercase | digit | '_' | '\'') -> - (* Name of constructor *) - L.update_acc lexbuf; - CONSTRUCTOR (Utf8.lexeme lexbuf) - | lowercase, Star (lowercase | uppercase | digit | '_' | '\'') -> - (* Name of variable *) - L.update_acc lexbuf; - IDENT (Utf8.lexeme lexbuf) - | Plus digit -> - (* Integer literal*) - L.update_acc lexbuf; - INT_LITERAL (Runtime.integer_of_string (Utf8.lexeme lexbuf)) - | _ -> L.raise_lexer_error (Pos.from_lpos prev_pos) prev_lexeme - -let rec lex_directive_args (lexbuf : lexbuf) : token = - let prev_lexeme = Utf8.lexeme lexbuf in - let prev_pos = lexing_positions lexbuf in - match%sedlex lexbuf with - | '@', Star hspace, "p.", Star hspace, Plus digit -> - let s = Utf8.lexeme lexbuf in - let i = String.index s '.' in - AT_PAGE (int_of_string (String.trim (String.sub s i (String.length s - i)))) - | Plus (Compl white_space) -> DIRECTIVE_ARG (Utf8.lexeme lexbuf) - | Plus hspace -> lex_directive_args lexbuf - | '\n' | eof -> - L.context := Law; - END_DIRECTIVE - | _ -> L.raise_lexer_error (Pos.from_lpos prev_pos) prev_lexeme - -let rec lex_directive (lexbuf : lexbuf) : token = - let prev_lexeme = Utf8.lexeme lexbuf in - let prev_pos = lexing_positions lexbuf in - match%sedlex lexbuf with - | Plus hspace -> lex_directive lexbuf - | 'D', 0xE9, "but", Plus hspace, "m", 0xE9, "tadonn", 0xE9, "es" -> BEGIN_METADATA - | "Fin", Plus hspace, "m", 0xE9, "tadonn", 0xE9, "es" -> END_METADATA - | "Inclusion" -> LAW_INCLUDE - | ':' -> - L.context := Directive_args; - COLON - | '\n' | eof -> - L.context := Law; - END_DIRECTIVE - | _ -> L.raise_lexer_error (Pos.from_lpos prev_pos) prev_lexeme - -(** Main lexing function used outside code blocks *) -let lex_law (lexbuf : lexbuf) : token = - let prev_lexeme = Utf8.lexeme lexbuf in - let ((_, start_pos) as prev_pos) = lexing_positions lexbuf in - let at_bol = Lexing.(start_pos.pos_bol = start_pos.pos_cnum) in - if at_bol then - match%sedlex lexbuf with - | eof -> EOF - | "```catala", Plus white_space -> - L.context := Code; - Buffer.clear L.code_buffer; - BEGIN_CODE - | '>' -> - L.context := Directive; - BEGIN_DIRECTIVE - | Plus '#', Star hspace, Plus (Compl '\n'), Star hspace, ('\n' | eof) -> - L.get_law_heading lexbuf - | _ -> ( - (* Nested match for lower priority; `_` matches length 0 so we effectively retry the - sub-match at the same point *) - let lexbuf = lexbuf in - (* workaround sedlex bug, see https://github.com/ocaml-community/sedlex/issues/12 *) - match%sedlex lexbuf with - | Star (Compl '\n'), ('\n' | eof) -> LAW_TEXT (Utf8.lexeme lexbuf) - | _ -> L.raise_lexer_error (Pos.from_lpos prev_pos) prev_lexeme) - else - match%sedlex lexbuf with - | eof -> EOF - | Star (Compl '\n'), ('\n' | eof) -> LAW_TEXT (Utf8.lexeme lexbuf) - | _ -> L.raise_lexer_error (Pos.from_lpos prev_pos) prev_lexeme - -(** Entry point of the lexer, distributes to {!val: lex_code} or {!val: lex_law} depending of {!val: - Surface.Lexer_common.is_code}. *) -let lexer (lexbuf : lexbuf) : token = - match !L.context with - | Law -> lex_law lexbuf - | Code -> lex_code lexbuf - | Directive -> lex_directive lexbuf - | Directive_args -> lex_directive_args lexbuf diff --git a/compiler/surface/lexer_pl.cppo.ml b/compiler/surface/lexer_pl.cppo.ml new file mode 100644 index 00000000..ffe1540d --- /dev/null +++ b/compiler/surface/lexer_pl.cppo.ml @@ -0,0 +1,139 @@ +(* -*- coding: iso-latin-1 -*- *) + +(* This file is part of the Catala compiler, a specification language for tax and social benefits + computation rules. Copyright (C) 2020 Inria, contributors: Denis Merigoux + , Emile Rolley + + Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + in compliance with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software distributed under the License + is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + or implied. See the License for the specific language governing permissions and limitations under + the License. *) + +(* Defining the lexer macros for Polish *) + +(* Tokens and their corresponding sedlex regexps *) + +#define MS_SCOPE "zakres" +#define MS_CONSEQUENCE "konsekwencja" +#define MS_DATA "data" +#define MS_DEPENDS "zalezy od" +#define MR_DEPENDS "zalezy", space_plus, "od" +#define MS_DECLARATION "deklaracja" +#define MS_CONTEXT "kontekst" +#define MS_DECREASING "malejacy" +#define MS_INCREASING "rosnacy" +#define MS_OF "z" +#define MS_COLLECTION "kolekcja" +#define MS_ENUM "enumeracja" +#define MS_INTEGER "calkowita" +#define MS_MONEY "pieni\x01\x05dze" +#define MR_MONEY "pieni", 0x0105, "dze" +#define MS_TEXT "tekst" +#define MS_DECIMAL "dziesi\x01\x19tny" +#define MR_DECIMAL "dziesi", 0x0119, "tny" +#define MS_DATE "czas" +#define MS_DURATION "czas trwania" +#define MR_DURATION "czas", space_plus, "trwania" +#define MS_BOOLEAN "zerojedynkowy" +#define MS_SUM "suma" +#define MS_FILLED "spelnione" +#define MS_DEFINITION "definicja" +#define MS_LABEL "etykieta" +#define MS_EXCEPTION "wyj\x01\x05tek" +#define MR_EXCEPTION "wyj", 0x0105, "tek" +#define MS_DEFINED_AS "wynosi" +#define MS_MATCH "pasuje" +#define MS_WILDCARD "cokolwiek" +#define MS_WITH "ze wzorem" +#define MR_WITH "ze", space_plus, "wzorem" +#define MS_UNDER_CONDITION "pod warunkiem" +#define MR_UNDER_CONDITION "pod", space_plus, "warunkiem" +#define MS_IF "jezeli" +#define MS_THEN "wtedy" +#define MS_ELSE "inaczej" +#define MS_CONDITION "warunek" +#define MS_CONTENT "typu" +#define MS_STRUCT "struktura" +#define MS_ASSERTION "asercja" +#define MS_VARIES "rozna" +#define MS_WITH_V "wraz z" +#define MR_WITH_V "wraz", space_plus, "z" +#define MS_FOR "dla" +#define MS_ALL "wszystkie" +#define MS_WE_HAVE "mamy" +#define MS_FIXED "staloprzecinkowa" +#define MS_BY "przez" +#define MS_RULE "zasada" +#define MS_EXISTS "istnieje" +#define MS_IN "in" +#define MS_SUCH "takie ze" +#define MR_SUCH "takie", space_plus, "ze" +#define MS_THAT "to" +#define MS_AND "i" +#define MS_OR "lub" +#define MS_XOR "xor" +#define MS_NOT "nie" +#define MS_MAXIMUM "maximum" +#define MS_MINIMUM "minimum" +#define MS_FILTER "filtr" +#define MS_MAP "mapuj" +#define MS_INIT "poczatkowy" +#define MS_CARDINAL "liczba" +#define MS_YEAR "rok" +#define MS_MONTH "miesiac" +#define MS_DAY "dzien" +#define MS_TRUE "prawda" +#define MS_FALSE "falsz" + +#define MR_MONEY_OP_SUFFIX '$' + +(* Builtins *) + +#define MS_IntToDec "integer_to_decimal" +#define MS_GetDay "get_day" +#define MS_GetMonth "get_month" +#define MS_GetYear "get_year" + +(* 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 -> \ + let s = Utf8.lexeme lexbuf in \ + let i = String.index s '.' in \ + AT_PAGE (int_of_string (String.trim (String.sub s i (String.length s - i)))) + +(* More complex cases *) + +#define MX_MONEY_AMOUNT \ + digit, Star (digit | ','), Opt ('.', Rep (digit, 0 .. 2)), Star hspace, "PLN" -> \ + let extract_parts = R.regexp "([0-9]([0-9,]*[0-9]|))(.([0-9]{0,2})|)" in \ + let str = Utf8.lexeme lexbuf in \ + let parts = R.get_substring (R.exec ~rex:extract_parts str) in \ + (* Integer literal*) \ + let units = parts 1 in \ + let remove_commas = R.regexp "," in \ + let units = \ + Runtime.integer_of_string (R.substitute ~rex:remove_commas ~subst:(fun _ -> "") units) \ + in \ + let cents = \ + try Runtime.integer_of_string (parts 4) with Not_found -> Runtime.integer_of_int 0 \ + in \ + L.update_acc lexbuf; \ + MONEY_AMOUNT (units, cents) + +#define MX_DECIMAL_LITERAL \ + Plus digit, '.', Star digit -> \ + let extract_code_title = R.regexp "([0-9]+)\\.([0-9]*)" in \ + let dec_parts = R.get_substring (R.exec ~rex:extract_code_title (Utf8.lexeme lexbuf)) in \ + (* Integer literal*) \ + L.update_acc lexbuf; \ + DECIMAL_LITERAL \ + (Runtime.integer_of_string (dec_parts 1), Runtime.integer_of_string (dec_parts 2)) diff --git a/compiler/surface/parser.messages b/compiler/surface/parser.messages index f05b2b89..7c02591d 100644 --- a/compiler/surface/parser.messages +++ b/compiler/surface/parser.messages @@ -786,7 +786,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION CARDINAL YEAR ## Ends in an error in state: 97. ## ## aggregate_func -> CARDINAL . [ FOR ] -## primitive_expression -> CARDINAL . [ XOR WITH THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## primitive_expression -> CARDINAL . [ XOR WITH THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## CARDINAL @@ -798,8 +798,8 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION CONSTRUCTOR CONTENT TR ## ## Ends in an error in state: 189. ## -## enum_inject_content -> CONTENT small_expression . [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] -## small_expression -> small_expression . DOT option(terminated(constructor,DOT)) ident [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## enum_inject_content -> CONTENT small_expression . [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] +## small_expression -> small_expression . DOT option(terminated(constructor,DOT)) ident [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## CONTENT small_expression @@ -811,7 +811,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION CONSTRUCTOR CONTENT YE ## ## Ends in an error in state: 188. ## -## enum_inject_content -> CONTENT . small_expression [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## enum_inject_content -> CONTENT . small_expression [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## CONTENT @@ -823,7 +823,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION CONSTRUCTOR DOT CONSTR ## ## Ends in an error in state: 187. ## -## struct_or_enum_inject -> constructor option(preceded(DOT,constructor)) . option(enum_inject_content) [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## struct_or_enum_inject -> constructor option(preceded(DOT,constructor)) . option(enum_inject_content) [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## constructor option(preceded(DOT,constructor)) @@ -835,7 +835,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION CONSTRUCTOR DOT YEAR ## ## Ends in an error in state: 107. ## -## option(preceded(DOT,constructor)) -> DOT . constructor [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONTENT CONSTRUCTOR CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## option(preceded(DOT,constructor)) -> DOT . constructor [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONTENT CONSTRUCTOR CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## DOT @@ -908,7 +908,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION CONSTRUCTOR LBRACKET A ## ## Ends in an error in state: 91. ## -## struct_inject_content -> LBRACKET ALT . separated_nonempty_list(ALT,struct_content_field) RBRACKET [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## struct_inject_content -> LBRACKET ALT . separated_nonempty_list(ALT,struct_content_field) RBRACKET [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## LBRACKET ALT @@ -920,7 +920,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION CONSTRUCTOR LBRACKET Y ## ## Ends in an error in state: 90. ## -## struct_inject_content -> LBRACKET . ALT separated_nonempty_list(ALT,struct_content_field) RBRACKET [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## struct_inject_content -> LBRACKET . ALT separated_nonempty_list(ALT,struct_content_field) RBRACKET [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## LBRACKET @@ -932,8 +932,8 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION CONSTRUCTOR YEAR ## ## Ends in an error in state: 89. ## -## struct_or_enum_inject -> constructor . option(preceded(DOT,constructor)) option(enum_inject_content) [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] -## struct_or_enum_inject -> constructor . struct_inject_content [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## struct_or_enum_inject -> constructor . option(preceded(DOT,constructor)) option(enum_inject_content) [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] +## struct_or_enum_inject -> constructor . struct_inject_content [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## constructor @@ -1270,7 +1270,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION INT_LITERAL WITH_V ## ## Ends in an error in state: 81. ## -## literal -> num_literal . option(unit_literal) [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## literal -> num_literal . option(unit_literal) [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## num_literal @@ -1282,7 +1282,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION LPAREN TRUE THEN ## ## Ends in an error in state: 228. ## -## atomic_expression -> LPAREN expression . RPAREN [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## atomic_expression -> LPAREN expression . RPAREN [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## LPAREN expression @@ -1306,7 +1306,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION LPAREN YEAR ## ## Ends in an error in state: 54. ## -## atomic_expression -> LPAREN . expression RPAREN [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## atomic_expression -> LPAREN . expression RPAREN [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## LPAREN @@ -1355,7 +1355,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION LSQUARE YEAR ## ## Ends in an error in state: 50. ## -## primitive_expression -> LSQUARE . loption(separated_nonempty_list(SEMICOLON,expression)) RSQUARE [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## primitive_expression -> LSQUARE . loption(separated_nonempty_list(SEMICOLON,expression)) RSQUARE [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## LSQUARE @@ -1367,7 +1367,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION MAP FOR IDENT IN TRUE ## ## Ends in an error in state: 121. ## -## aggregate -> aggregate_func FOR ident IN primitive_expression OF . base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## aggregate -> aggregate_func FOR ident IN primitive_expression OF . base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## aggregate_func FOR ident IN primitive_expression OF @@ -1379,7 +1379,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION MAP FOR IDENT IN TRUE ## ## Ends in an error in state: 120. ## -## aggregate -> aggregate_func FOR ident IN primitive_expression . OF base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## aggregate -> aggregate_func FOR ident IN primitive_expression . OF base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## aggregate_func FOR ident IN primitive_expression @@ -1397,7 +1397,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION MAP FOR IDENT IN YEAR ## ## Ends in an error in state: 119. ## -## aggregate -> aggregate_func FOR ident IN . primitive_expression OF base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## aggregate -> aggregate_func FOR ident IN . primitive_expression OF base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## aggregate_func FOR ident IN @@ -1409,7 +1409,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION MAP FOR IDENT YEAR ## ## Ends in an error in state: 118. ## -## aggregate -> aggregate_func FOR ident . IN primitive_expression OF base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## aggregate -> aggregate_func FOR ident . IN primitive_expression OF base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## aggregate_func FOR ident @@ -1421,7 +1421,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION MAP FOR YEAR ## ## Ends in an error in state: 117. ## -## aggregate -> aggregate_func FOR . ident IN primitive_expression OF base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## aggregate -> aggregate_func FOR . ident IN primitive_expression OF base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## aggregate_func FOR @@ -1433,7 +1433,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION MAP YEAR ## ## Ends in an error in state: 116. ## -## aggregate -> aggregate_func . FOR ident IN primitive_expression OF base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## aggregate -> aggregate_func . FOR ident IN primitive_expression OF base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## aggregate_func @@ -1690,7 +1690,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION TRUE DOT CONSTRUCTOR D ## ## Ends in an error in state: 64. ## -## small_expression -> small_expression DOT option(terminated(constructor,DOT)) . ident [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## small_expression -> small_expression DOT option(terminated(constructor,DOT)) . ident [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## small_expression DOT option(terminated(constructor,DOT)) @@ -1714,7 +1714,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION TRUE DOT YEAR ## ## Ends in an error in state: 63. ## -## small_expression -> small_expression DOT . option(terminated(constructor,DOT)) ident [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## small_expression -> small_expression DOT . option(terminated(constructor,DOT)) ident [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## small_expression DOT @@ -1726,7 +1726,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION TRUE IN YEAR ## ## Ends in an error in state: 124. ## -## base_expression -> primitive_expression IN . base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## base_expression -> primitive_expression IN . base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## primitive_expression IN @@ -1738,8 +1738,8 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION TRUE INCREASING ## ## Ends in an error in state: 140. ## -## mult_expression -> base_expression . [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DEFINITION DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] -## mult_expression -> base_expression . mult_op mult_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DEFINITION DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## mult_expression -> base_expression . [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DEFINITION DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] +## mult_expression -> base_expression . mult_op mult_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DEFINITION DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## base_expression @@ -1758,7 +1758,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION TRUE MULTMONEY YEAR ## ## Ends in an error in state: 148. ## -## mult_expression -> base_expression mult_op . mult_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DEFINITION DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## mult_expression -> base_expression mult_op . mult_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DEFINITION DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## base_expression mult_op @@ -1782,7 +1782,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION TRUE OF YEAR ## ## Ends in an error in state: 113. ## -## base_expression -> primitive_expression OF . base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## base_expression -> primitive_expression OF . base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## primitive_expression OF @@ -1806,10 +1806,10 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION TRUE WE_HAVE ## ## Ends in an error in state: 100. ## -## base_expression -> primitive_expression . [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] -## base_expression -> primitive_expression . OF base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] -## base_expression -> primitive_expression . WITH constructor_binding [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] -## base_expression -> primitive_expression . IN base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## base_expression -> primitive_expression . [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] +## base_expression -> primitive_expression . OF base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] +## base_expression -> primitive_expression . WITH constructor_binding [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] +## base_expression -> primitive_expression . IN base_expression [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## primitive_expression @@ -1827,7 +1827,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION TRUE WITH CONSTRUCTOR ## ## Ends in an error in state: 102. ## -## constructor_binding -> maybe_qualified_constructor . optional_binding [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## constructor_binding -> maybe_qualified_constructor . optional_binding [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## maybe_qualified_constructor @@ -1846,7 +1846,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION TRUE WITH CONSTRUCTOR ## ## Ends in an error in state: 104. ## -## optional_binding -> OF maybe_qualified_constructor . constructor_binding [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## optional_binding -> OF maybe_qualified_constructor . constructor_binding [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## OF maybe_qualified_constructor @@ -1865,8 +1865,8 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION TRUE WITH CONSTRUCTOR ## ## Ends in an error in state: 103. ## -## optional_binding -> OF . ident [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] -## optional_binding -> OF . maybe_qualified_constructor constructor_binding [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## optional_binding -> OF . ident [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] +## optional_binding -> OF . maybe_qualified_constructor constructor_binding [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## OF @@ -1878,7 +1878,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION TRUE WITH CONSTRUCTOR ## ## Ends in an error in state: 106. ## -## maybe_qualified_constructor -> constructor . option(preceded(DOT,constructor)) [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSTRUCTOR CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## maybe_qualified_constructor -> constructor . option(preceded(DOT,constructor)) [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSTRUCTOR CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## constructor @@ -1890,7 +1890,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION TRUE WITH YEAR ## ## Ends in an error in state: 101. ## -## base_expression -> primitive_expression WITH . constructor_binding [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## base_expression -> primitive_expression WITH . constructor_binding [ XOR THEN SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## primitive_expression WITH @@ -1914,8 +1914,8 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION TRUE YEAR ## ## Ends in an error in state: 62. ## -## primitive_expression -> small_expression . [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] -## small_expression -> small_expression . DOT option(terminated(constructor,DOT)) ident [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## primitive_expression -> small_expression . [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] +## small_expression -> small_expression . DOT option(terminated(constructor,DOT)) ident [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## small_expression @@ -1927,7 +1927,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION VERTICAL INT_LITERAL M ## ## Ends in an error in state: 28. ## -## literal -> VERTICAL date_int MINUS date_int MINUS date_int . VERTICAL [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## literal -> VERTICAL date_int MINUS date_int MINUS date_int . VERTICAL [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## VERTICAL date_int MINUS date_int MINUS date_int @@ -1939,7 +1939,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION VERTICAL INT_LITERAL M ## ## Ends in an error in state: 27. ## -## literal -> VERTICAL date_int MINUS date_int MINUS . date_int VERTICAL [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## literal -> VERTICAL date_int MINUS date_int MINUS . date_int VERTICAL [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## VERTICAL date_int MINUS date_int MINUS @@ -1951,7 +1951,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION VERTICAL INT_LITERAL M ## ## Ends in an error in state: 26. ## -## literal -> VERTICAL date_int MINUS date_int . MINUS date_int VERTICAL [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## literal -> VERTICAL date_int MINUS date_int . MINUS date_int VERTICAL [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## VERTICAL date_int MINUS date_int @@ -1963,7 +1963,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION VERTICAL INT_LITERAL M ## ## Ends in an error in state: 25. ## -## literal -> VERTICAL date_int MINUS . date_int MINUS date_int VERTICAL [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## literal -> VERTICAL date_int MINUS . date_int MINUS date_int VERTICAL [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## VERTICAL date_int MINUS @@ -1975,7 +1975,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION VERTICAL INT_LITERAL Y ## ## Ends in an error in state: 24. ## -## literal -> VERTICAL date_int . MINUS date_int MINUS date_int VERTICAL [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## literal -> VERTICAL date_int . MINUS date_int MINUS date_int VERTICAL [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## VERTICAL date_int @@ -1987,7 +1987,7 @@ source_file: BEGIN_CODE SCOPE CONSTRUCTOR UNDER_CONDITION VERTICAL YEAR ## ## Ends in an error in state: 22. ## -## literal -> VERTICAL . date_int MINUS date_int MINUS date_int VERTICAL [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE CONCAT COLON ASSERTION AND ALT ] +## literal -> VERTICAL . date_int MINUS date_int MINUS date_int VERTICAL [ XOR WITH WE_HAVE THEN SUCH SEMICOLON SCOPE RULE RSQUARE RPAREN RBRACKET PLUSPLUS PLUSMONEY PLUSDURATION PLUSDEC PLUSDATE PLUS OR OF NOT_EQUAL MULTMONEY MULTDEC MULT MINUSMONEY MINUSDURATION MINUSDEC MINUSDATE MINUS LESSER_MONEY LESSER_EQUAL_MONEY LESSER_EQUAL_DURATION LESSER_EQUAL_DEC LESSER_EQUAL_DATE LESSER_EQUAL LESSER_DURATION LESSER_DEC LESSER_DATE LESSER LABEL INCREASING IN GREATER_MONEY GREATER_EQUAL_MONEY GREATER_EQUAL_DURATION GREATER_EQUAL_DEC GREATER_EQUAL_DATE GREATER_EQUAL GREATER_DURATION GREATER_DEC GREATER_DATE GREATER FOR EXCEPTION EQUAL END_CODE ELSE DOT DIVMONEY DIVDURATION DIVDEC DIV DEFINITION DECREASING DECLARATION CONSEQUENCE COLON ASSERTION AND ALT ] ## ## The known suffix of the stack is as follows: ## VERTICAL diff --git a/compiler/surface/parser.mly b/compiler/surface/parser.mly index f2748b8a..9137b275 100644 --- a/compiler/surface/parser.mly +++ b/compiler/surface/parser.mly @@ -22,7 +22,7 @@ %} %parameter Ast.builtin_expression option end> %type source_file @@ -67,7 +67,9 @@ qident: atomic_expression: | q = IDENT { - (try Builtin (List.assoc q Localisation.builtins) with Not_found -> Ident q), + (match Localisation.lex_builtin q with + | Some b -> Builtin b + | None -> Ident q), Pos.from_lpos $sloc } | l = literal { let (l, l_pos) = l in (Literal l, l_pos) } | LPAREN e = expression RPAREN { e } @@ -235,7 +237,7 @@ sum_op: | MINUSDEC { (Sub KDec, Pos.from_lpos $sloc) } | PLUS { (Add KInt, Pos.from_lpos $sloc) } | MINUS { (Sub KInt, Pos.from_lpos $sloc) } -| CONCAT { (Concat, Pos.from_lpos $sloc) } +| PLUSPLUS { (Concat, Pos.from_lpos $sloc) } sum_unop: | MINUS { (Minus KInt, Pos.from_lpos $sloc) } @@ -436,11 +438,13 @@ scope_item: ident: | i = IDENT { - if List.mem_assoc i Localisation.builtins then - Errors.raise_spanned_error - (Printf.sprintf "Reserved builtin name") - (Pos.from_lpos $sloc) - else (i, Pos.from_lpos $sloc) + match Localisation.lex_builtin i with + | Some _ -> + Errors.raise_spanned_error + (Printf.sprintf "Reserved builtin name") + (Pos.from_lpos $sloc) + | None -> + (i, Pos.from_lpos $sloc) } condition_pos: diff --git a/compiler/surface/tokens.mly b/compiler/surface/tokens.mly index cd359a0f..995a42b0 100644 --- a/compiler/surface/tokens.mly +++ b/compiler/surface/tokens.mly @@ -51,7 +51,7 @@ %token PLUSDEC MINUSDEC MULTDEC DIVDEC %token PLUSMONEY MINUSMONEY MULTMONEY DIVMONEY %token MINUSDATE PLUSDATE PLUSDURATION MINUSDURATION DIVDURATION -%token CONCAT +%token PLUSPLUS %token MATCH WITH VARIES WITH_V WILDCARD %token FOR ALL WE_HAVE INCREASING DECREASING %token NOT BOOLEAN PERCENT DURATION From 47526bb4bdafab59e071bf37d862d22c959a9608 Mon Sep 17 00:00:00 2001 From: Louis Gesbert Date: Thu, 19 Aug 2021 18:33:24 +0200 Subject: [PATCH 2/7] Update the 'add builtin' doc --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b8222ed2..b289b030 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -104,9 +104,9 @@ need more, here is how one can be added: for scope parameters, variables or structure fields, since it won't compile anymore. - Add an element to the `builtin_expression` type in `surface/ast.ml(i)` -- Add your builtin in the `builtins` list in `surface/lexer.ml`, and with proper - translations in all of the language-specific modules `surface/lexer_en.ml`, - `surface/lexer_fr.ml`, etc. +- Add your builtin in the `builtins` list in `surface/lexer.cppo.ml`, and with proper + translations in all of the language-specific modules `surface/lexer_en.cppo.ml`, + `surface/lexer_fr.cppo.ml`, etc. - The rest can all be done by following the type errors downstream: - Add a corresponding element to the lower-level AST in `dcalc/ast.ml(i)`, type `unop` - Extend the translation accordingly in `surface/desugaring.ml` From 98aed4187aacddc9a9c921ea0f52716088c5fa35 Mon Sep 17 00:00:00 2001 From: Louis Gesbert Date: Thu, 19 Aug 2021 20:32:23 +0200 Subject: [PATCH 3/7] Further factorise decimals parsing --- catala.opam | 1 + compiler/surface/lexer.cppo.ml | 12 +++++++++++- compiler/surface/lexer_en.cppo.ml | 23 +++++++++++------------ compiler/surface/lexer_fr.cppo.ml | 23 +++++++++++------------ compiler/surface/lexer_pl.cppo.ml | 23 +++++++++++------------ 5 files changed, 45 insertions(+), 37 deletions(-) diff --git a/catala.opam b/catala.opam index 9f412eb6..9ed57673 100644 --- a/catala.opam +++ b/catala.opam @@ -32,6 +32,7 @@ depends: [ "js_of_ocaml-ppx" {>= "3.8.0"} "camomile" {>= "1.0.2"} "odoc" {with-doc} + "cppo" {>= "1"} ] build: [ ["dune" "subst"] {dev} diff --git a/compiler/surface/lexer.cppo.ml b/compiler/surface/lexer.cppo.ml index af358784..b795980c 100644 --- a/compiler/surface/lexer.cppo.ml +++ b/compiler/surface/lexer.cppo.ml @@ -522,7 +522,17 @@ let rec lex_code (lexbuf : lexbuf) : token = L.update_acc lexbuf; DAY | MX_MONEY_AMOUNT - | MX_DECIMAL_LITERAL + | Plus digit, MS_DECIMAL_SEPARATOR, Star digit -> + let rex = + Re.(compile @@ whole_string @@ seq [ + group (rep1 digit); + str MS_DECIMAL_SEPARATOR; + group (rep digit) + ]) in + let dec_parts = R.get_substring (R.exec ~rex (Utf8.lexeme lexbuf)) in + L.update_acc lexbuf; + DECIMAL_LITERAL + (Runtime.integer_of_string (dec_parts 1), Runtime.integer_of_string (dec_parts 2)) | "<=@" -> L.update_acc lexbuf; LESSER_EQUAL_DATE diff --git a/compiler/surface/lexer_en.cppo.ml b/compiler/surface/lexer_en.cppo.ml index 836cf648..b938bef2 100644 --- a/compiler/surface/lexer_en.cppo.ml +++ b/compiler/surface/lexer_en.cppo.ml @@ -85,7 +85,10 @@ #define MS_TRUE "true" #define MS_FALSE "false" +(* Specific delimiters *) + #define MR_MONEY_OP_SUFFIX '$' +#define MS_DECIMAL_SEPARATOR "." (* Builtins *) @@ -108,8 +111,13 @@ (* More complex cases *) #define MX_MONEY_AMOUNT \ - 0x24, Star hspace, digit, Star (digit | ','), Opt ('.', Rep (digit, 0 .. 2)) -> \ - let extract_parts = R.regexp "([0-9]([0-9,]*[0-9]|))(.([0-9]{0,2})|)" in \ + 0x24, Star hspace, digit, Star (digit | ','), Opt (MS_DECIMAL_SEPARATOR, Rep (digit, 0 .. 2)) -> \ + let extract_parts = \ + Re.(compile @@ seq [ \ + group (seq [ digit; opt (seq [ rep (alt [digit; char ',']); digit]) ]); \ + opt (seq [ str MS_DECIMAL_SEPARATOR; group (repn digit 0 (Some 2))]) \ + ]) \ + in \ let full_str = Utf8.lexeme lexbuf in \ let only_numbers_str = String.trim (String.sub full_str 1 (String.length full_str - 1)) in \ let parts = R.get_substring (R.exec ~rex:extract_parts only_numbers_str) in \ @@ -120,16 +128,7 @@ Runtime.integer_of_string (R.substitute ~rex:remove_commas ~subst:(fun _ -> "") units) \ in \ let cents = \ - try Runtime.integer_of_string (parts 4) with Not_found -> Runtime.integer_of_int 0 \ + try Runtime.integer_of_string (parts 2) with Not_found -> Runtime.integer_of_int 0 \ in \ L.update_acc lexbuf; \ MONEY_AMOUNT (units, cents) - -#define MX_DECIMAL_LITERAL \ - Plus digit, '.', Star digit -> \ - let extract_code_title = R.regexp "([0-9]+)\\.([0-9]*)" in \ - let dec_parts = R.get_substring (R.exec ~rex:extract_code_title (Utf8.lexeme lexbuf)) in \ - (* Integer literal*) \ - L.update_acc lexbuf; \ - DECIMAL_LITERAL \ - (Runtime.integer_of_string (dec_parts 1), Runtime.integer_of_string (dec_parts 2)) diff --git a/compiler/surface/lexer_fr.cppo.ml b/compiler/surface/lexer_fr.cppo.ml index 4494f6b6..56c6848d 100644 --- a/compiler/surface/lexer_fr.cppo.ml +++ b/compiler/surface/lexer_fr.cppo.ml @@ -92,7 +92,10 @@ #define MS_TRUE "vrai" #define MS_FALSE "faux" +(* Specific delimiters *) + #define MR_MONEY_OP_SUFFIX 0x20AC (* The euro sign *) +#define MS_DECIMAL_SEPARATOR "," (* Builtins *) @@ -115,8 +118,13 @@ (* More complex cases *) #define MX_MONEY_AMOUNT \ - digit, Star (digit | hspace), Opt (',', Rep (digit, 0 .. 2)), Star hspace, 0x20AC -> \ - let extract_parts = R.regexp "([0-9]([0-9 ]*[0-9]|))(,([0-9]{0,2})|)" in \ + digit, Star (digit | hspace), Opt (MS_DECIMAL_SEPARATOR, Rep (digit, 0 .. 2)), Star hspace, 0x20AC -> \ + let extract_parts = \ + Re.(compile @@ seq [ \ + group (seq [ digit; opt (seq [ rep (alt [digit; char ' ']); digit]) ]); \ + opt (seq [ str MS_DECIMAL_SEPARATOR; group (repn digit 0 (Some 2))]) \ + ]) \ + in \ let str = Utf8.lexeme lexbuf in \ let parts = R.get_substring (R.exec ~rex:extract_parts str) in \ (* Integer literal*) \ @@ -126,16 +134,7 @@ Runtime.integer_of_string (R.substitute ~rex:remove_spaces ~subst:(fun _ -> "") units) \ in \ let cents = \ - try Runtime.integer_of_string (parts 4) with Not_found -> Runtime.integer_of_int 0 \ + try Runtime.integer_of_string (parts 2) with Not_found -> Runtime.integer_of_int 0 \ in \ L.update_acc lexbuf; \ MONEY_AMOUNT (units, cents) - -#define MX_DECIMAL_LITERAL \ - Plus digit, ',', Star digit -> \ - let extract_code_title = R.regexp "([0-9]+),([0-9]*)" in \ - let dec_parts = R.get_substring (R.exec ~rex:extract_code_title (Utf8.lexeme lexbuf)) in \ - (* Integer literal*) \ - L.update_acc lexbuf; \ - DECIMAL_LITERAL \ - (Runtime.integer_of_string (dec_parts 1), Runtime.integer_of_string (dec_parts 2)) diff --git a/compiler/surface/lexer_pl.cppo.ml b/compiler/surface/lexer_pl.cppo.ml index ffe1540d..dd7e0a0a 100644 --- a/compiler/surface/lexer_pl.cppo.ml +++ b/compiler/surface/lexer_pl.cppo.ml @@ -90,7 +90,10 @@ #define MS_TRUE "prawda" #define MS_FALSE "falsz" +(* Specific delimiters *) + #define MR_MONEY_OP_SUFFIX '$' +#define MS_DECIMAL_SEPARATOR "." (* Builtins *) @@ -113,8 +116,13 @@ (* More complex cases *) #define MX_MONEY_AMOUNT \ - digit, Star (digit | ','), Opt ('.', Rep (digit, 0 .. 2)), Star hspace, "PLN" -> \ - let extract_parts = R.regexp "([0-9]([0-9,]*[0-9]|))(.([0-9]{0,2})|)" in \ + digit, Star (digit | ','), Opt (MS_DECIMAL_SEPARATOR, Rep (digit, 0 .. 2)), Star hspace, "PLN" -> \ + let extract_parts = \ + Re.(compile @@ seq [ \ + group (seq [ digit; opt (seq [ rep (alt [digit; char ',']); digit]) ]); \ + opt (seq [ str MS_DECIMAL_SEPARATOR; group (repn digit 0 (Some 2))]) \ + ]) \ + in \ let str = Utf8.lexeme lexbuf in \ let parts = R.get_substring (R.exec ~rex:extract_parts str) in \ (* Integer literal*) \ @@ -124,16 +132,7 @@ Runtime.integer_of_string (R.substitute ~rex:remove_commas ~subst:(fun _ -> "") units) \ in \ let cents = \ - try Runtime.integer_of_string (parts 4) with Not_found -> Runtime.integer_of_int 0 \ + try Runtime.integer_of_string (parts 2) with Not_found -> Runtime.integer_of_int 0 \ in \ L.update_acc lexbuf; \ MONEY_AMOUNT (units, cents) - -#define MX_DECIMAL_LITERAL \ - Plus digit, '.', Star digit -> \ - let extract_code_title = R.regexp "([0-9]+)\\.([0-9]*)" in \ - let dec_parts = R.get_substring (R.exec ~rex:extract_code_title (Utf8.lexeme lexbuf)) in \ - (* Integer literal*) \ - L.update_acc lexbuf; \ - DECIMAL_LITERAL \ - (Runtime.integer_of_string (dec_parts 1), Runtime.integer_of_string (dec_parts 2)) From dfb358993c44f9a077e1ffed13dd727b72627c83 Mon Sep 17 00:00:00 2001 From: Louis Gesbert Date: Thu, 19 Aug 2021 20:41:34 +0200 Subject: [PATCH 4/7] Small fix --- compiler/surface/lexer.cppo.ml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/compiler/surface/lexer.cppo.ml b/compiler/surface/lexer.cppo.ml index b795980c..e8780772 100644 --- a/compiler/surface/lexer.cppo.ml +++ b/compiler/surface/lexer.cppo.ml @@ -299,10 +299,10 @@ let token_list : (string * token) list = let lex_builtin (s : string) : Ast.builtin_expression option = let lexbuf = Utf8.from_string s in match%sedlex lexbuf with - | MS_IntToDec, eof -> Some IntToDec - | MS_GetDay, eof -> Some GetDay - | MS_GetMonth, eof -> Some GetMonth - | MS_GetYear, eof -> Some GetYear + | MR_IntToDec, eof -> Some IntToDec + | MR_GetDay, eof -> Some GetDay + | MR_GetMonth, eof -> Some GetMonth + | MR_GetYear, eof -> Some GetYear | _ -> None (** Regexp matching any digit character. From e7ad186bd70dacd78986d819b6f3dea0b600acd7 Mon Sep 17 00:00:00 2001 From: Louis Gesbert Date: Fri, 20 Aug 2021 12:26:45 +0200 Subject: [PATCH 5/7] Document adding new languages --- CONTRIBUTING.md | 50 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b289b030..a46bbdf7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -104,9 +104,10 @@ need more, here is how one can be added: for scope parameters, variables or structure fields, since it won't compile anymore. - Add an element to the `builtin_expression` type in `surface/ast.ml(i)` -- Add your builtin in the `builtins` list in `surface/lexer.cppo.ml`, and with proper - translations in all of the language-specific modules `surface/lexer_en.cppo.ml`, - `surface/lexer_fr.cppo.ml`, etc. +- Add your builtin in the `builtins` list in `surface/lexer.cppo.ml`, and with + proper translations in all of the language-specific modules + `surface/lexer_en.cppo.ml`, `surface/lexer_fr.cppo.ml`, etc. Don't forget the + macro at the beginning of `lexer.cppo.ml`. - The rest can all be done by following the type errors downstream: - Add a corresponding element to the lower-level AST in `dcalc/ast.ml(i)`, type `unop` - Extend the translation accordingly in `surface/desugaring.ml` @@ -123,11 +124,40 @@ The Catala language should be adapted to any legislative text that follows a general-to-specifics statutes order. Therefore, there exists multiple versions of the Catala surface syntax, adapted to the language of the legislative text. -Currently, Catala supports English and French legislative text via the -`--language=en`, `--language=fr` or `--language=pl` option. +Currently, Catala supports English, French and Polish legislative text via the +`--language=en`, `--language=fr` or `--language=pl` options. -Technically, support for new languages can be added via a new lexer. If you want -to add a new language, you can start from -[existing lexer examples](compiler/surface/lexer_fr.ml), tweak and open -a pull request. If you don't feel familiar enough with OCaml to do so, please -leave an issue on this repository. +To add support for a new language: +- the basic syntax localisation is defined in + `compiler/surface/lexer_xx.cppo.ml` where `xx` is the language code (`en`, + `fr`...) +- copy the files from another language, e.g. + [english](compiler/surface/lexer_en.cppo.ml), then replace the strings with your + translations. Be careful with the following: + - The file must be encoded in latin-1 + - For a given token `FOO`, define `MS_FOO` to be the string version of the + keyword. Due to the encoding, use `\xNN` [escape + sequences](https://ocaml.org/manual/lex.html#escape-sequence) for utf8 + characters. + - If the string contains spaces or non-latin1 characters, you need to define + `MR_FOO` as well with a regular expression in [sedlex + format](https://github.com/ocaml-community/sedlex#lexer-specifications). + Replace spaces with `", space_plus, "`, and unicode characters with `", + 0xNNNN, "` where `NNNN` is the hexadecimal unicode codepoint. + + **Hint:** You may get syntax errors with unhelpful locations because of + `sedlex`. In that case the command `ocamlc + _build/default/compiler/surface/lexer_xx.ml` may point you to the source of the + error. +- add your translation to the compilation rules: + - in `compiler/surface/dune`, copying another `parser_xx.cppo.ml` rule + - in the `extensions` list in `compiler/driver.ml` + - add a corresponding variant to `compiler/utils/cli.ml` `backend_lang`, try + to run `make build` and follow all type errors and `match non exhaustive` + warnings to be sure it is well handled everywhere. +- you may want to add syntax highlighting support, see `syntax_highlighting/` + and the rules in `Makefile` +- add examples and documentation! + +Feel free to open a pull request for discussion even if you couldn't go through +all these steps, the `lexer_xx.cppo.ml` file is the important part. From dc026d0a7f1fc680b76851582f76361f3115340c Mon Sep 17 00:00:00 2001 From: Louis Gesbert Date: Fri, 20 Aug 2021 14:23:10 +0200 Subject: [PATCH 6/7] I was still unhappy with the remaining duplication that and the double-matching with different kinds of regexps; it should be more robust now. --- compiler/surface/lexer.cppo.ml | 18 +++++++++++++++--- compiler/surface/lexer_en.cppo.ml | 30 ++++-------------------------- compiler/surface/lexer_fr.cppo.ml | 29 ++++------------------------- compiler/surface/lexer_pl.cppo.ml | 29 ++++------------------------- 4 files changed, 27 insertions(+), 79 deletions(-) diff --git a/compiler/surface/lexer.cppo.ml b/compiler/surface/lexer.cppo.ml index e8780772..cca8aa93 100644 --- a/compiler/surface/lexer.cppo.ml +++ b/compiler/surface/lexer.cppo.ml @@ -521,12 +521,24 @@ let rec lex_code (lexbuf : lexbuf) : token = | MR_DAY -> L.update_acc lexbuf; DAY - | MX_MONEY_AMOUNT - | Plus digit, MS_DECIMAL_SEPARATOR, Star digit -> + | MR_MONEY_PREFIX, digit, Opt (Star (digit | MR_MONEY_DELIM), digit), Opt (MC_DECIMAL_SEPARATOR, Rep (digit, 0 .. 2)), MR_MONEY_SUFFIX -> + let s = Utf8.lexeme lexbuf in + let units = Buffer.create (String.length s) in + let cents = Buffer.create 2 in + let buf = ref units in + for i = 0 to String.length s - 1 do + match s.[i] with + | '0'..'9' as c -> Buffer.add_char !buf c + | MC_DECIMAL_SEPARATOR -> buf := cents + | _ -> () + done; + L.update_acc lexbuf; + MONEY_AMOUNT (Runtime.integer_of_string (Buffer.contents units), Runtime.integer_of_string (Buffer.contents cents)) + | Plus digit, MC_DECIMAL_SEPARATOR, Star digit -> let rex = Re.(compile @@ whole_string @@ seq [ group (rep1 digit); - str MS_DECIMAL_SEPARATOR; + char MC_DECIMAL_SEPARATOR; group (rep digit) ]) in let dec_parts = R.get_substring (R.exec ~rex (Utf8.lexeme lexbuf)) in diff --git a/compiler/surface/lexer_en.cppo.ml b/compiler/surface/lexer_en.cppo.ml index b938bef2..5c48f187 100644 --- a/compiler/surface/lexer_en.cppo.ml +++ b/compiler/surface/lexer_en.cppo.ml @@ -88,7 +88,10 @@ (* Specific delimiters *) #define MR_MONEY_OP_SUFFIX '$' -#define MS_DECIMAL_SEPARATOR "." +#define MC_DECIMAL_SEPARATOR '.' +#define MR_MONEY_PREFIX '$', Star hspace +#define MR_MONEY_DELIM ',' +#define MR_MONEY_SUFFIX "" (* Builtins *) @@ -107,28 +110,3 @@ let s = Utf8.lexeme lexbuf in \ let i = String.index s '.' in \ AT_PAGE (int_of_string (String.trim (String.sub s i (String.length s - i)))) - -(* More complex cases *) - -#define MX_MONEY_AMOUNT \ - 0x24, Star hspace, digit, Star (digit | ','), Opt (MS_DECIMAL_SEPARATOR, Rep (digit, 0 .. 2)) -> \ - let extract_parts = \ - Re.(compile @@ seq [ \ - group (seq [ digit; opt (seq [ rep (alt [digit; char ',']); digit]) ]); \ - opt (seq [ str MS_DECIMAL_SEPARATOR; group (repn digit 0 (Some 2))]) \ - ]) \ - in \ - let full_str = Utf8.lexeme lexbuf in \ - let only_numbers_str = String.trim (String.sub full_str 1 (String.length full_str - 1)) in \ - let parts = R.get_substring (R.exec ~rex:extract_parts only_numbers_str) in \ - (* Integer literal*) \ - let units = parts 1 in \ - let remove_commas = R.regexp "," in \ - let units = \ - Runtime.integer_of_string (R.substitute ~rex:remove_commas ~subst:(fun _ -> "") units) \ - in \ - let cents = \ - try Runtime.integer_of_string (parts 2) with Not_found -> Runtime.integer_of_int 0 \ - in \ - L.update_acc lexbuf; \ - MONEY_AMOUNT (units, cents) diff --git a/compiler/surface/lexer_fr.cppo.ml b/compiler/surface/lexer_fr.cppo.ml index 56c6848d..d65e2329 100644 --- a/compiler/surface/lexer_fr.cppo.ml +++ b/compiler/surface/lexer_fr.cppo.ml @@ -95,7 +95,10 @@ (* Specific delimiters *) #define MR_MONEY_OP_SUFFIX 0x20AC (* The euro sign *) -#define MS_DECIMAL_SEPARATOR "," +#define MC_DECIMAL_SEPARATOR ',' +#define MR_MONEY_PREFIX "" +#define MR_MONEY_DELIM ' ' +#define MR_MONEY_SUFFIX Star hspace, 0x20AC (* Builtins *) @@ -114,27 +117,3 @@ let s = Utf8.lexeme lexbuf in \ let i = String.index s '.' in \ AT_PAGE (int_of_string (String.trim (String.sub s i (String.length s - i)))) - -(* More complex cases *) - -#define MX_MONEY_AMOUNT \ - digit, Star (digit | hspace), Opt (MS_DECIMAL_SEPARATOR, Rep (digit, 0 .. 2)), Star hspace, 0x20AC -> \ - let extract_parts = \ - Re.(compile @@ seq [ \ - group (seq [ digit; opt (seq [ rep (alt [digit; char ' ']); digit]) ]); \ - opt (seq [ str MS_DECIMAL_SEPARATOR; group (repn digit 0 (Some 2))]) \ - ]) \ - in \ - let str = Utf8.lexeme lexbuf in \ - let parts = R.get_substring (R.exec ~rex:extract_parts str) in \ - (* Integer literal*) \ - let units = parts 1 in \ - let remove_spaces = R.regexp " " in \ - let units = \ - Runtime.integer_of_string (R.substitute ~rex:remove_spaces ~subst:(fun _ -> "") units) \ - in \ - let cents = \ - try Runtime.integer_of_string (parts 2) with Not_found -> Runtime.integer_of_int 0 \ - in \ - L.update_acc lexbuf; \ - MONEY_AMOUNT (units, cents) diff --git a/compiler/surface/lexer_pl.cppo.ml b/compiler/surface/lexer_pl.cppo.ml index dd7e0a0a..ec54c20c 100644 --- a/compiler/surface/lexer_pl.cppo.ml +++ b/compiler/surface/lexer_pl.cppo.ml @@ -93,7 +93,10 @@ (* Specific delimiters *) #define MR_MONEY_OP_SUFFIX '$' -#define MS_DECIMAL_SEPARATOR "." +#define MC_DECIMAL_SEPARATOR '.' +#define MR_MONEY_PREFIX "" +#define MR_MONEY_DELIM ',' +#define MR_MONEY_SUFFIX Star hspace, "PLN" (* Builtins *) @@ -112,27 +115,3 @@ let s = Utf8.lexeme lexbuf in \ let i = String.index s '.' in \ AT_PAGE (int_of_string (String.trim (String.sub s i (String.length s - i)))) - -(* More complex cases *) - -#define MX_MONEY_AMOUNT \ - digit, Star (digit | ','), Opt (MS_DECIMAL_SEPARATOR, Rep (digit, 0 .. 2)), Star hspace, "PLN" -> \ - let extract_parts = \ - Re.(compile @@ seq [ \ - group (seq [ digit; opt (seq [ rep (alt [digit; char ',']); digit]) ]); \ - opt (seq [ str MS_DECIMAL_SEPARATOR; group (repn digit 0 (Some 2))]) \ - ]) \ - in \ - let str = Utf8.lexeme lexbuf in \ - let parts = R.get_substring (R.exec ~rex:extract_parts str) in \ - (* Integer literal*) \ - let units = parts 1 in \ - let remove_commas = R.regexp "," in \ - let units = \ - Runtime.integer_of_string (R.substitute ~rex:remove_commas ~subst:(fun _ -> "") units) \ - in \ - let cents = \ - try Runtime.integer_of_string (parts 2) with Not_found -> Runtime.integer_of_int 0 \ - in \ - L.update_acc lexbuf; \ - MONEY_AMOUNT (units, cents) From 577bfe67a5823927353455ca7f6f8e8fd91ac9af Mon Sep 17 00:00:00 2001 From: Denis Merigoux Date: Mon, 23 Aug 2021 14:24:39 +0200 Subject: [PATCH 7/7] Added dependencies at other places --- Makefile | 2 +- catala.opam | 2 +- dune-project | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 0538f4ef..b28cc4e1 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,7 @@ dependencies-ocaml: ocamlformat ANSITerminal sedlex menhir menhirLib dune cmdliner obelisk \ re obelisk unionfind bindlib zarith.1.11 zarith_stubs_js.v0.14.0 ocamlgraph \ js_of_ocaml-compiler js_of_ocaml js_of_ocaml-ppx calendar camomile \ - visitors benchmark odoc + visitors benchmark cppo odoc dependencies-js: $(MAKE) -C $(FRENCH_LAW_JS_LIB_DIR) dependencies diff --git a/catala.opam b/catala.opam index 9ed57673..77a8acb0 100644 --- a/catala.opam +++ b/catala.opam @@ -31,8 +31,8 @@ depends: [ "benchmark" {>= "1.6"} "js_of_ocaml-ppx" {>= "3.8.0"} "camomile" {>= "1.0.2"} - "odoc" {with-doc} "cppo" {>= "1"} + "odoc" {with-doc} ] build: [ ["dune" "subst"] {dev} diff --git a/dune-project b/dune-project index 502b206c..bdf6f72f 100644 --- a/dune-project +++ b/dune-project @@ -61,7 +61,9 @@ (js_of_ocaml-ppx (>= 3.8.0)) (camomile - (>= 1.0.2)))) + (>= 1.0.2)) + (cppo + (>= 1)))) (package (name french_law)