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