我创建与lex和yacc(实际上Flex和野牛)编译器。语言允许无限的正向引用任何符号(如C#)。的问题是,它不可能解析语言不知道的标识符是什么。

我所知道的唯一的解决办法是LEX整个源,然后做一个“广度优先”解析,例如类的声明和函数声明,以更高层次的东西得到使用它们的函数之前解析。然而,这将需要大量的内存大文件,这将是很难用YACC处理(我必须为每种类型的声明/身体的创建单独的语法)。我还必须手动编写词法分析器(这是不是太大的问题)。

我不在乎了一大堆关于效率(尽管它仍然是很重要的),因为我要重写编译器本身,一旦我完成它,但我想那个版本要快(所以如果有不能在莱克斯/ YACC做到,但可以通过手工来完成任何快速的通用技术,也请您建议他们)。所以,现在,易于开发是最重要的因素。

有没有对这个问题有什么好的解决办法?如何在编译器这通常做了如C#或Java?

语言
有帮助吗?

解决方案

这是完全可能的解析它。虽然标识符和关键字之间的模糊性,法会很乐意与给予关键字优先处理。

我看不出有什么其他的问题也有。你并不需要确定标识符,在分析阶段是有效的。您正在建设无论是分析树或抽象语法树(所不同的是微妙的,但无关本次讨论的目的)为您解析。之后,你通过执行过你解析过程中产生的AST建立自己的嵌套符号表的结构。然后,你做的是另传过来的AST检查使用的标识符是有效的。与一个或多个额外的解析关注这个在AST生成输出代码,或者一些其他的中间数据结构,大功告成!

编辑:如果你想看看它是如何做,检查Mono的C#编译器的源代码。这实际上是C#编写的,而不是C或C ++,但它确实使用周杰伦的.NET端口,其非常类似于YACC。

其他提示

一个选项是处理仅通过扫描和缓存令牌向前引用,直到你碰到了什么东西,你知道如何真正与(有点像“恐慌模式”错误恢复)。一旦你已经运行以为完整的文件,回去尝试重新解析之前没有解析位。

对于具有手写词法分析器;不,使用法,就可以正常解析,只是通过一个手写的垫片,可以让你回去从缓存饲料解析器以及法使什么读取它。

至于做一些语法,一点乐趣与对YACC文件的预处理器,你应该能够让他们都出相同的原始源

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top