我已經共享了包含解析器的上下文無關語法的類定義的頭文件。你能否評論這個設計? 此代碼適用於我的實驗室作業。 也許我們可以從這段代碼中得到一些很好的編程技巧。是類層次好還是太複雜。解析器的上下文無關語法表示有多好?
#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
有人請更正代碼標籤。 – 2009-10-08 15:09:19
您需要用4個空格(而不是製表符)縮進整個代碼。順便說一下,將實現放在頭文件中是一個壞主意,除非它是必需的(即模板)。將'使用名稱空間'放在標題中是恕我直言,總是一個壞主意。 – 2009-10-08 15:16:10
好的,但是上下文無關語法的階級層次呢? – 2009-10-08 16:00:44