(背景:灵感来自Is C++ context-free or context-sensitive?,而我正在自己编写一个使用jflex / cup的简单编译器。)
如果使用词法分析器/解析器生成器编写它们,我们如何指定语法?
自代码
a b(c);
可以解释为函数声明或局部变量定义,我们如何在语法定义文件中处理它?
另一个例子可能是令牌“>>”在以下代码中:
std::vector<std::vector<int>> foo;
int a = 1000 >> 4;
由于
答案 0 :(得分:4)
使用词法分析器/解析器生成器编写C ++编译器吗?
这取决于。有些是,有些则不是。
GCC最初确实使用过GNU bison,但几年前用一个手写的解析器重写了它。如果我理解正确的话,主要原因是手动编写解析器可以让你更好地控制解析器状态,特别是保留多少“无关”数据,这样你就可以生成更好的错误消息。 / p>如果使用词法分析器/解析器生成器编写它们,我们如何指定语法?
这取决于您使用的解析器生成器。
自代码
a b(c);
可以解释为函数声明或局部变量定义,我们如何在语法定义文件中处理它?
一些解析器生成器可能足够强大,可以直接处理它。
有些不是。一些功能不足的解析器生成器具有语义动作的概念,允许您将以任意强大的语言编写的代码附加到解析器规则。例如。 yacc允许您将C代码附加到规则。
否则,您必须在语义分析期间处理它。