Parsing 是C++;使用lexer/parser生成器编写?

Parsing 是C++;使用lexer/parser生成器编写?,parsing,compiler-construction,Parsing,Compiler Construction,(背景:灵感来源于,而我自己正在使用jflex/cup编写一个简单的编译器。) 如果它们是使用lexer/parser生成器编写的,我们如何指定语法 既然代码像 a b(c); a b(c); 可以解释为函数声明或局部变量定义,我们如何在语法定义文件中处理它 另一个示例可能是以下代码中的标记“>>”: std::vector<std::vector<int>> foo; int a = 1000 >> 4; std::vector foo; INTA=1

(背景:灵感来源于,而我自己正在使用jflex/cup编写一个简单的编译器。)

如果它们是使用lexer/parser生成器编写的,我们如何指定语法

既然代码像

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

另一个示例可能是以下代码中的标记“>>”:

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

< >使用C++语言编写的C++编译器吗? 视情况而定。有些是,有些不是

GCC最初确实使用GNUbison,但几年前用手写解析器重新编写。如果我理解正确的话,主要原因是手工编写解析器可以让您更好地控制解析器的状态,特别是要保留多少“无关”数据,以便生成更好的错误消息

如果它们是使用lexer/parser生成器编写的,我们如何指定语法

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

既然代码像

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

一些解析器生成器可能足够强大,可以直接处理这个问题

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

否则,您将不得不在语义分析期间处理它

< >使用C++语言编写的C++编译器吗? 视情况而定。有些是,有些不是

GCC最初确实使用GNUbison,但几年前用手写解析器重新编写。如果我理解正确的话,主要原因是手工编写解析器可以让您更好地控制解析器的状态,特别是要保留多少“无关”数据,以便生成更好的错误消息

如果它们是使用lexer/parser生成器编写的,我们如何指定语法

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

既然代码像

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

一些解析器生成器可能足够强大,可以直接处理这个问题

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

否则,您将不得不在语义分析期间处理它