Zif*_*fre 5 parsing yacc bison forward-reference compiler-development
我正在用Lex和YACC创建一个编译器(实际上是Flex和Bison).该语言允许无限制地向前引用任何符号(如C#).问题是在不知道标识符是什么的情况下解析语言是不可能的.
我所知道的唯一解决方案是对整个源进行修改,然后执行"广度优先"解析,因此在使用它们的函数之前,会对类声明和函数声明等更高级别的内容进行解析.但是,这会占用大文件的大量内存,并且使用YACC很难处理(我必须为每种类型的声明/正文创建单独的语法).我也必须手写lexer(这不是一个很大的问题).
我并不关心效率(尽管它仍然很重要),因为一旦我完成它我就会重写编译器,但是我想要那个版本很快(所以如果有快速通用的话)在Lex/YACC中无法完成但可以手工完成的技术,请同时提出建议.所以现在,易于开发是最重要的因素.
这个问题有什么好的解决方案吗?这通常是如何在C#或Java等语言的编译器中完成的?
它完全可以解析它.虽然标识符和关键字之间存在歧义,但lex会通过优先考虑关键字来满足这一要求.
我没有看到有什么其他问题.您无需在解析阶段确定标识符是否有效.在解析时,您正在构建解析树或抽象语法树(差异很微妙,但与本讨论的目的无关).之后,通过对在解析期间生成的AST执行传递来构建嵌套的符号表结构.然后你对AST进行另一次传递以检查所使用的标识符是否有效.通过AST上的一个或多个附加解析来生成输出代码或其他一些中间数据结构,您就完成了!
编辑:如果你想看看它是如何完成的,检查Mono C#编译器的源代码.这实际上是用C#而不是C或C++编写的,但它确实使用Jay的.NET端口,这与yacc非常相似.