web-dev-qa-db-ja.com

JVMを必要としないLexまたはyaccよりも新しいプログラムはありますか?

JVMまたは.NETまたは同様の「重い」ランタイムを必要としない「モダン」バイソンおよびフレックス同等のものはありますか?

現代では、たとえば Antlr とJavaの別の名前は見ましたが、名前を忘れました。たとえば、AntlrにはCターゲットがあることは知っていますが、私はコンパイラージェネレーターを自分のプログラムに埋め込むというアイデアを楽しんでいますJavaは私にとって非常に非現実的です。)

解析には Lemon parser generator を使用することをお勧めします。 Bisonと同様に、Cでパーサーを生成します。ただし、その文法はエラーが発生しにくく、パーシングインターフェイスはグローバル変数なしで再入可能であり、パーサーにトークンを与えることで機能します(パーサーがトークンを取得するためにコールバックする代わりに)。 。

レクサージェネレーター(Lexなど)は実際には必要ありません。通常、手で書く方が簡単です。

レモンを使用して言語を解析する方法のアイデアを得るために私のコードのいくつかをチェックアウトできます: languagelexergrammar 、- パーサー

19
Ambroz Bizjak

非常に異なるが、非常に優れた(そして簡単に埋め込むことができる)答えは [〜#〜] lpeg [〜#〜] です。

一見すると、より機能的なRegExのような、単なるパターンマッチングライブラリです。しかし、パターンだけでなく言語の文法全体を定義し、任意のステップにカスタム動作を付加することができます。

そのページには、算術式に一致し、最終的な値を生成するサンプルがあります。代わりに、解析グラフを作成したり、コードを直接出力したりできます。

LPEGレシピ ページには、Luaレクサー全体とパーサーのサンプル、およびANSI Cレクサーのサンプルが含まれています。

4
Javier

Ambroz Bizjakは、レクサージェネレーターは本当に必要ないだろうと言っていましたが、おそらく(トークンルールを手動で左因数分解することに問題がない限り)必要になります。グローバルのない素敵なレクサーを取得したい場合は、古い学校Lexの代わりに Ragel を使用することをお勧めします状態。

2
firegurafiku