Использование PEG.js для простого поиска / замены

Я пытаюсь понять, как использовать PEG.js для простого поиска / замены в тексте. Конечно, это не предназначенное использование для парсера, но в любом случае мне любопытно, какая логика стоит за этими языками, чтобы произвести некоторый поиск / замену.

Проблема, с которой столкнулся Im, заключается в том, что трудно дать положительное определение дополнительности некоторых определений. Пример: представьте, что я хочу найти и заменить что-то вроде этого синтаксиса:

rule = (whatever_is_not_my_syntax* m:my_syntax)+ {replace m}
word = [a-z0-9_]+
my_syntax = word "." word
whatever_is_not_my_syntax = ???

Трудно описать положительно, что whatever_is_not_my_syntax в PEG.js без частичного столкновения (и последующей ошибки парсера) с my_syntax, или, по крайней мере, я не знаю, как это сделать, потому что единственными отрицательными функциями синтаксического анализатора в PEG.js являются !expression и [^characters].

Вы можете мне помочь? Я буду признателен за любую книгу или библиографию, если таковая существует, по этой теме. Заранее спасибо.


person Masacroso    schedule 16.01.2016    source источник


Ответы (1)


Вам не нужно указывать, чего нет в вашем синтаксисе. Сначала попробуйте соответствовать своему синтаксису, а затем сделайте запасной вариант для чего-нибудь еще.

Здесь rule - это список всех шаблонов вашего синтаксиса. Если он не совпадает, вместо него будет соответствовать other.

expr =
    a:rule " " b:expr
        {return [a].concat(b)}
  / a:rule
        {return [a]}
  / a:other " " b:expr
        {return [a].concat(b)}
  / a:other
        {return [a]}

word =
    a:[a-z0-9_]+
        {return a.join("")}

rule =
    word "." word
        {return "rule1"} // Put replace logic here
  / word ":" word
        {return "rule2"} // Put replace logic here

other =
    word
        {return "other"}

Вы можете попробовать это в Интернете: http://pegjs.org/online

person fafl    schedule 06.06.2016