0

使用 Python。在我的语法中,我有这样一行:

ipv6_comp: [ipv6_hex (":" ipv6_hex)~0..5] "::" [ipv6_hex (":" ipv6_hex)~0..5]

我的变压器有相应的功能

def ipv6_comp(self, args):

但是,args看起来像这样:

<class 'list'>: ['2001', 'db8', '85a3', '8a2e', '370', '7334']

因为字面值不包括在内。但是,从这个结构中,我显然不可能知道原始 ip 是否看起来像以下任何一个:

2001:db8:85a3::8a2e:370:7334
2001:db8:85a3:8a2e::370:7334

我想我可以用他们自己的规则来掩盖文字,比如

colon: ":"
doublecolon: "::"
ipv6_comp: [ipv6_hex (colon ipv6_hex)~0..5] doublecolon [ipv6_hex (colon ipv6_hex)~0..5]

这甚至可能更清洁。但是,我使用的语法是半自动生成的,这需要更多的体力劳动。

有没有办法让我的转换器函数ipv6_compargs参数中也包含文字?

4

1 回答 1

2

有两种方法可以解决您的问题。

  1. 变成ipv6_comp一个终端。然后 Lark 将在一个正则表达式中匹配所有内容,并返回所有匹配的字符:
    IPV6_COMP: [HEX (":" HEX)~0..5] "::" [HEX (":" HEX)~0..5]
  1. 为您的标点符号提供一个名称(您建议的名称,但作为终端)

    冒号: ”:”

  2. 使用!运算符在规则中包含标点符号(即:未命名符号)

    !ipv6_comp: [ipv6_hex (":" ipv6_hex)~0..5] "::" [ipv6_hex (":" ipv6_hex)~0..5]

我推荐第一种解决方案,因为它解析更快,并且您可以在解析完成后使用专用库将 IPv6 地址解析为组件。

于 2019-10-05T21:05:36.307 回答