0

・・・何かできることはありますか?

より正確には、キャレット「^」を「§」のようなものに置き換えたいと思います - 確かに、まだ使用されていないキーボードはあまり残っていません。

しばらく考えた後 (途中で実行スクリプト ビルド フェーズを使用して却下されました)、それを行う唯一の方法はカスタム llvm ビルドになると思います。

コンパイラの内部構造を扱う準備ができているとは思えませんが、あるシンボルを別のシンボルに置き換えるのはそれほど難しくないという素朴な希望があります。そして、自分のバージョンのコンパイラを構築して実行するというアイデアは、子供じみた楽しみのためだけに、私をくすぐります。

だから私はllvmソースをいじり始めましたが、驚いたことに、これまでのところどこにも行きませんでした。

このようなことに詳しい方がいらっしゃいましたら、参考になる場所を教えていただけないでしょうか。

それは素晴らしいでしょう!ありがとう!

4

2 に答える 2

3

LLVM の拡張は、特にコンパイラ チームの動きの速さを考えると、少し面倒な作業になる可能性があるため、その必要がないのは良いことです。C プリプロセッサは、概要を説明したのとまったく同じことを実行するために存在します (テキストの置換)。§ は重要なものにエイリアスされていないので、うまく機能する#define § ^はずです。それでも独自のモジュールを作成したい場合は、LLVMがコンパイラの拡張方法を提供しています。

于 2013-05-21T16:29:44.047 に答える
0

実際、このような変更に関連するコードは LLVM の一部ではなく、Clang と呼ばれるその Objective-C フロントエンドの一部です。紛らわしいことに、「Clang」は、Clang と LLVM の両方に基づく C/C++/ObjC コンパイラ全体の名前でもあります。

コンパイラの内部構造を扱う準備ができているとは思えませんが、あるシンボルを別のシンボルに置き換えるのはそれほど難しくないという素朴な希望があります。

そして、あなたは正しいでしょう。あなたがやろうとしていることは、非常に単純な変更です。

実際、^がブロックのみに使用された場合、それは些細な変更になります。レクサーを変更して、§代わりにから「キャレット」トークンを生成するだけ^です。レクサー コードを見て、私の意味を確認してください (^ を検索してください)。

残念ながら、xor にも使用されているため、レクサーとパーサーの両方を変更する必要があります。新しいトークン タイプを追加し、そのトークンを から作成する§レクサー、たとえば以下を追加して実際に何かを行うパーサー:

case tok::section:  // 'section' is the token type you've added
  Res = ParseBlockLiteralExpression();
  break;

(そしてassertの先頭に を固定しParseBlockLiteralExpression()ます)。

ただし、§ は ASCII ではないため、いくつかの問題が発生する可能性があります。ただし、私が知る限り、Clang は UTF-8 でエンコードされたファイルを処理できるはずです。

于 2013-05-21T20:17:08.333 に答える