Проблемы грамматики Treetop с использованием регулярных выражений - PullRequest
0 голосов
/ 09 марта 2010

У меня есть простая настройка грамматики, например:

grammar Test
   rule line
      (adjective / not_adjective)* {
         def content
             elements.map{|e| e.content }
         end
      }
   end
   rule adjective
      ("good" / "bad" / "excellent") {
          def content
              [:adjective, text_value]
          end
      }
   end
   rule not_adjective
      !adjective {
          def content
              [:not_adjective, text_value]
          end
      }
   end
end

Допустим, мой вклад "это хороший мяч. Давайте использовать его". Это дает ошибку, которую я сейчас не упоминаю, потому что я хочу понять теорию о том, почему она ошибается в первую очередь. Итак, как мне создать правило not_adjective, чтобы оно соответствовало всему, что не соответствует прилагательному правилу? В общем, как мне написать правило (особенно в Treetop), которое «не соответствует» другому названному правилу?

Ответы [ 2 ]

1 голос
/ 06 мая 2015

Предыдущий ответ является неправильным для вопроса ОП, так как он будет соответствовать любой последовательности отдельных символов вплоть до любого прилагательного. Поэтому, если вы видите строку xyzgood, она будет соответствовать xyz, а следующее правило будет соответствовать «хорошей» части в качестве прилагательного. Аналогично, правило прилагательного в ОП будет соответствовать первым трем символам «значка» как прилагательному «плохо», а это не то, что они хотят.

Вместо этого правило прилагательного должно выглядеть примерно так:

rule adjective
  a:("good" / "bad" / "excellent") ![a-z] {
    def content
      [:adjective, a.text_value]
    end
  }
end

и правило not_adjective, подобное этому:

rule not_adjective
  !adjective w:([a-z]+) {
    def content
      [:not_adjective, w.text_value]
    end
  }
end

включает обработку в верхнем регистре, переносов, апострофов и т. Д., Если необходимо. Конечно, вам также понадобится обработка пробелов.

1 голос
/ 09 марта 2010

Treetop - это генератор синтаксических анализаторов , который генерирует синтаксические анализаторы из специального класса грамматик, называемого Грамматики синтаксического анализа выражений или PEG .
Операционная интерпретация !expression состоит в том, что он успешен, если expression терпит неудачу и терпит неудачу, если expression успешен, но он потребляет НЕТ ввода .
Чтобы сопоставить что-либо, что правило expression не соответствует, используйте оператор dot (который совпадает с любым) в сочетании с оператором отрицания, чтобы избежать определенных "слов":

( !expression . )* ie. "match anything BUT expression"
...