【发布时间】:2009-10-08 15:08:22
【问题描述】:
我已共享包含用于解析器的上下文无关语法的类定义的头文件。你能评论一下这个设计吗? 此代码用于我的实验室作业。 也许我们可以从这段代码中得到一些好的编程技巧。类层次结构好还是太复杂。
#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
【问题讨论】:
-
有人请更正代码标签。
-
您需要将整个代码缩进 4 个空格(而不是制表符)。顺便说一句,除非有必要(即模板),否则将实现放在标题中是一个坏主意。并且将
using namespace放在标题中是恕我直言总是一个坏主意。 -
好的,但是上下文无关语法的类层次结构呢。
-
这看起来像复合设计模式吗? en.wikipedia.org/wiki/Composite_pattern