Определение по умолчанию метода пробела в грамматике - PullRequest
6 голосов
/ 01 апреля 2019

В соответствии с документацией определение по умолчанию метода ws в грамматике должно соответствовать нулю или большему количеству пробельных символов, если эта точка не находится внутри слова:

regex ws { <!ww> \s* }

В чем разница между этим определением и следующим:

regex ws { \s+ }

Интересно, почему утверждение с нулевой шириной <!ww> используется вместо простого \s+? Я также отмечаю, что определение по умолчанию позволяет сопоставлять ноль пробелов, но когда это действительно произойдет? Разве не было бы более понятно, если бы он использовал \s+ вместо \s*?

1 Ответ

9 голосов
/ 01 апреля 2019

Утверждение ww означает, что есть символы, соответствующие \w по обе стороны от текущей точки.! инвертирует его, что означает <!ww> совпадения:

  • В начале строки
  • В конце строки
  • Когда есть не- \w символ перед текущей позицией (например, между "+" и "a")
  • Когда после текущей позиции есть не-\w символ (например, между "a" и "+"")

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

Это следует из того, во многих языках, которые мы могли бы захотеть проанализировать.Например, рассмотрим ab+cd.Значение по умолчанию ws будет соответствовать любой стороне +, но, например, не будет совпадать в пределах идентификатора.

Для языков, где это не подходит, это просто вопрос переопределения значения по умолчаниюws для того, что нужно этому языку.

...