解析后除草

时间:2012-02-06 00:43:01

标签: java c++ compiler-construction

扫描和解析后。我留下了一系列有效的令牌。我有一些未被解析器捕获的规则,例如“一个类不能同时是抽象的和最终的”。由于有很多这样的规则,我怎样才能有效地清除这些情况呢?

我正在用c ++编写我的java编译器

2 个答案:

答案 0 :(得分:2)

关于有效结构的“规则”通常称为“静态语义”。要处理此类规则,通常需要:

  • 程序的抽象语法树,以及它引用的那些实体(例如,其他程序,类等)
  • 符号表,与每个标识符,与该标识符相关的声明以及与该声明关联的关键信息相关联,通常称为“类型”
  • 计算文本的每个复合片段(例如,表达式)的类型的能力

使用此信息,您基本上实现了所有静态语义。例如,“类不能是最终的和抽象的”要求类的符号与属性final和abstract相关联,您的解析器/符号在遇到声明时执行该关联,并且您实际上扫描了完成构造后的符号表条目,并检查两个属性是否同时存在。 (您可以通过其他方式实现,但净效果相同)。

如果碰巧是用你的语言意外地“接近”彼此,那么可以在没有所有这些机器的情况下检查一些东西。我不是Java专家,但如果必须在同一个类的declation上声明“abstract”和“final”,你可能会破解一个检查,禁止关键字“class”附近的那些关键字,但那只是是一个黑客,在任何情况下都不可靠。

你暗示你正在写一个(完整的)Java编译器,说“你的编译器”和“我有规则(应该被捕获)”。你需要构建以上所有内容,或者只是接受别人完成所有这些的完整版本。您会发现构建所有这些元素对于熟悉它们的人来说并不容易,因为现代语言如Java具有非常复杂的语法,作用域规则和类型系统。

鉴于您似乎不熟悉这些需求,甚至还没有尝试构建AST,我认为您在短期内产生结果的希望并不好。我建议你回顾一下你的目标;如果您是学生,在开始之前需要更多背景知识。

答案 1 :(得分:0)

您没有描述解析器的机制,但我会假设您在解析源代码时正在构建某种形式的abstract syntax tree。当您在树中创建节点时,您应该能够轻松地将规则插入到此框架中。

例如,您可能拥有Java“类”节点的C ++类,并且在解析时构造此节点时,您可以检查任何关联的规则并在违反任何规则时抛出异常。