Ларк: Как заставить литералы появляться в дереве - PullRequest
0 голосов
/ 05 октября 2019

Использование 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_comp также включала литералы в параметр args?

1 Ответ

1 голос
/ 06 октября 2019

Существует два подхода к решению вашей проблемы.

  1. Превратите ipv6_comp в терминал. Затем Ларк сопоставит все это в одном регулярном выражении и вернет все соответствующие ему символы:
    IPV6_COMP: [HEX (":" HEX)~0..5] "::" [HEX (":" HEX)~0..5]

Укажите имя для своей пунктуации (что вы предлагали, но в качестве терминалов)

COLON: ":"

Используйте оператор !чтобы включить пунктуацию (то есть: безымянные символы) в правило

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

Я рекомендую первое решение, потому что оно быстрее разбирается, и вы можете использовать выделенную библиотеку для разбораIPv6-адрес на компоненты, после того как анализ завершен.

...