6

だから私はブースト精神文法を置き換えるためにlpegで遊んでいます.boost::spiritはlpegよりもはるかにエレガントで自然です。ただし、現在の C++ コンパイラ テクノロジの制約と C++ の TMP の問題により、これを使用するのは困難です。この場合、型メカニズムは味方ではなく敵です。一方、Lpeg は醜い基本的な結果であり、生産性が向上します。

とにかく、余談ですが、私の lpeg 文法の一部は次のようになります。

function get_namespace_parser()
  local P, R, S, C, V =
    lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.V

namespace_parser = 
lpeg.P{
    "NAMESPACE";
    NAMESPACE   = V("WS") * P("namespace") * V("SPACE_WS") * V("NAMESPACE_IDENTIFIER") 
                  * V("WS") * V("NAMESPACE_BODY") * V("WS"),

    NAMESPACE_IDENTIFIER = V("IDENTIFIER") / print_string ,
    NAMESPACE_BODY =  "{" * V("WS") *   
                      V("ENTRIES")^0 * V("WS") * "}",


    WS = S(" \t\n")^0,
    SPACE_WS = P(" ") * V("WS") 
}
  return namespace_parser
end 

この文法は (不完全ではありますが) 次のものと一致しますnamespace foo {}。次のセマンティクスを実現したいと思います (ブースト スピリットを使用する場合の一般的なユース ケースです)。

  1. 名前空間ルールのローカル変数を作成します。
  2. namespace IDENTIFIER {が一致した場合、このローカル変数に名前空間データ構造を追加します。
  3. 新たに作成された名前空間データ構造を に渡し、NAMESPACE_BODYAST をさらに構築します... などなど。

このユースケースは達成可能であると確信しています。それを示す例はありません。その方法を理解するのに十分な言語やライブラリを知りません。誰かがその構文を示すことができますか?

編集: lpeg で踊ろうとして数日間足を踏み入れた後、私は精神に戻ることにしました :D lpeg が lua 関数で織り込まれることを意図しており、そのような織りが非常に自由であることは明らかです-フォーム (一方、スピリットには非常によく文書化された明確なセマンティクスがあります)。ルアの適切なメンタルモデルをまだ持っていません。

4

1 に答える 1