File: parse-pint.py

package info (click to toggle)
flexparser 0.4-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 380 kB
  • sloc: python: 2,558; makefile: 4
file content (87 lines) | stat: -rw-r--r-- 1,795 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
from __future__ import annotations

import pathlib
import typing as ty
from dataclasses import dataclass

from pint_parser import common, context, defaults, group, plain, system

from flexparser import flexparser as fp


@dataclass(frozen=True)
class ImportDefinition(fp.IncludeStatement):
    value: str

    @property
    def target(self):
        return self.value

    @classmethod
    def from_string(cls, s: str) -> fp.NullableParsedResult[ImportDefinition]:
        if s.startswith("@import"):
            return ImportDefinition(s[len("@import") :].strip())
        return None


@dataclass(frozen=True)
class EntryBlock(
    fp.RootBlock[
        ty.Union[
            common.Comment,
            ImportDefinition,
            defaults.DefaultsDefinition,
            context.ContextDefinition,
            group.GroupDefinition,
            system.SystemDefinition,
            plain.DimensionDefinition,
            plain.PrefixDefinition,
            plain.UnitDefinition,
        ]
    ]
):
    pass


cfg = common.Config()
p = pathlib.Path("files/default_en.txt")

parsed = fp.parse(
    p,
    EntryBlock,
    cfg,
    delimiters={
        "#": (
            fp.DelimiterInclude.SPLIT_BEFORE,
            fp.DelimiterAction.CAPTURE_NEXT_TIL_EOL,
        ),
        **fp.SPLIT_EOL,
    },
)


def pprint(objs, indent=1):
    TT = "  "
    print(TT * (indent - 1), objs.opening)
    for p in objs.body:
        if isinstance(p, fp.Block):
            pprint(p, indent + 1)
        else:
            print(TT * indent, p)
    print(TT * (indent - 1), objs.closing)


print("Keys")
print("----")
for k in parsed.keys():
    print(k)

print("\n\n----\n\n")
for x in parsed.iter_blocks():
    print(x)

print("\n")
print("Errors")
print("------")
for p in parsed.errors():
    print(p)