1

Parse :: RecDescentで、C ++ / Javaスタイルのコメントを効果的に無視するにはどうすればよいですか?これには、単一行('//'行末まで)と複数行(/ここまでのすべて/)が含まれます。

4

2 に答える 2

2

<skip>パーサーが空白と見なすものを定義します。

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

ネイトグレンのソリューションとは異なり、私の

  • すべてのパーサーに影響するグローバル変数を設定しません。
  • 不要なキャプチャを使用しません。
  • 欲張りでない修飾子を使用しません。(彼は、特定の文字が特定の場所で一致しないことを確認するために非欲張り修飾子を使用しましたが、非欲張り修飾子はそれを保証しません。)

注:toasisto 。(?:(?!STRING).)*_(?:STRING)[^CHAR]CHAR

于 2012-07-04T01:05:40.960 に答える
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.
于 2012-07-03T19:52:44.930 に答える