【转】Vczh Library++ 3.0之可配置语法分析器(设计文法表达式)

从网上无意间看到这个系列的文章,作者非常有想法,转下来慢慢研究,好好学习。   祝大家学习愉快,做自己的爱好 ^_^ !

  上一篇文章中我们看到了可配置语法分析器使用起来的样子,在这篇文章中我将告诉大家如何通过重载操作符的方法构造文法表达式树,从而使用递归向下法进行语法分析的工作。

    在这之前我们将研究一下什么是文法表达式。我们将文法表达式看成分析器,于是复杂的文法表达式就是由简单的分析器通过各种方法组合起来的复杂分析器。一个分析器有以下几个属性:

    1:输入类型。输入类型通常是一个字符串的指针还是迭代器什么的,具体类型不重要,重要的是输入状态必须能被复制,能跳到下一个元素。当然wchar_t*也满足这种要求,但是我们为了通用性(譬如可以为你自己的容器扩展出一个输入迭代器)我们采用类似STL的迭代器的方法,也就是concept(这并没有包含其技巧,只是概念)来实现。然后库将为一些基本的东西提供默认的迭代器,譬如IEnumerable<T>(嗯嗯,这不是C#,已经被Vczh Library++实现了。容器采用了一种泛型+接口的方法,但是在不必要的情况下允许不支付虚函数的代价,不过这根本章内容无关,以后再谈),或者WString和AString。

    2:输出类型。输出类型一般包含两个方面。第一个是成功后的结果,第二个是失败后的错误信息。怎么让可配置语法分析器在恰当的地方输出类型也是一个很复杂的问题,不过这根本章内容无关,下一篇文章接着讲这个细节。在这里我们先忽略错误信息,就如同正则表达式拒绝匹配一个字符串也不会告诉你为什么一样。

    我们可以通过这两种属性来构造出一个文法表达式的基类。表达式树通常用基类+若干子类的方法来实现,有了基类等于定下了子类的基调。

1  template < typename I, typename O >
2  class  Expression
3  {
4  public :
5     virtual  Maybe < O >  Parse(I &  input) = 0 ;
6  };


    Maybe指的是里面可以有类型O的值,或者什么都没有。这额外的信息可以添加一个bool来表达,这里就不赘叙了。到了这里我们明白一个表达式树的重点不是其内容,而是分析输入的算法。因此我们可以组合出连接、分支和循环:

 1  template < typename I, typename O1, typename O2 >
 2  class  Sequence :  public  Expression < I, ParsingPair < O1, O2 >> ;
 3  {
 4  public :
 5    Ptr < Expression < I, O1 >>  left;
 6    Ptr < Expression < I, O2 >>  right;
 7 
 8    Maybe < ParsingPair < O1, O2 >>  Parse(I &  input);
 9  };
10 
11  template < typename I, typename O >
12  class  Alternate :  public  Expression < I, O > ;
13  {
14  public :
15    Ptr < Expression < I, O >>  left;
16    Ptr < Expression < I, O >>  right;
17 
18    Maybe < O >  Parse(I &  input);
19  };
20 
21  template < typename I, typename O >
22  class  Loop :  public  Expression < I, ParsingList < O >> ;
23  {
24  public :
25    Ptr < Expression < I, O >>  element;
26     int  min;
27     int  max;
28 
29    Maybe < ParsingList < O >>  Parse(I &  input);
30  };


    这就是连接、分支和循环的声明了。现在我们可以很清楚的了解什么是带类型的文法了。类型主要指的是输出类型,而输入类型肯定是不能变化的。ParsingPair<A, B>就是一个带两个数据的结构,而ParsingList<T>是一个链表。做成这样主要是为了在传递他们的时候不要做太多浪费的复制工作,在这里我们只需要了解其概念就好了。

    每一种组合都对子文法的类型有着一些要求,譬如说分支要求左右文法表达式的类型是一样的。而且输出类型是通过子文法的类型计算而得到的。Ptr<T>是智能指针,在这里使用主要是为了避免复制的时候出现问题。智能指针在这种数据结构下还是十分好用的,反正构造和析构一条文法的效率都是无关紧要的,不要太慢就可以了。

    但是我们如何重载操作符来组合文法表达式呢?其实文法表达式最终产生的结果都是Ptr<Expression<I, O>>,Ptr的操作符重载是不能修改的,所以我们还要一个代理类:

 1  template < typename I, typename O >
 2  class  Node
 3  {
 4  public :
 5    Ptr < Expression < I, O >>  expression;
 6  };
 7 
 8  template < typename I, typename O >
 9  Node < I, O >   operator | ( const  Node < I, O >&  left,  const  Node < I, O >&  right);
10 
11  template < typename I, typename O1, typename O2 >
12  Node < I, ParsingPair < O1, O2 >>   operator + ( const  Node < I, O1 >&  left,  const  Node < I, O2 >&  right);
13 
14  // 除了+以外,还可以继承*啊,或者干脆写个loop(node, min, max)什么的
15  template < typename I, typename O >
16  Node < I, ParsingList < O >>   operator + ( const  Node < I, O >&  element);


    我们就可以在每一个操作符重载里面将各自Node的expression成员变量拿出来,然后通过构造上面提供的Sequence、Alternate和Loop来构造更加复杂的文法表达式,最后重新装进一个Node<I, O>里面就行了。

    这就是我们可以将文法写进C++的小技巧。下一篇文章我们将会了解到表达式的每一个Parse函数内部都做了些什么。

转载于:https://www.cnblogs.com/xuangong/archive/2011/07/31/2122662.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
1. 智慧监狱概述 智慧监狱的建设背景基于监狱信息化的发展历程,从最初的数字化监狱到信息化监狱,最终发展到智慧监狱。智慧监狱强调管理的精细化、监管的一体化、改造的科学化以及办公的无纸化。政策上,自2017年以来,司法部连续发布了多项指导性文件,推动智慧监狱的建设。 2. 内在需求与挑战 智慧监狱的内在需求包括数据应用与共享的不足、安防系统的单一功能、IT架构的复杂性、信息安全建设的薄弱以及IT运维的人工依赖。这些挑战要求监狱系统进行改革,以实现数据的深度利用和业务的智能化。 3. 技术架构与设计 智慧监狱的技术架构包括统一门户、信息安全、综合运维、安防集成平台和大数据平台。设计上,智慧监狱采用云计算、物联网、大数据和人工智能等技术,实现资源的动态分配、业务的快速部署和安全的主动防护。 4. 数据治理与应用 监狱数据应用现状面临数据分散和共享不足的问题。智慧监狱通过构建数据共享交换体系、数据治理工具及服务,以及基于数据仓库的数据分析模型,提升了数据的利用效率和决策支持能力。 5. 安全与运维 智慧监狱的信息安全建设涵盖了大数据应用、安全管理区、业务区等多个层面,确保了数据的安全和系统的稳定运行。同时,综合运维平台的建立,实现了IT系统的统一管理和自动化运维,提高了运维效率和系统的可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值