0

私は、JParsec ライブラリを使用して単純なパーサーに取り組んでおり、以下を解析したいと考えています。

some, list, of, things

これは with で簡単に実行parser.sepBy(Scanners.isChar(',')できますが、between.

最終的に、次の行に沿って何かを解析したいと考えています。

implements some.java.Interface, some.other.Interface {
  ...
}

ただし、「sepBy X until (ただし、Y を消費しない)」または「sepBy X until failure」と言う魔法の組み合わせが見つかりません。

ここで簡単なものが欠けていますか?

4

1 に答える 1

1

その種のものを実装するサンプルディレクトリには、多かれ少なかれ完全なJavaパーサーがあります。秘訣は、リストの要素内で中括弧が発生しないと仮定して、シーケンス内の物事のリストのパーサーを含めるか、中括弧の間の本体の別のパーサーと next() と組み合わせることです。

からのclassDefメソッドは次のorg.codehaus.jparsec.examples.java.parser.DeclarationParserとおりです。

 static Parser<Declaration> classDef(Parser<Modifier> mod, Parser<Member> member) {
   return curry(ClassDef.class).sequence(
       mod.many(), term("class"), Terminals.Identifier.PARSER, TYPE_PARAMETERS.optional(),
       term("extends").next(ELEMENT_TYPE_LITERAL).optional(),
       term("implements").next(ELEMENT_TYPE_LITERAL.sepBy1(term(","))).optional(),
       body(member));
 }

気になる部分はterm("implements").next(ELEMENT_TYPE_LITERAL.sepBy1(term(","))).optional(). このフラグメントは、返された要素を使用してAST オブジェクトを作成する一連のパーサーのオプション部分であることに注意してください。ClassDef

于 2015-08-05T11:59:21.760 に答える