2

コード内の RPAREN を探す最良の方法は何ですか? たとえば、次の擬似コードがあります。

if(a && (b || "c)"))
  |     ^---------^| CASE A
  ^----------------^ CASE B

たとえば、最初の LPAREN を考えると、最後の RPAREN と一致する必要があります (ケース B)。2 番目の LPAREN を考慮すると、最後の 1 つの RPAREN と一致する必要があります (ケース A)。

"C)"RPAREN を含む文字列がありますが、大文字と小文字を区別する必要があることに注意してください。

ええと... 正規表現について考えますが、それは非常に複雑になると思います(一致する文字列、正規表現が必要であり、RPARENなどを含めることができると別の人が考えることに注意してください)。次に、(コードを介して)手動スキャンを使用して各部分を検出することを考えます(手動正規表現のように)。

私が構築しているコード(独自のプログラミング言語)を解析するためにそれが必要です。そして、高速化するためにいくつかのコードを読み取ることを無視したいと思います。

例えば:

function a() { return 1; }
function b() { return 2; }
alert(b());

この場合、決して使用されないb()ため、解析するだけで済みます。a()したがって、スターター{でスキャンし、実際の まで無視します (ただし、保存します) }。関数が使用されている場合は、解析されます。

私の疑問:

  1. 正規表現または手動コード?
  2. それは良いことですか、それとも悪いことですか?パーサーの速度を向上させるのに役立つコードが使用されていない場合は、コードを無視しますか?
  3. トピック外: パーサーを高速化するためのヒントはありますか? おそらく、言語コードをコンピュータ コード (オペコード???) と共に保存する「事前に解析された」ファイルですか?
4

2 に答える 2

3
  1. 正規表現は親と一致できません-それは不可能です。このような言語を解析する1つの方法は、lex(トークン化)とyacc(パーサー)です。ネット上で多くの情報を見つけることができます。

  2. パーサーに最適化を追加しても、解析が速くなる可能性は低いですが、結果のコードのパフォーマンスを向上させることができます。善と悪は道徳的な判断です、私はそれらがここで何を意味するのかわかりません。

  3. ソース内のパターンを一致させ、プリコンパイルされ最適化されたコードに置き換えると、結果が向上しますが、解析が高速化されるかどうかは、パターンがコードに表示される頻度によって異なります。

于 2012-02-29T04:32:46.457 に答える
2

独自の言語を構築している場合は、言語のソースコードを処理する標準的な方法について実際に学ぶ必要があります。(賢い新しいアイデアを提案することは大歓迎ですが、そのようなアイデアのほとんどはそれほど賢くないことがわかります。標準的なアイデアを知っていれば、その理由は明らかです)。

コードを処理して括弧を純粋な正規表現と「一致」させることは実際にはできません。このようなタスクのコンテキストで「パーサー」と呼ばれることが多い、ネストされたパラメーター(または、中括弧、IF、ENDIFなどに一致する可能性のあるもの)に一致する、ある種のプッシュダウンオートマトンまたはカウントエンジンが必要です。

あなたの3つの質問について:

1)正規表現または手動コード?

代わりに、 ANTLRなどのパーサジェネレータについて学習/使用してください。

2)それは良いことですか悪いことですか?コードが使用されていない場合は、コードを無視して、パーサーの速度を向上させるのに役立ちますか?

これは実際には「時期尚早」の最適化です。単純に高速の解析エンジンを取得する方がよいでしょう。ANTLRはかなり良いです。違いに気付くかどうかは疑問です。速く燃えることを主張する場合は、 代わりにLRSTARを検討してください。これを構築した人は、過去10年間、生成されたパーサーをマイクロ最適化することに費やしました。それらは非常に高速です。

そして、プログラミング言語を実装しようとしていることを考えると、実際にそれを明確に定義し、機能するパーサーを構築し、実用的な方法で実行するのに苦労するというはるかに大きな問題について心配することをお勧めします(それが解釈またはコンパイルを意味するかどうかにかかわらず)関係ない)。構文解析ビジネスについてのあなたの見かけのレベルを考えると、あなたは本当にこれを行う準備ができていないのではないかと思います。コンパイラが一般的にどのように機能するかを学ぶのに時間を費やしたほうがよいので、参照ポイントがあります。

3)オフトピック:パーサーを高速化するためのヒントはありますか?たぶん、言語コードとコンピュータコード(オペコード???)を保存する「事前解析された」ファイルですか?

テキストを前処理してトークンのセットとして保存することにより、パーサーを高速化できます。以前の解析の結果が変更されていないことを前提として保存することで、速度を上げることもできます(大きなコードシステムのほとんどのソースファイルは、大量に再コンパイルされる可能性がありますが、変更されません)。コンパイルされたコードをソーステキストと一緒に何らかの表現で保存して、コンパイルを回避することもできます。[このような個々の関数のコンパイル済みコードを保存することを検討しました。ファイルを編集しても、ほとんどの機能は変わりません]。これらのトリックにはすべて問題があります。これらすべてを設定することで、プログラマーと編集者をどのように協力させるのでしょうか。高速パーサーを作成する方がはるかに簡単です。そこから始めて、後で凝ったトリックについて心配する必要があります。

于 2012-02-29T13:33:56.587 に答える