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