2

私は DSL を書いており、同時に parboiled2 を学んでいます。AST が構築されたら、いくつかのセマンティック チェックを実行し、エラーがある場合は、ソース テキスト内の問題のある位置を参照するエラー メッセージを出力したいと考えています。

私は次のようなことを書いていますが、これまでのところうまくいきます:

case class CtxElem[A](start:Int, end:Int, elem:A)

def Identifier = rule {
  push(cursor) ~
  capture(Alpha ~ zeroOrMore(AlphaNum)) ~
  push(cursor) ~
  WhiteSpace
  ~> ((start, identifier, finish) => CtxElem(start, finish, identifier))
}

より良い、またはより簡単な方法はありますか?

4

1 に答える 1

0

Parboiled 2 (今のところ)はパーサー回復戦略をサポートしていません。これは、パーサーが失敗すると停止することを意味します。私が覚えている限り、失敗した場所にシンボルを出力するか、少なくともカーソルを取得できます

したがって、独自の DSL を構築しようとしていて、そのような機能が必要な場合は、ANTLR などの別のツールを使用することをお勧めします。Parboiled1 はパーサーの回復技術をサポートしていますが、今のところ、2 番目のバージョンのサポートを優先する場合は埋もれています。Parboiled 2 は、ログ ファイルまたは構成ファイルの解析には適していますが (デフォルトで修正されるはずです)、DSL の構築には適していません。

于 2016-08-22T23:02:15.560 に答える