2017-11-22 4 views
4

実験のために、私はRubyの基本コード、特にパーサーを変更する方法を探しています。私はこれが可能であるかどうか、宝石を使用することはもちろんのこと、と思っていました。GemのRubyベースのCコードをオーバーライド

私はstatic int yylex()に変更する必要があるコードをparser.cに絞り込んだ。エイリアスを使用しようとしていましたが、それは私が理解するように、私がparser.hを変更する必要があるようです。これはGem内ではできません。

これはGemから行うことができますか?

+1

ルビーの私の理解が行く限り、ルビーインタプリタの上に宝石が走っているので、これは宝石からできません。あなたの宝石にc拡張を追加することはできますが、すでに実行しているインタプリタには影響しません。 c拡張子を持つ宝石の詳細については :http://guides.rubygems.org/gems-with-extensions/ – Maru

答えて

1

宝石がアクセス権を持っている唯一の基地CコードはRuby headersによって露出されていることです。 解析/レキシングコードはそこに公開されていません。

カスタム構文を定義したい場合は、私が(順番に)しようとするだろう:

  1. 要件ビットを緩め、DSLを定義します。 Rubyは非常に強力なメタプログラミング機能を備えており、スクリプト内で静的に行うことができ、ランタイム中に動的に行うことができます。
  2. Rubyでカスタムパーサーを作成し、という有効なRubyを発行します。醜い、おそらく少し遅いですが、あなたが望むことを何でもすることができます。
  3. 代わりにmrubyパーサーを変更してください。 mrubyは、VMの機能を高度にカスタマイズできるようにする組み込みアプリケーション向けに設計されています。私は彼らがパーサーを念頭に置いていたとは思っていませんが、依然としてMRIを使いこなすよりも実現可能性があります。
+2

ラット。私は++を置くことを試みようとしていました。しかたがない。 – oMiKeY