2016-01-16 2 views
2

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

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

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].

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

ответ

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

Смежные вопросы