[PATCH v4 3/5] dts: add parsing utility module

Luca Vizzarro Luca.Vizzarro at arm.com
Thu Jun 6 23:14:55 CEST 2024


On 06/06/2024 19:52, Jeremy Spewock wrote:
>> +                @classmethod
>> +                def from_str(cls, text: str):
>> +                    match text:
>> +                        case "black":
>> +                            return cls.BLACK
>> +                        case "white":
>> +                            return cls.WHITE
>> +                        case _:
>> +                            return None # unsupported colour
>> +
>> +                @classmethod
>> +                def make_parser(cls):
>> +                    # make a parser function that finds a match and
>> +                    # then makes it a Colour object through Colour.from_str
>> +                    return TextParser.wrap(cls.from_str, TextParser.find(r"is a (\w+)"))
> 
> I think this example is backwards now that you changed the parameters
> to calling order isn't it? We need to call find first and then pass
> that into from_str.

aargh! yes, you are right. thank you! and well spotted!

>> +
>> +            @dataclass
>> +            class Animal(TextParser):
>> +                kind: str = field(metadata=TextParser.find(r"is a \w+ (\w+)"))
>> +                name: str = field(metadata=TextParser.find(r"^(\w+)"))
>> +                colour: Colour = field(metadata=Colour.make_parser())
>> +                age: int = field(metadata=TextParser.find_int(r"aged (\d+)"))
>> +
>> +            steph = Animal.parse("Stephanie is a white cat aged 10")
>> +            print(steph) # Animal(kind='cat', name='Stephanie', colour=<Colour.WHITE: 2>, age=10)
>> +    """
>> +
> <snip>
>> +    @staticmethod
>> +    def find(
>> +        pattern: str | re.Pattern[str],
>> +        flags: re.RegexFlag = re.RegexFlag(0),
>> +        named: bool = False,
>> +    ) -> ParserFn:
>> +        """Makes a parser function that finds a regular expression match in the text.
>> +
>> +        If the pattern has any capturing groups, it returns None if no match was found, otherwise a
>> +        tuple containing the values per each group is returned.. If the pattern has only one
> 
> It looks like there are two periods here by mistake.

well spotted again!


More information about the dev mailing list