2012-07-03 3 views

ответ

2

<skip> определяет, что анализатор рассматривает пробелы.

parse: <skip: qr{(?xs: 
      (?: \s+      # Whitespace 
      | /[*] (?:(?![*]/).)* [*]/ # Inline comment 
      | // [^\n]* \n?    # End of line comment 
     ) 
     )*}> 
     main_rule 
     /\Z/ 
     { $item[2] } 

В отличие от решения Nate Гленна, мой

  • Не устанавливает глобальную переменную, затрагивающей все парсеры.
  • Не использует ненужные захваты.
  • Не использует неживой модификатор. (Он использовал нежадное модификатор, чтобы убедиться, некоторые символы не совпадает в некоторых местах, но не жадный модификатор не гарантирует, что.)

Примечание: (?:(?!STRING).)* является (?:STRING), как [^CHAR] - CHAR.

+0

Спасибо! У меня был ответ, но я надеялся на улучшение. –

+0

О, я не осознавал, что это ваш собственный вопрос, на который вы отвечали! ха-ха! Честно говоря, ответ был довольно хорошим. 1) Если вы хотите использовать $ Parse :: RecDescent :: skip, просто используйте 'local', чтобы ограничить изменение, когда скомпилирована грамматика. 2) Потери скорости будут незначительными, учитывая, насколько медленным является ПРД. 3) Я в основном в безопасности. Это может быть или не быть проблемой в зависимости от того, как PRD использует регулярное выражение. – ikegami

1

Вы должны установить значение $Parse::RecDescent::skip. По умолчанию Parse :: RecDescent пропускает все пробелы. Если вы установите эту переменную в соответствие пробелам и комментариям, вы можете пропустить их. Используйте это:

$Parse::RecDescent::skip = 
    qr{ 
     (
      \s+     #whitespace 
       |    #or 
      /[*] .*? [*]/ \s* #a multiline comment 
       |    #or 
      //.*?$    #a single line comment 
     )*      #zero or more 

    }mxs; 
# m allows '$' to match a newline, x allows regex comments/whitespace, 
# s allows '.' to match newlines. 
+0

Я думаю, что это все еще страдает от проблемы чего-то, что похоже на комментарий в стиле С, встроенный в один комментарий линии: https://rt.cpan.org/Public/Bug/Display.html?id=77702 – DavidO

+1

@DavidO, нет, здесь подразумевается '\ G'. – ikegami

+0

@ikegami, Nice. Это сделает это. :) – DavidO