0

...有什么我可以做的吗?

更准确地说,我想将插入符号“^”替换为“§”之类的东西——当然,键盘上已经没有多少没有使用的东西了。

在考虑了一段时间之后(沿途使用运行脚本构建阶段被解雇)我认为唯一的方法是自定义 llvm 构建。

虽然我认为我还没有准备好处理编译器的内部,但我天真地希望用另一个符号替换一个符号并不太难。构建和运行我自己的编译器版本的想法让我很兴奋,只是为了获得很多幼稚的乐趣。

所以我开始在 llvm 资源中四处寻找,但是 - 令人惊讶的是 - 到目前为止一无所获。

如果有人熟悉这类事情,请您指点我看的地方吗?

那将是真棒!谢谢!

4

2 回答 2

3

扩展 LLVM 可能有点麻烦,特别是考虑到编译器团队的快速移动,所以你不必这样做是件好事。C 预处理器的存在是为了执行您概述的完全相同的事情(文本替换)。我相当确定 § 没有任何重要的别名,所以#define § ^应该很好用。如果您仍想编写自己的模块,LLVM提供了有关如何扩展其编译器的说明。

于 2013-05-21T16:29:44.047 回答
0

实际上,与这种更改相关的代码根本不是 LLVM 的一部分,而是它的 Objective-C 前端的一部分,称为 Clang。令人困惑的是,“Clang”也是基于 Clang 和 LLVM 的整个 C/C++/ObjC 编译器的名称。

虽然我认为我还没有准备好处理编译器的内部,但我天真地希望用另一个符号替换一个符号并不太难。

你是对的。你想要做的是非常简单的改变。

实际上,如果^用于块,这将是一个微不足道的更改 - 只需修改词法分析器以从而不是生成“插入符号”标记:查看词法分析器代码以了解我的意思(搜索 ^)。§^

不幸的是,它也用于异或,所以我们必须同时修改词法分析器和解析器。词法分析器添加一个新的标记类型从中创建该标记§解析器实际使用它做一些事情,例如通过添加:

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 回答