使用词法分析器/解析器生成器编写C ++的编译器吗?

时间:2017-02-05 19:40:06

标签: parsing compiler-construction

(背景:灵感来自Is C++ context-free or context-sensitive?,而我正在自己编写一个使用jflex / cup的简单编译器。)

如果使用词法分析器/解析器生成器编写它们,我们如何指定语法?

自代码

a b(c);

可以解释为函数声明或局部变量定义,我们如何在语法定义文件中处理它

另一个例子可能是令牌“>>”在以下代码中:

std::vector<std::vector<int>> foo;
int a = 1000 >> 4;

由于

1 个答案:

答案 0 :(得分:4)

  

使用词法分析器/解析器生成器编写C ++编译器吗?

这取决于。有些是,有些则不是。

GCC最初确实使用过GNU bison,但几年前用一个手写的解析器重写了它。如果我理解正确的话,主要原因是手动编写解析器可以让你更好地控制解析器状态,特别是保留多少“无关”数据,这样你就可以生成更好的错误消息。 / p>
  

如果使用词法分析器/解析器生成器编写它们,我们如何指定语法?

这取决于您使用的解析器生成器。

  

自代码

a b(c);
     

可以解释为函数声明或局部变量定义,我们如何在语法定义文件中处理它

一些解析器生成器可能足够强大,可以直接处理它。

有些不是。一些功能不足的解析器生成器具有语义动作的概念,允许您将以任意强大的语言编写的代码附加到解析器规则。例如。 yacc允许您将C代码附加到规则。

否则,您必须在语义分析期间处理它。