2015-09-12 4 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

Чистый способ справиться с такими проблемами, как создание абстрактного синтаксического дерева из ввода. Затем вы можете применить семантические проверки к нему на досуге.

Если вы хотите сделать все свои проверки во время разбора, вам нужно будет тщательно определить свою грамматику, чтобы разрешить ее, и передать структуры данных, определяющие то, что вы видели до сих пор.