0

我将为 Direct3D 的着色器模型语言创建一个编译器。编译器的目标平台和开发环境在 Windows/VC++ 上。对于那些不熟悉着色器模型语言的人,这里是该语言所包含的指令示例(有些指令有点过时,但语法与我将使用的版本基本相同)。

这里

和这里

我正在考虑将 flex/yacc 作为开发编译器的框架。这些适合这份工作吗?有没有更好的原生 C++ 开发框架?

4

1 回答 1

3

在我看来,普通的词法分析器和/或解析器生成器通常对编写汇编器没有多大帮助。它们主要有助于处理相对复杂的语法,但在汇编程序的情况下,“语法”通常是如此微不足道,以至于这样的生成器是障碍多于帮助。

典型的汇编程序主要是表驱动的——首先创建一个定义的操作码表,以及它将生成的指令的特征(例如,必须为其指定的寄存器的数量和类型)。您通常有一个(更小,在着色器的情况下,可能小得多)表定义如何编码寻址模式等。

大多数汇编程序通过查询该表来工作——即,它从输入中读取一些内容,并尝试在表中查找它。如果它不存在,它会给出一条错误消息,说它是一个未知的操作码。如果找到,它会从表中获取有关与该操作码关联的操作数数量的信息。它试图读取那么多操作数。如果不能,它会给出一个错误,说明指令有问题。如果可以,它会对指令进行编码,然后重新开始。

当然,还有一些地方需要处理更多的事情。在哪里/当您定义诸如标签之类的东西时,它必须在符号表中记录该标签的名称和位置。当它遇到类似于该地址的分支时,它必须查找目标并适当地对其地址进行编码。

只有当/如果您决定支持宏时,您才会远离该基本模型。根据您对它们的详细程度,使用解析器生成器等用于宏扩展工具可能是值得的。再说一次,鉴于着色器大多非常小,宏不太可能成为此类汇编器的高优先级。

编辑:重读它,我可能应该澄清/纠正一点。当语法本身变得复杂时,解析器生成器的使用并不多,因为当语法允许复杂的语句时。考虑一个非常简单的语法:

expression := expression '+' value
            | expression '-' value
            | value

即使这只允许加减,它仍然定义了任意复杂的语句(或者至少是任意长的加减值字符串)。当然,即使是相当琐碎的真实语言,我们通常也会有乘法、除法、函数调用等。

这与典型的汇编语言有很大不同,其中每条指令都有固定的格式。例如,加法或减法运算恰好有两个源操作数和一个目标操作数。

于 2010-02-10T22:23:54.077 回答