コードを解析するRubyをご覧ください
実用的で便利なコンテンツから少し離れて、Rubyパーティーのすっきりとしたトリックを紹介するのは楽しいと思いました。
Rubyがプログラムを実行する前に、プログラムを解析する必要があります。パーサーは一種のステートマシンです。また、Rubyにステートマシンが行うすべてのことをログに記録させるために使用できる、あまり知られていないコマンドラインフラグがあります。
次の例を見てください:
a = 1 + 2
-y
を使用してこれを実行した場合 フラグを立てると、次の出力が得られます:
$ ruby -y sample.rb
Starting parse
Entering state 0
Reducing stack by rule 1 (line 903):
-> $$ = nterm $@1 ()
Stack now 0
Entering state 2
Reading a token: Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 35
Reading a token: Next token is token '=' ()
Reducing stack by rule 509 (line 4417):
$1 = token tIDENTIFIER ()
-> $$ = nterm user_variable ()
Stack now 0 2
Entering state 113
Next token is token '=' ()
Reducing stack by rule 100 (line 1764):
$1 = nterm user_variable ()
-> $$ = nterm lhs ()
Stack now 0 2
...
140 more lines
ここに表示されているのは、Rubyパーサーがファイル内の各トークンを循環し、次の操作を実行していることです。
- トークンをスタックに追加します
- スタックをルールのリストと比較します
- トークンがルールに一致する場合は、状態遷移を実行します
- 一致しない場合は、スタックに別のトークンを追加して、再試行してください。
すべての状態とルールは、parse.yで定義されています。このファイルは、Cにある実際のパーサーを生成するためにbisonパーサージェネレーターによって処理されます。
-
Rubyでの静的分析
ソースコードを解析して、すべてのメソッド、それらが定義されている場所、およびそれらが取る引数を見つけたいとします。 どうすればこれができますか? あなたの最初のアイデアはそれのために正規表現を書くことかもしれません… しかし、もっと良い方法はありますか? はい! 静的分析 は、ソースコード自体から情報を抽出する必要がある場合に使用できる手法です。 これは、ソースコードをトークンに変換する(解析する)ことによって行われます。 さっそく始めましょう! パーサージェムの使用 Rubyには標準ライブラリで利用可能なパーサーがあります。名前はRipperです。出力を操作するのは難し
-
Rubyプログラムをデバッグおよび修正する方法
あなたのプログラムは、最初にあなたが望むことを正確に実行する頻度はどれくらいですか? 多くの場合、プログラムは期待どおりに機能しないため、ルビーのデバッグの技術を使用する必要があります。 理由を見つけるのに役立ちます。 次のエラーメッセージに精通している可能性があります。 undefined method some_method for nil:NilClass これは、nil値がコードへの道を見つけることができたことを意味します。 この記事で説明する手法を使用して、この問題や同様の問題に対処する方法を学びます。 エラーとスタックトレースを理解する Rubyインタープリターからエラー