Parsing 是C++;使用lexer/parser生成器编写?
(背景:灵感来源于,而我自己正在使用jflex/cup编写一个简单的编译器。) 如果它们是使用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
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代码附加到规则
否则,您将不得不在语义分析期间处理它