2009-10-08 36 views
0

我已經共享了包含解析器的上下文無關語法的類定義的頭文件。你能否評論這個設計? 此代碼適用於我的實驗室作業。 也許我們可以從這段代碼中得到一些很好的編程技巧。是類層次好還是太複雜。解析器的上下文無關語法表示有多好?

#ifndef CFG_H 
#define CFG_H 

#include <iostream> 
#include <set> 
#include <list> 

using namespace std; 



class Terminal; 


class CfgSymbol 
{ 
protected: 
    char ch; 
    set<Terminal*> first; 
    set<Terminal*> follow; 

public: 
    CfgSymbol() 
    { 
     ch = '\0'; 
    } 

    CfgSymbol(char c) : ch(c) 
    { 
    } 

    virtual void computeFirst() = 0; 
}; 


class Terminal: public CfgSymbol 
{ 
private: 

public: 
    Terminal(): CfgSymbol() 
    { 
    } 

    Terminal(char c) : CfgSymbol(c) 
    { 
     computeFirst(); 
    } 

    virtual void computeFirst() 
    { 
     first->insert(this); 
    } 

}; 

class NonTerminal: public CfgSymbol 
{ 
private: 

public: 
    virtual void computeFirst(); 
    virtual void computeFollow(); 
}; 

class SymbolString 
{ 
public: 
    CfgProduction* prd; 
    list<CfgSymbol*> symstr; 

    void computeFirst(); 
    void computeFollow(); 
}; 

class CfgProduction 
{ 
private: 
    NonTerminal lhs; 
    SymbolString rhs; 
public: 
    int add_terminal(char t); 
    int add_nonterminal(char n); 
    int set_lhs(char c); 
}; 

class Cfg 
{ 
public: 
    vector<CfgProduction*> prdList; 

    void addProduction(const CfgProduction& cfg); 
    void computeFirst(); 
    void computeFollow(); 
    void computeFirstFollow(); 

}; 

#endif 
+0

有人請更正代碼標籤。 – 2009-10-08 15:09:19

+3

您需要用4個空格(而不是製表符)縮進整個代碼。順便說一下,將實現放在頭文件中是一個壞主意,除非它是必需的(即模板)。將'使用名稱空間'放在標題中是恕我直言,總是一個壞主意。 – 2009-10-08 15:16:10

+0

好的,但是上下文無關語法的階級層次呢? – 2009-10-08 16:00:44

回答

2

Spirit's documentation應該給你一個很好的介紹grammar實現(帶模板)。不知道你的水平,也許這是太簡單了,但它很有趣:

隨着語法變得複雜,它 是一個好主意,集團化零爲 邏輯模塊。例如,當編寫語言 時,可能明智地將 將表達式和語句放入單獨的語法膠囊中。語法 利用C++類的封裝 屬性。 類的聲明性質使其 非常適合 語法的定義。由於語法不是 以上的類聲明,我們可以在 文件中方便地發佈 。這個想法是,一旦被寫入 並且經過全面測試,語法可以在許多情況下重複使用 。我們現在有 語法庫的概念。

+0

偉大的瞭解新的東西 – 2009-10-08 17:57:54

1

除了模板之外,不應該在頭中編寫實現。標題必須只包含您的班級和功能以及您的成員的簽名。

約定將每個文件只放一個類。編譯更好:Multiple classes in a header file vs. a single header file per class。 但是我認爲如果類的長度少於10行,將許多類放在同一個頭中是正確的。

+1

其中之一,因爲它不回答這個問題,我認爲這將屬於一個評論。 – sbi 2009-10-08 16:11:00

+2

我不認爲根據文件的長度對文件進行分類(或不分類)是一個好主意。國際海事組織的幾個班級屬於同一個標題,如果要麼A)他們是一組完整的相關的小班或B)其中一個是主班,其他班是一整套相當小的幫手和衛星。 – sbi 2009-10-08 16:17:21

+0

我同意你的意見。在我看來,重新組合小班包括你的條件。 – 2009-10-08 17:21:32

2

沒有評論整個事情是沒有意義的。

應該有一些關於如何使用對象實例以及在什麼情況下使用它的冗長描述。

另一方面,我通常從類定義之前的BNF語法定義開始(在註釋中註釋)。然後圍繞語法設計類。