2009-10-08 38 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语法定义开始(在注释中注释)。然后围绕语法设计类。