У меня есть язык, в котором есть повторяющиеся экземпляры одного и того же паттерна, где меня интересует только первый символ. Например:
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? Большое спасибо.
Обновление: это может быть выполнено подсчетом повторений (который является обобщением моей первоначальной мысли), как предлагается в группах 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" .
на собственное правило, которое просто возвращает результат .
, но мне любопытно, есть ли лучший способ.
Я думаю, что пока вы можете использовать:
= 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.
Самый полезный комментарий
В формализме PEG вы можете легко найти совпадение до терминатора, используя предикат вместе с метасимволом
.
. Что-то типа:Вам этого достаточно?