Example #1
0
from jinja2 import TemplateSyntaxError
from parsy import regex, string, seq, whitespace, from_enum, generate, ParseError

from mcmd.script.model.lines import Line
from mcmd.script.model.statements import Statement, Value, Input, Wait, VisibleComment, Command, \
    InvisibleComment, Empty
from mcmd.script.model.templates import Template
from mcmd.script.model.types_ import InputType
from mcmd.script.parser.errors import ScriptSyntaxError

# subparsers
_double_quoted_string = regex(r'"[^"\\]*(?:\\[\S\s][^"\\]*)*"').map(lambda s: s[1:-1].replace(r'\"', '"'))
_single_quoted_string = regex(r"'[^'\\]*(?:\\[\S\s][^'\\]*)*'").map(lambda s: s[1:-1].replace(r"\'", "'"))
_text = _single_quoted_string.map(Template) | _double_quoted_string.map(Template)
_boolean = string('true').result(True) | string('false').result(False)
_padding = whitespace.optional()
_equals = _padding >> string('=') >> _padding
_bool_assignment = _equals >> _boolean.desc('boolean')
_text_assignment = _equals >> _text.desc('quoted text')
_assignment = _bool_assignment | _text_assignment
_message = _padding >> string(':') >> _padding >> _text
_value_name = regex(r'[a-zA-Z0-9_]+').desc('value name consisting of letters, numbers and/or underscores')
_input_type = from_enum(InputType)
_wait_message = _message | regex('.*').map(lambda s: s.strip()).map(Template)


# $value name [= "text"]
@generate
def _value_declaration():
    yield string('value')
    yield whitespace
Example #2
0
File: yuki.py Project: lynn/yuki
# pip install parsy mypy
from dataclasses import dataclass
from enum import Enum
from functools import reduce
from parsy import string, regex, generate, whitespace # type: ignore
from typing import Callable, Mapping, Iterator, List, Sequence, Set, NoReturn, Union
import inspect

def log(x):
    print(len(inspect.stack()) * '  ' + x)

ws = whitespace.optional()

#####################################################################
#
#  Types
#
#####################################################################

@dataclass(frozen=True, order=True)
class YPos:
    def __str__(x): return 'pos'
pPos = string('pos').result(YPos())

@dataclass(frozen=True, order=True)
class YZero:
    def __str__(x): return 'zero'
pZero = string('zero').result(YZero())

@dataclass(frozen=True, order=True)
class YNeg:
Example #3
0
LETTRES_CAPITALES = regex(r"[A-Zİ]+").map(
    remove_accents)  # allow dotted capital i

NUMERO = (string("liminaire").result("0")
          | case_insensitive_string_from("premier", "unique").result("1")
          | string("PRÉLIMINAIRE")
          | CHIFFRES_ARABES
          | CHIFFRES_ROMAINS
          | LETTRES_CAPITALES)

MULTIPLICATIF = string_from(*ADJECTIFS_MULTIPLICATIFS)

ADDITIONNEL = LETTRES_CAPITALES  # alias "andouillette" (AAAAA)

MULT_ADD = (seq(MULTIPLICATIF << whitespace.optional(), ADDITIONNEL).map(
    " ".join)
            | MULTIPLICATIF
            | ADDITIONNEL)

# Divisions uniques

INTITULE = ((case_insensitive_string("Intitulé") >> whitespace >>
             case_insensitive_string_from("de la", "de  la", "du") >>
             whitespace).optional() >> case_insensitive_string_from(
                 "proposition de loi", "projet de loi",
                 "texte").result("titre") << regex(".*"))

MOTION = string("Motions").result("motion")

DIVISION_UNIQUE = (INTITULE
def line_with(p: Parser) -> Parser:
    return whitespace.optional() >> p << newline
Example #5
0
        string_from(
            "art. add.", "div. add.", "Article additionnel", "Article(s) additionnel(s)"
        )
        << whitespace
    ).optional()
    >> (
        case_insensitive_string("après").result("après")
        | case_insensitive_string("apres").result("après")
        | case_insensitive_string("avant").result("avant")
    )
    << whitespace
).at_least(1).map(check_all_equal) << case_insensitive_string("l'").optional()


STATUT_NAVETTE = seq(
    whitespace.optional(),
    string("("),
    case_insensitive_string_from("nouveau", "précédemment examiné", "supprimé"),
    string(")"),
)


ARTICLE_UNIQUE = (
    seq(
        ARTICLE.tag("type_"),
        (whitespace >> case_insensitive_string("article")).optional().tag(None),
        (whitespace >> NUMERO).tag("num"),
        (whitespace >> MULT_ADD << whitespace.optional()).optional().tag("mult"),
    )
    .combine_dict(SubDiv.create)
    .skip(STATUT_NAVETTE.optional())