Как пропустить все одно- и многострочные комментарии в парсере Parse::RecDescent

В Parse::RecDescent, как эффективно игнорировать комментарии в стиле C++/Java? Это включает в себя однострочное ("//" до конца строки) и многострочное (/все между здесь/).

2 ответа

Решение

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

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

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

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

Замечания: (?:(?!STRING).)* это к (?:STRING) как [^CHAR] это к CHAR,

Вы должны установить значение $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.
Другие вопросы по тегам