使用预处理器更改语言语法

Using Preprocessors to change language Syntax

本文关键字:语言 语法 处理器 预处理      更新时间:2023-10-16

我读到Objective-C是通过使用预处理器指令来添加Smalltalk的特性到C,这让我有点好奇,所以我开始在c++中修补预处理器,只是因为我很无聊,想出了这个:

#include <iostream>
#include <string>
#define Constant const
#define Integer int
#define Real double
#define Boolean bool
#define Character char
#define String string;
#define System system
#define StandardLibrary std
#define OutputStream cout

int main()
{
   Integer i = 1;
   Integer ii = 2;
   Integer iii = ii + i;
   StandardLibrary::OutputStream<<iii;
   System("pause");
   return 0;
}

是的,很明显你可以用预处理器改变名字,但是怎么可能用预处理器把一种语言的特性实现到另一种语言呢?

我不打算通过这个创造自己的语言。我只是好奇它是如何工作的

像Objective C这样的语言可以使用预处理器来实现,但不能使用C预处理器,因为C预处理器语言是相当有限的,即使它是图灵完整的(它可能不是),它充其量是一个非常讨厌的图灵目标。更强大的预处理器将允许对语法进行更重要的更改。

一般来说,预处理器是这样一种程序,它接受一个源文件,并根据某些规则将文本转换为另一组源代码,然后将其编译为例如C代码。

这个想法是在运行下一个编译步骤之前,在源代码上运行C预处理器(gcc -E),它可以针对任何语言(或任何文本文件)运行。然后,所有的#define等将在它们到达实际的编译器之前被翻译。因此,在c#中,例如,您可以这样做:

// illegal C#, but valid for C preprocessor
#define INT_TYPE Int32      
namespace Test
{
   class Program
   {
      static void Main(string[] args)
      {
         INT_TYPE x = 42;
         Console.WriteLine(x);
      }
   }
}

然后,使用C预处理器(gcc -E)预处理代码,然后使用c#编译器成功编译结果。在预处理阶段之后,INT_TYPE声明将被Int32取代。

这种技术对于在几乎任何语言中集成文本宏都很有用(风险由您自己承担)。