编译器parsing问题

m
microsat
楼主 (北美华人网)
请问大家在写程序parsing一段代码的时候,
读取问题:
是一个字符一个字符的读; 还是整个代码全部一次性读取?
parsing问题: 是从左到右一个字符一个字符的分析? 还是从两边,向中间,一块字符一块字符的分析?
举个例子
while (x>1) { print x; }
大家是把{ print x;} 整个提取?
还是先提取{ 再提取print x; 最后提取}
后者是以前的旧技术。整个提取听说是当今编译器的最新技术。
旧技术是一个指针。从左到右的读取和分析。 新技术是两个指针,从左右两边同时分别开始读取和分析。
大家说说,你认为哪个更先进?
再举个例子来说明这个问题。 (1+2) * (3+4) 传统方法是从左到右,(, 1, +, 2, ), *, (, 3, +, 4, ) 新方法是从左右两边同时开始 左 (1+2) 右 (3+4) 左 * 右




N
NSGA
这两种读取方法并无先进后进之分。最终都是需要读取全部然后再让FSM来解析syntax。
l
liujan611
回复 1楼microsat的帖子
compiler construction: principles and practise. 这书看过就没这困惑了。
读取和读文本文件的方式有关系,一般逐行/块读,一直到EOF。 先是解析出一个个token。 应用递归下降分析文法,构造AST。
还有一些应用bison,lalr(1)解析器。 或者ANTLR,LL(1)解析器。根据lex/文法定义,抽取生成ast