Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler construction 使用Lex/yacc扫描具有特定头的文件数的最佳方法?_Compiler Construction_Yacc_Lex_Precompiled Headers - Fatal编程技术网

Compiler construction 使用Lex/yacc扫描具有特定头的文件数的最佳方法?

Compiler construction 使用Lex/yacc扫描具有特定头的文件数的最佳方法?,compiler-construction,yacc,lex,precompiled-headers,Compiler Construction,Yacc,Lex,Precompiled Headers,我已经使用yacc定义了自己的语法。我的语言为用户提供了一种灵活性,在调用编译器时显式提供一个额外的头,这将适用于使用我的编译器编译的每个文件 我可以想出两种解决方案来处理这个场景 1.向每个文件追加头文件,并分别编译每个文件。这不是一个好主意,因为它涉及到编辑给定的源文件,需要在文件开头追加 2.使用yywrap迭代要编译的文件列表,并在每次找到新文件时处理头文件。 这是不好的,因为它涉及重复解析同一个文件 如果不处理头文件,文件就不能满足语法要求 请分享想法,如何以最佳方式完成 如果您的编译

我已经使用yacc定义了自己的语法。我的语言为用户提供了一种灵活性,在调用编译器时显式提供一个额外的头,这将适用于使用我的编译器编译的每个文件

我可以想出两种解决方案来处理这个场景

1.向每个文件追加头文件,并分别编译每个文件。这不是一个好主意,因为它涉及到编辑给定的源文件,需要在文件开头追加

2.使用yywrap迭代要编译的文件列表,并在每次找到新文件时处理头文件。 这是不好的,因为它涉及重复解析同一个文件

如果不处理头文件,文件就不能满足语法要求


请分享想法,如何以最佳方式完成

如果您的编译器打算独立编译多个文件,而不是简单地将它们连接起来并作为单个单元编译,并且每个输入文件都需要头文件,那么您除了在处理每个输入文件时包含头文件外别无选择。您可以使用
yywrap
机制,或者使用
yy_create_buffer
yy_switch_to_buffer
显式切换缓冲区。有关更多详细信息和示例代码,请参阅

正如您所指出的,该解决方案涉及到为每个输入文件重新分析头文件,这可能非常耗时

如果您的解析除了创建AST之外没有任何效果,AST稍后将被处理以生成编译的输出或其他分析,那么您可以通过为头文件创建一次AST,然后从头文件的AST的副本开始为每个输入文件构建AST,从而使此过程更加高效


您甚至可以序列化头文件的AST,然后读取序列化版本,而不是重新对其进行分析,不过您需要有一些逻辑来验证序列化的AST是否对应于头文件的最新版本。此机制()由许多C/C++编译器(例如,)以不同的形式实现。

如果您的编译器打算独立编译多个文件,而不是简单地将它们串联并编译为单个单元,并且每个输入文件都需要头文件,然后,您别无选择,只能在处理每个输入文件时包含它。您可以使用
yywrap
机制,或者使用
yy_create_buffer
yy_switch_to_buffer
显式切换缓冲区。有关更多详细信息和示例代码,请参阅

正如您所指出的,该解决方案涉及到为每个输入文件重新分析头文件,这可能非常耗时

如果您的解析除了创建AST之外没有任何效果,AST稍后将被处理以生成编译的输出或其他分析,那么您可以通过为头文件创建一次AST,然后从头文件的AST的副本开始为每个输入文件构建AST,从而使此过程更加高效


您甚至可以序列化头文件的AST,然后读取序列化版本,而不是重新对其进行分析,不过您需要有一些逻辑来验证序列化的AST是否对应于头文件的最新版本。此机制()由许多C/C++编译器(例如,)以不同的形式实现。

如果您的编译器打算独立编译多个文件,而不是简单地将它们串联并编译为单个单元,并且每个输入文件都需要头文件,然后,您别无选择,只能在处理每个输入文件时包含它。您可以使用
yywrap
机制,或者使用
yy_create_buffer
yy_switch_to_buffer
显式切换缓冲区。有关更多详细信息和示例代码,请参阅

正如您所指出的,该解决方案涉及到为每个输入文件重新分析头文件,这可能非常耗时

如果您的解析除了创建AST之外没有任何效果,AST稍后将被处理以生成编译的输出或其他分析,那么您可以通过为头文件创建一次AST,然后从头文件的AST的副本开始为每个输入文件构建AST,从而使此过程更加高效


您甚至可以序列化头文件的AST,然后读取序列化版本,而不是重新对其进行分析,不过您需要有一些逻辑来验证序列化的AST是否对应于头文件的最新版本。此机制()由许多C/C++编译器(例如,)以不同的形式实现。

如果您的编译器打算独立编译多个文件,而不是简单地将它们串联并编译为单个单元,并且每个输入文件都需要头文件,然后,您别无选择,只能在处理每个输入文件时包含它。您可以使用
yywrap
机制,或者使用
yy_create_buffer
yy_switch_to_buffer
显式切换缓冲区。有关更多详细信息和示例代码,请参阅

正如您所指出的,该解决方案涉及到为每个输入文件重新分析头文件,这可能非常耗时

如果您的解析除了创建AST之外没有任何效果,AST稍后将被处理以生成编译的输出或其他分析,那么您可以通过为头文件创建一次AST,然后从头文件的AST的副本开始为每个输入文件构建AST,从而使此过程更加高效

您甚至可以序列化头文件的AST,然后读取序列化版本,而不是重新对其进行分析,尽管