我正在使用 Lex 和 YACC(实际上是 Flex 和 Bison)创建一个编译器。该语言允许无限前向引用任何符号(如 C#)。问题是在不知道标识符是什么的情况下解析语言是不可能的。
我所知道的唯一解决方案是对整个源进行 lex,然后进行“广度优先”解析,因此类声明和函数声明等更高级别的内容在使用它们的函数之前得到解析。但是,对于大文件,这会占用大量内存,并且很难用 YACC 处理(我必须为每种类型的声明/正文创建单独的语法)。我还必须手写词法分析器(这不是什么大问题)。
我不太关心效率(尽管它仍然很重要),因为一旦我完成它,我将自己重写编译器,但我希望那个版本很快(所以如果有任何快速通用的不能在 Lex/YACC 中完成但可以手工完成的技术,也请提出建议)。所以现在,易于开发是最重要的因素。
这个问题有什么好的解决方案吗?这通常如何在 C# 或 Java 等语言的编译器中完成?