Pegjs: *、+、および?の貪欲でない演算子

作成日 2011年10月07日  ·  7コメント  ·  ソース: pegjs/pegjs

私は、最初の記号だけを気にする同じパターンのインスタンスが繰り返される言語を持っています。 例えば:

          system       OBJECT IDENTIFIER ::= { mib-2 1 }
          interfaces   OBJECT IDENTIFIER ::= { mib-2 2 }
          at           OBJECT IDENTIFIER ::= { mib-2 3 }
          ip           OBJECT IDENTIFIER ::= { mib-2 4 }
          icmp         OBJECT IDENTIFIER ::= { mib-2 5 }
          tcp          OBJECT IDENTIFIER ::= { mib-2 6 }
          udp          OBJECT IDENTIFIER ::= { mib-2 7 }
          egp          OBJECT IDENTIFIER ::= { mib-2 8 }

この単純な例は、このパターン(_は空白)と一致する可能性があります。

identifier _ "OBJECT IDENTIFIER" _ "::=" _ "{" _ identifier _ number _ "}"

この場合、これはそれほど大したことではありません(私はすでにパターンを入力しました:-)しかし、言語には、完全な構文解析を保証しない他の大きな毛深い構造のセットがあります(各行の最初の識別子のみが必要です私が考えている仕事をしてください)。

このパターンのようなものを入力したいと思います:

identifier _ "OBJECT IDENTIFIER" .*? "}"

どこ "。*?" 欲張りではありません-端末の最初の出現までしか消費しません。 これはPEG.jsのリストに含まれている可能性がありますか? どうもありがとう。

最も参考になるコメント

PEG形式では、述語を.メタ文字と一緒に使用することで、ターミネーターまで簡単に照合できます。 何かのようなもの:

"OBJECT IDENTIFIER" (!"}" .)* "}"

それで十分ですか?

全てのコメント7件

更新:これは、Googleグループ( http://groups.google.com/group/pegjs/browse_thread/thread/2bea15581be45187 )で提案されているように、繰り返し回数(私の最初の考えを一般化したもの)で満たすことができ

PEG形式では、述語を.メタ文字と一緒に使用することで、ターミネーターまで簡単に照合できます。 何かのようなもの:

"OBJECT IDENTIFIER" (!"}" .)* "}"

それで十分ですか?

はい、それは完璧に機能します。 ありがとう!

@dmajda !"}"式によって返される空の文字を取り除くための推奨される方法は何ですか?

例えば:

   = chars:(!"-suffix" .)+ "-suffix"

"foo-suffix" => [[ '', 'f' ], ['', 'o' ], ['', 'o' ]]  // result
"foo-suffix" => ['f', 'o', 'o' ] // desired result

!"-suffix" .を、 .結果を返すだけの独自のルールに分割することでこれを実現できましたが、もっと良い方法があるかどうか知りたいです。

66はこれを修正します。

私はあなたが使用できる間、平均して考えます:

    = chars:(!"-suffix" c:. {return c})+ "-suffix"

@ islandrPEG.jsの使用法について質問する場所として問題を使用しないでください。 特に彼らが閉まっているとき、そして特にあなたが私のそばにいる他の人があなたを助けることができる何かを求めているとき。 適切なチャネルはGoogleグループです。

申し訳ありませんがデビッド。 だったのでここはいい場所だったと思います
あなたが与えた例に直接関連しています。

21:51の水曜日、2013年1月9日には、デビッドMajdaの[email protected]

@islandrhttps ://github.com/islandr問題を場所として使用しないでください
PEG.jsの使用法について質問します。 特に彼らが閉じているとき
特にあなたが私のそばにいる他の人ができることを尋ねているとき
お手伝いします。 適切なチャネルはGoogleグループです


このメールに直接返信するか、Gi tHubhttps://github.com/dmajda/pegjs/issues/57#issuecomment-12083927で表示してください。

このページは役に立ちましたか?
0 / 5 - 0 評価