Pegjs: Нежадные операторы для *, + и?

Созданный на 7 окт. 2011  ·  7Комментарии  ·  Источник: pegjs/pegjs

У меня есть язык, в котором есть повторяющиеся экземпляры одного и того же паттерна, где меня интересует только первый символ. Например:

          system       OBJECT IDENTIFIER ::= { mib-2 1 }
          interfaces   OBJECT IDENTIFIER ::= { mib-2 2 }
          at           OBJECT IDENTIFIER ::= { mib-2 3 }
          ip           OBJECT IDENTIFIER ::= { mib-2 4 }
          icmp         OBJECT IDENTIFIER ::= { mib-2 5 }
          tcp          OBJECT IDENTIFIER ::= { mib-2 6 }
          udp          OBJECT IDENTIFIER ::= { mib-2 7 }
          egp          OBJECT IDENTIFIER ::= { mib-2 8 }

Этот простой пример может быть сопоставлен с этим шаблоном (где _ - пробел):

identifier _ "OBJECT IDENTIFIER" _ "::=" _ "{" _ identifier _ number _ "}"

В данном случае это не такая уж большая проблема (я уже набрал шаблон :-) Но в языке есть набор других больших волосатых конструкций, которые не требуют полного анализа (я хочу, чтобы только начальный идентификатор в каждой строке был делаю работу, которую я задумал).

Я хотел бы набрать что-то вроде этого шаблона:

identifier _ "OBJECT IDENTIFIER" .*? "}"

где ".*?" не является жадным - он потребляет только до первого появления терминала. Может ли это быть в списке для PEG.js? Большое спасибо.

Самый полезный комментарий

В формализме PEG вы можете легко найти совпадение до терминатора, используя предикат вместе с метасимволом . . Что-то типа:

"OBJECT IDENTIFIER" (!"}" .)* "}"

Вам этого достаточно?

Все 7 Комментарий

Обновление: это может быть выполнено подсчетом повторений (который является обобщением моей первоначальной мысли), как предлагается в группах Google по адресу: http://groups.google.com/group/pegjs/browse_thread/thread/2bea15581be45187

В формализме PEG вы можете легко найти совпадение до терминатора, используя предикат вместе с метасимволом . . Что-то типа:

"OBJECT IDENTIFIER" (!"}" .)* "}"

Вам этого достаточно?

Да, это прекрасно работает. Спасибо!

@dmajda Какова рекомендуемая практика удаления пустого символа, возвращаемого выражением !"}" ?

Например:

   = chars:(!"-suffix" .)+ "-suffix"

"foo-suffix" => [[ '', 'f' ], ['', 'o' ], ['', 'o' ]]  // result
"foo-suffix" => ['f', 'o', 'o' ] // desired result

Мне удалось добиться этого, разбив !"-suffix" . на собственное правило, которое просто возвращает результат . , но мне любопытно, есть ли лучший способ.

66 исправит это.

Я думаю, что пока вы можете использовать:

    = chars:(!"-suffix" c:. {return c})+ "-suffix"

@islandr Пожалуйста, не используйте вопросы как место, чтобы задать вопросы об использовании PEG.js. Особенно, когда они закрыты, и особенно когда вы просите о чем-то, что другие люди рядом со мной могут вам помочь. Правильный канал - это группа Google .

Извини, Дэвид. Думал, это было бы хорошее место, так как это было
напрямую связано с приведенным вами примером.

В среду, 9 января 2013 г., в 21:51 Дэвид Майда [email protected] написал:

@islandr https://github.com/islandr Пожалуйста, не используйте вопросы как место
задавать вопросы об использовании PEG.js. Особенно когда они закрыты и
особенно когда вы спрашиваете то, что другие люди рядом со мной могут
помочь вам с. Правильный канал - Google Grouph http://groups.google.com/group/pegjs
.

-
Ответьте на это письмо напрямую или просмотрите его на Gi tHubhttps: //github.com/dmajda/pegjs/issues/57#issuecomment -12083927.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги