2015-09-12 17 views
1

我正在尝试构建一个编译器,目前我已经完全迷失了。我有一个主类,并希望能够与继承申报的其他类,即class newClass extends classThatHasBeenDeclaredBefore { }我输入看起来像在语法中获取列表

input:  
    class_main class_list { /* New program created */ } 

和我class_list包括我在我的程序中所有类的,也可以是空的。

一个简单的类声明如下:

class_decl: 
    CLASS_KWORD CLASS_ID 
     OPENCURLYBRACE 
      attributes_list 
      method_list 
     CLOSEDCURLYBRACE { /* Ok new class is created */} 

    | CLASS_KWORD CLASS_ID EXTENDS_KWORD CLASS_ID 
     OPENCURLYBRACE 
      attributes_list 
      method_list 
     CLOSEDCURLYBRACE { /* Has CLASS_ID Number 2 been declared before? */ } 
; 

有什么办法,我可以检查第二CLASS_ID已经宣布或之前以某种方式使用?我的想法是,我的class_list无法从我尝试添加新课程的位置获得,但我吮吸OCaml。

回答

1

一个干净的方式来处理像这样的问题是从输入中创建一个抽象语法树。然后,您可以在闲暇时对其应用语义检查。

如果你想在分析过程中做所有的检查,你必须小心地定义你的语法来允许它,并且传递数据结构来定义你到目前为止所看到的。