Compilation 我应该使用flex/yacc编写Direct3D着色器模型语言编译器吗?

Compilation 我应该使用flex/yacc编写Direct3D着色器模型语言编译器吗?,compilation,yacc,direct3d,flex-lexer,Compilation,Yacc,Direct3d,Flex Lexer,我将为Direct3D的着色器模型语言创建一个编译器。编译器的目标平台和开发环境是在Windows/VC++上。 对于那些不熟悉着色器模型语言的人,下面是该语言包含的指令示例(有些指令有点过时,但语法基本上与我将使用的版本相同) 我正在考虑将flex/yacc作为开发编译器的框架。这些适合这份工作吗?在C++语言中有没有更好的开发框架?< p>。在我看来,一个正常的词法分析器和/或语法分析器通常对编写汇编程序没有多大帮助。它们在处理相对复杂的语法时最有帮助,但对于汇编程序来说,“语法”通常是

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


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

< p>。在我看来,一个正常的词法分析器和/或语法分析器通常对编写汇编程序没有多大帮助。它们在处理相对复杂的语法时最有帮助,但对于汇编程序来说,“语法”通常是非常琐碎的,因此这样的生成器是阻碍而不是帮助

典型的汇编程序大多是表驱动的——首先创建一个定义了操作码的表,以及它将生成的指令的特征(例如,必须为它指定的寄存器的数量和类型)。通常,您有一个表(对于着色器来说,较小,可能小得多)来定义如何对寻址模式等进行编码

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

当然,还有一些地方需要处理得比这多一点。当您定义标签之类的内容时,它必须在符号表中记录该标签的名称和位置。当它遇到类似该地址的分支时,它必须查找目标并对其地址进行适当编码

只有当/如果您决定支持宏时,您才会与基本模型有很大的不同。根据使用它们的详细程度,使用解析器生成器之类的宏扩展工具可能是值得的。此外,考虑到着色器大多非常小,对于这样的汇编器,宏不太可能是一个非常高的优先级

编辑:重读一遍,我可能应该澄清/纠正一点。与其说语法本身变得复杂,不如说语法允许复杂的语句,还不如说语法生成器的用途。考虑一个非常琐碎的语法:

expression := expression '+' value
            | expression '-' value
            | value
即使这只允许加法和减法运算,它仍然定义了任意复杂的语句(或者至少定义了任意长的加减值字符串)。当然,即使是一个相当简单的实际语言,我们通常也会有乘法、除法、函数调用等


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

在我看来,普通的词法分析器和/或解析器生成器通常对编写汇编程序没有多大帮助。它们在处理相对复杂的语法时最有帮助,但对于汇编程序来说,“语法”通常是非常琐碎的,因此这样的生成器是阻碍而不是帮助

典型的汇编程序大多是表驱动的——首先创建一个定义了操作码的表,以及它将生成的指令的特征(例如,必须为它指定的寄存器的数量和类型)。通常,您有一个表(对于着色器来说,较小,可能小得多)来定义如何对寻址模式等进行编码

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

当然,还有一些地方需要处理得比这多一点。当您定义标签之类的内容时,它必须在符号表中记录该标签的名称和位置。当它遇到类似该地址的分支时,它必须查找目标并对其地址进行适当编码

只有当/如果您决定支持宏时,您才会与基本模型有很大的不同。根据使用它们的详细程度,使用解析器生成器之类的宏扩展工具可能是值得的。此外,考虑到着色器大多非常小,对于这样的汇编器,宏不太可能是一个非常高的优先级

编辑:重读一遍,我可能应该澄清/纠正一点。与其说语法本身变得复杂,不如说语法允许复杂的语句,还不如说语法生成器的用途。考虑一个非常琐碎的语法:

expression := expression '+' value
            | expression '-' value
            | value
即使这只允许加法和减法运算,它仍然定义了任意复杂的语句(或者至少定义了任意长的加减值字符串)。当然,即使是一个相当简单的实际语言,我们通常也会有乘法、除法、函数调用等


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

您的问题在一个poi上有些不清楚