语境。我正在开发一个 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 正则表达式库了解不多。
完成这项任务的最佳方法是什么?使用哪个库和方法?
我制作了一个动态的对象数组.当我调用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) 好的,所以我创建了一个创建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) 正如我所见,extern汇编代码中的WinAPI函数具有类似的名称_ExitProcess@4.
该@4部分的含义是什么,以及如何确定之后使用的数字@?
我知道这与我们链接的DLL有关,但在很多情况下,不知道在使用后使用的是什么数字@,这会导致许多令人讨厌的undefined reference错误.