用C++对C++语法格式进行分析

前言

最近c++项目需要用到脚本,这就关系到如何绑定对象到脚本运行环境。因使用到多套脚本语言,所以现有的绑定技术,都不能满足需求。所以只能寻求解析c++的头文件,再根据描述进行绑定。起初发现boost有一套,但boost实在太臃肿了,对项目之后开发环境的搭建有一定要求。我力求最简明的项目管理,boost不太适合。自己写套吧。

正文

C++的语法格式总结

除编译器指令#开头与函数外,均必须要求分号结尾

代码块除单条语句的if、do/while、for都必须在大括号/花括号“{}”

代码块有8种,命名空间,全局,类,结构,全局函数,成员函数,lambda,函数内无名代码块

命名空间与全局相同,仅在声明前加“命名空间::”前缀

立即学习“C++免费学习笔记(深入)”;

类声明块与全局块的区别有,友元声明,成员访问权限

模板支持类与函数

函数与模板有参数列表

分号结尾的声明可以是内置类型(int、double等)、类、模板类、typedef出来的类型、函数指针、lambda

函数可以重名

类的成员函数访问其他成员可以在此函数定义之后声明,并不像全局函数那样必须已经声明,所以用指针扫描一次C++文件是否合法是做不到的

若是类化的枚举(enum class),不需要对声明所在范围可见,否则同时要把成员也同时添加到所属范围

我不打算支持的,对于需求没有必要性的

命名空间

模板

函数体

逗号分割的多个变量我不想很好的支持

类型的校验

默认参数

union

枚举不判断名称冲突

lambda

变量名不能以数字开始

类的继承

函数指针

开发的原则

暂不跨平台,仅VS,不使用系统API这样适于修改为跨平台

使用C++

iter只进不退

遇到语法错误或文件结尾,抛异常

遇到{则进入块处理

处理;结尾的语言单元,函数必须自己处理完;及之前的内容再返回

成员函数定义代码不分析,因为第一条原则做不到,成员函数可能会引用还未声明的其他成员函数

不为最好的性能,但可以在这个结构上优化到极致

不求完整解析,但在这个框架上可以做到解析全部c++11与更高的版本特性

无注释,英文不好,中文注释又不适合全球化

 

结构描述

variant,method,type,comment,enumeration,enumeration_value从object继承,它们都可以属于全局或类或结构体。

document表示一个c++编译单元。

context表示一个上下文,是一个可以向上查找的队列。document完成解析后存储解析出来的变量、函数、类型。

reader,文件读取器,一个向前的char迭代器,可以用istreambuf_iterator(ifstream)替代。

 

使用

main函数有_DEBUG宏保护,建议编译为库release使用。

#include

try

{
 auto result = cpp_analysis::analysis(“[cpp_header_file]”);

 // todo

}
catch (logic_error& e)
{

// todo:
}

项目位置

https://github.com/FettLuo/cpp_analysis[新标签打开]

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2445734.html

(0)
上一篇 2025年3月3日 16:13:16
下一篇 2025年3月3日 16:13:33

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 子对话框的创建与销毁

    1.显示对话框 1.1显示模式对话框: CDialogDemo dlg;dlg.DoModal(); 登录后复制 1.2 显示非模式对话框: CDialogDemo *dlg=new CDialogDemo(this); dlg->C…

    编程技术 2025年3月3日
    000
  • C++静态成员与常成员的使用

    1、 实验目的 (1)学习静态成员的使用 (2)学习常成员的使用 (3)掌握静态数据成员与常数据成员的初始化 2、实验内容 (1)某商店经销一种货物,货物成箱购进,成箱卖出,购进和卖出时以重量为单位,各箱的重量不一样,因此,商店需要记录下目…

    2025年3月3日
    200
  • C# 如何调用 C++ DLL中的函数接口和回调函数

    1、c#中大部分基本数据类型都和c++的基本数据类型相同,因此基本数据类型的转换比较简单,需要注意的就是字节大小。 2、c++数组和c#的数组转换需要注意的就是需要注意,需要增加声明如[marshalas(unmanagedtype.byv…

    编程技术 2025年3月3日
    200
  • c++中向任意目录下写文件

    今天遇到了在c盘的子目录下写文件出错的事情,最中自己实验后解决。小小记录一下。 代码如下: #include#include#include main(){ int data[35]; int n=35,temp; for(int i=0;…

    2025年3月3日
    200
  • C#实现一个最简单的HTTP服务器

     简介   本文用c#实现了一个最简单的http服务器类,你可以将它嵌入到自己的项目中,或者也可以阅读代码来学习关于http协议的知识。  背景   高性能的WEB应用一般都架设在强大的WEB服务器上,例如IIS, Apache, 和Tom…

    编程技术 2025年3月3日
    200
  • C# 程序员最常犯的 10 个错误

     关于C#   c#是达成微软公共语言运行库(clr)的少数语言中的一种。达成clr的语言可以受益于其带来的特性,如跨语言集成、异常处理、安全性增强、部件组合的简易模型以及调试和分析服务。作为现代的clr语言,c#是应用最为广泛的,其应用场…

    编程技术 2025年3月3日
    200
  • C#的未来计划

     在ndc london上,mads torgersen提出了对未来c#语言的的计划。需要注意的是,这些只是计划,不会保证在哪个版本发布。damien guard对这些建议进行了总结和简要的分析,我们在此为您挑选了其中的一些内容。  只读属…

    编程技术 2025年3月3日
    200
  • C# 的三种序列化方法

      序列化是将一个对象转换成字节流以达到将其长期保存在内存、数据库或文件中的处理过程。它的主要目的是保存对象的状态以便以后需要的时候使用。与其相反的过程叫做反序列化。   序列化一个对象   为了序列化一个对象,我们需要一个被序列化的对象,…

    编程技术 2025年3月3日
    200
  • 理解模型,视图和控制器(C#,asp.net)

     这篇文章向你提供asp.net mvc 模型,视图和控制的高度概览。换句话说,解释一下asp.net mvc中的 ‘m’, ‘v’, 和 ‘c’。   看完这篇文章以后,你应该就能理解ASP.NET MVC的不同部分是如何共同工作的。而且…

    2025年3月3日 编程技术
    200
  • 能让你成为更优秀程序员的10个C语言资源

    一些人觉得编程无聊,一些人觉得它很好玩。但每个程序员都必须紧跟编程语言的潮流。大多数程序员都是从c开始学习编程的,因为c是用来写操作系统、应用程序最常用的语言。 C编程笔记 这些是华盛顿实验学院C编程入门课的部分笔记。它们是以《C程序设计语…

    编程技术 2025年3月3日
    200

发表回复

登录后才能评论