小编hak*_*010的帖子

C++ 正则表达式:获取 SubMatch 匹配的捕获组的索引

语境。我正在开发一个 Lexer/Tokenizing 引擎,它将使用正则表达式作为后端。词法分析器接受定义令牌类型/ID 的规则,例如

<identifier> = "\\b\\w+\\b"

正如我所设想的,为了进行基于正则表达式匹配的标记化,正则表达式定义的所有规则都包含在捕获组中,并且所有组都由 OR 分隔。

当执行匹配时,我们生成的每个匹配都必须有一个与其匹配的捕获组的索引。我们使用这些 ID 将匹配映射到令牌类型。

那么这个问题的问题就出现了——如何获取群组的ID

这里有类似的问题,但它没有为我的具体问题提供解决方案。

正是我的问题,但它是在 JS 中,我需要一个 C/C++ 解决方案。

假设我有一个正则表达式,由用 OR 分隔的捕获组组成:

(\\b[a-zA-Z]+\\b)|(\\b\\d+\\b)

它匹配整数或字母单词。

我的问题要求可以知道正则表达式子匹配匹配的捕获组的索引,例如在匹配字符串时

foo bar 123

将进行 3 次迭代。每次迭代的匹配项的组索引将为0 0 1,因为前两个匹配项与第一个捕获组匹配,最后一个匹配项与第二个捕获组匹配。

我知道在标准std::regex库中这并不完全可能(regex_token_iterator不是解决方案,因为我不需要跳过任何匹配)。

boost::regex我对PCRE 正则表达式库了解不多。

完成这项任务的最佳方法是什么?使用哪个库和方法?

c++ regex tokenize lexer capturing-group

5
推荐指数
1
解决办法
2190
查看次数

C++ delete []对象导致崩溃

我制作了一个动态的对象数组.当我调用delete []时,程序崩溃并停止响应.但它确实有奇怪的行为:调用所有析构函数和崩溃.看看这段代码和输出.分配所有阵列的所有内存.

//main file
#include "myobject.h"

int size;
myObject *foo;

//some operations to estimate size

foo = new myObject[size];

//some operations with myObject

std::cout<<"size: "<<size<<"\n";
std::cout<<"Deleting object\n";

size=0;
delete [] foo;
Run Code Online (Sandbox Code Playgroud)

下一个文件:

//myobject.h

class myObject
{
    public:
    int number;

    Object1 ob1[64]
    Object2 *ob2;

    myObject(){ };
    ~myObject()
    {
        std::cout<<"delete "<<number<<"\n";

        delete [] ob1;
        delete [] ob2;
    };
}
Run Code Online (Sandbox Code Playgroud)

并输出:

size: 11

Deleting object

delete 10

delete 9

delete 8

delete 7

delete 6

delete 5

delete 4

delete 3

delete 2 …
Run Code Online (Sandbox Code Playgroud)

c++ crash class object delete-operator

3
推荐指数
2
解决办法
6028
查看次数

Windows C++ - 在类中创建窗口使它看起来不寻常

好的,所以我创建了一个创建HWND的类.

但是,创建的窗口显示了一些奇怪的属性:它不像其他窗口 - 它是不透明的,close-minimize-maximize按钮的位置与普通窗口不同.

但指定的样式是默认值(WM_OVERLAPPEDWINDOW).

更重要的是,它不能被关闭,除非我稍微移动它(似乎它在移动之前没有生成WM_DESTROY或WM_CLOSE消息).

这可能是主WinProc的实现使用指针调用另一个消息处理器的问题.但是,我不知道为什么窗户看起来异常.

更新:在WM_NCCREATE处理程序上设置HWND时,窗口正常显示.

无法关闭窗口的问题可以通过向类添加close变量并在生成WM_CLOSE或WM_DESTROY的消息时将其值设置为false来解决.

似乎正在生成消息WM_CLOSE,但PostQuitMessage(0)不会破坏mHwnd,除非窗口被移动.

因此,最好的选择是使用该变量手动转义消息循环.

我已经使用解决方案添加了代码更新.

我的代码:

//mywind.h
class Window
{
private:
    HWND mHwnd;
    const char* className="Window";
    static LRESULT CALLBACK StartWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); //main WindowProc function
    LRESULT ThisWindowProc(UINT msg, WPARAM wParam, LPARAM lParam); //Another, object-specific message processing function
    bool isClassRegistered(HINSTANCE hinst);

public:
    Window() : mHwnd( 0 ) { }
    ~Window();

    int create(std::string title, int width, int height);
};

//mywind.cpp
Window::~Window()
{
    if( mHwnd ) DestroyWindow( mHwnd );
}

int …
Run Code Online (Sandbox Code Playgroud)

c++ windows pointers

1
推荐指数
1
解决办法
162
查看次数

Win32汇编 - 外部函数命名('@'的含义)

正如我所见,extern汇编代码中的WinAPI函数具有类似的名称_ExitProcess@4.

@4部分的含义是什么,以及如何确定之后使用的数字@

我知道这与我们链接的DLL有关,但在很多情况下,不知道在使用后使用的是什么数字@,这会导致许多令人讨厌的undefined reference错误.

assembly winapi nasm ld kernel32

0
推荐指数
1
解决办法
296
查看次数