From b044e908bb113de037071fc9382203df2f54da51 Mon Sep 17 00:00:00 2001 From: ElectronixTM Date: Sun, 16 Mar 2025 00:23:30 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BF=D0=B0=D1=80=D1=81=D0=B8=D0=BD=D0=B3=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B3=D1=80=D0=B0=D0=BC?= =?UTF-8?q?=D0=BC=D0=B0=D1=82=D0=B8=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/rule.py | 9 +++++++++ src/rulesparser.py | 31 +++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 src/rule.py diff --git a/src/rule.py b/src/rule.py new file mode 100644 index 0000000..03499d2 --- /dev/null +++ b/src/rule.py @@ -0,0 +1,9 @@ +from dataclasses import dataclass + +EMPTY_SYMBOL = '$' + +@dataclass(frozen=True) +class Rule: + operand: str + target: str + is_blocking: bool diff --git a/src/rulesparser.py b/src/rulesparser.py index dd65049..b5bbb5c 100644 --- a/src/rulesparser.py +++ b/src/rulesparser.py @@ -1,4 +1,4 @@ -from collections import OrderedDict +from rule import Rule, EMPTY_SYMBOL import re class RulesParser: @@ -7,9 +7,9 @@ class RulesParser: NEWLINE = '\n' IGNORE = r'\s+' COMMENTS = r'//.+$' - EMPTY = r'\$' + EMPTY = re.escape(EMPTY_SYMBOL) - def parse(self, file: str): + def parse(self, file: str) -> list[Rule]: """ Parsing file according to syntax, specified in class variables. Hardcoded for now (and forever) @@ -17,13 +17,32 @@ class RulesParser: with open(file, 'r') as f: text = f.read() lines = self._get_lines(text) - self._parse_rule(lines[0]) + rules = list() + for line in lines: + rules.append(self._parse_rule(line)) + return rules - def _parse_rule(self, line: str) -> tuple[str, str]: + def _parse_rule(self, line: str) -> Rule: """ tries to parse rule according to set grammar """ - print(re.split(self.IGNORE, line)) + tokens = re.split(self.IGNORE, line) + # we always expect 3 parts: operand, arrow, target + arrow = tokens[1] + is_blocking = None + if re.fullmatch(self.TRANSFORM, arrow): + is_blocking = False + elif re.fullmatch(self.B_TRANSFORM, arrow): + is_blocking = True + else: + raise ValueError(f"Can't recognize transform symbol. " + f"\"{self.TRANSFORM}\" or \"{self.B_TRANSFORM}\"" + f" expected, but \"{arrow}\" encountered") + return Rule( + operand=tokens[0], + target=tokens[2], + is_blocking=is_blocking + ) def _get_lines(self, src: str) -> list[str]: """