我已经共享了包含解析器的上下文无关语法的类定义的头文件。你能否评论这个设计? 此代码适用于我的实验室作业。 也许我们可以从这段代码中得到一些很好的编程技巧。是类层次好还是太复杂。解析器的上下文无关语法表示有多好?
#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