可能重复:
可以使用正则表达式来匹配嵌套模式吗?
如何使用正则表达式搜索其中包含任意数量嵌套括号的一对开始和结束括号,例如
(...(...(...(...) ...) ...) ...)
Run Code Online (Sandbox Code Playgroud)
每个开口支架必须与一个闭合支架相匹配.并且嵌套的开 - 关对的数量是任意的.其他字母数字字符可能出现在括号内.
如何在ANLTR4词法分析器中实现Perl正则表达式^和$?即。在不消耗任何字符的情况下匹配行首和行尾。
我正在尝试使用ANTLR4词法分析器在行的开头而不是在行的中间匹配##例如,要隔离并扔掉所有C ++预处理程序指令,而不管它是哪个指令,而忽略a中的#字符串字面量。(通常,我们可以对C ++字符串文字进行标记化,以消除出现在行中间的#,但前提是我们不这样做)。那意味着我只想指定#。*?无需烦扰#if #ifndef #pragma等
同样,C ++标准允许在#eg前后添加空格和多行注释。
/* helo
world*/ # /* hel
l
o
*/ /*world */ifdef .....
Run Code Online (Sandbox Code Playgroud)
被认为是有效的预处理器指令,出现在一行上。(ML COMMENTs中的CRLF被扔掉)
这是我目前正在做的:
PPLINE: '\r'? '\n' (ML_COMMENT | '\t' | '\f' |' ')* '#' (ML_COMMENT | ~[\r\n])+ -> channel(PPDIR);
Run Code Online (Sandbox Code Playgroud)
但是问题是我必须依靠#之前CRLF的存在,并将CRLF与指令一起丢弃。我需要替换该指令行的CRLF扔掉的CRLF,所以我必须确保该指令被CRLF终止。
但是,这意味着我的语法无法处理出现在文件开头的指令(即没有在前面的CRLF)或在没有终止CRLF的情况下在EOF之后出现的指令。
如果可以使用Perl样式的regex ^ $语法,则可以匹配SOL / EOL,而不必显式匹配和使用CRLF。
我正在研究关于C++预处理器如何处理宏替换的C++标准(我需要自己实现C++预处理器的一个子集).这是我为学习创建的一个例子:
#define a x
#define x(x,y) x(x+a, y+1)
a(x(90, 80), a(1,2))
Run Code Online (Sandbox Code Playgroud)
通过要求VC++ 2010生成预处理器输出文件,我发现上面的内容a(x(90, 80), a(1,2))变为:
90(90+x, 80+1)(90(90+x, 80+1)+x, 1(1+x, 2+1)+1);
Run Code Online (Sandbox Code Playgroud)
但是预处理器如何提出这个输出呢?规则太复杂,无法理解.有人可以解释预处理器为提出这样的结果所做的所有步骤吗?
为什么在标准的c ++语法中,decl-specifier-sequnder simple-declaration是可选的?
simple-declaration:
decl-specifier-seq(optional) init-declarator-list(optional);
Run Code Online (Sandbox Code Playgroud)
根据规范,只有构造函数,析构函数和类型转换函数才能没有decl-specifier-seq(第9.2节或第7节dcl.dcl).但是所有这三个函数声明都是一个类的成员,所以它们应该由另外一个语法规则定义simple-declaration:
member-declaration:
decl-specifier-seq(optional) member-declarator-list(optional);
function-definition ;(optional)
::(optional) nested-name-specifier template(optional) unqualified-id ;
using-declaration
static_assert-declaration
template-declaration
Run Code Online (Sandbox Code Playgroud)
这里decl-specifier-seq是预期的可选项.但为什么在a simple-declaration,它也是可选的?
我来自Java背景,正在学习C++.我遇到了以下C++代码:
String source = String::New("'Hello' + ', World'");
Run Code Online (Sandbox Code Playgroud)
正如我到目前为止所理解的,这应该是对类'String'的静态成员函数'New'的调用.但是,我搜索了定义'String'的整个头文件,在String类或其超类中没有任何名为'New'的静态成员.String类或C++中的New成员函数是否附加了特殊含义?
使用Perl样式的regexp,是否可以寻找不具有某种模式的东西?
例如,[^abc]查找单个字符不是a也不b是c.
但是,我可以指定比单个字符更长的内容吗?
例如,在下面的字符串中,我想搜索第一个不是顶级域名并且不包含大写字母的单词,或者可能是一些更复杂的规则,例如3-10个字符.在我的例子中,这应该是"abcd":
net com org edu ABCE abcdefghijklmnoparacbasd abcd
Run Code Online (Sandbox Code Playgroud) 说,我有这个代码:
int f() {
volatile int c;
c=34;
return abc();
}
Run Code Online (Sandbox Code Playgroud)
该挥发性诠释三是从来不看.但它被标记为易失性,编译器可以完全消除它吗?我在Visual C++ 2010中的测试显示了相互矛盾的结果.在VC++中,如果我启用优化(最大化速度),上面的函数包含一个名为c的局部变量(通过查看生成的程序集列表).但是,我还尝试通过编译器内部函数(如memset()初始化变量而不是使用赋值运算符)(并使用编译器内部函数启用),该变量被消除.
int f() {
volatile int c;
memset((void*)&c,34, 1);
return abc();
}
Run Code Online (Sandbox Code Playgroud)
那么根据C++标准,编译器可以消除volatile int c吗?我想可能VC++中存在一些与内部函数如何优化volatile变量有关的不一致行为.
如何将ParserRuleContext带有子树的 a 展平为令牌数组?看起来ParserRuleContext.getTokens(int ttype)不错。但什么是ttype?是token类型吗?如果我想包含所有令牌类型,应使用什么值?
我快速浏览了 C++03 标准,但仍然无法判断这种行为是否得到保证:
\n\nsigned char cNegOne=-1; //char is 8bits\nunsigned int a=cNegOne; //int is 32 bits in my Windows system\nprintf("0x%x\\n",a);\nRun Code Online (Sandbox Code Playgroud)\n\n结果是:
\n\n0xffffffff\nRun Code Online (Sandbox Code Playgroud)\n\nVC++0xffffffff在 32 位 Windows 中提供。但我的假设是转换可能以两种方式发生:
1) 8 位有符号 char -1 首先直接转换为 8 位无符号值,即二进制 11111111 或十进制 255,然后扩展为 32 位无符号 int,也给出 255 (0xff)。
\n\n2) 8 位有符号 char -1 有符号扩展为 32 位有符号 int,给出 0xffffffff,然后重新解释为 32 位无符号 int。
\n\n显然这里使用的是第二种方式。但为什么会这样呢?在标准中,我找不到任何谈论这个的内容。它是具体实施的吗?
\n\n编辑:C++03 第 4 章的原文
\n\n标准转换是为内置类型定义的隐式转换。第 4 条列举了完整的此类转换集。标准转换序列是按以下顺序进行的标准转换序列:
\n\n\xe2\x80\x94 来自以下集合的零次或一次转换:左值到右值转换、数组到指针转换以及函数到指针转换。
\n\n\xe2\x80\x94 …
我想当一个通用引用参数与一个右值引用参数匹配时,会返回一个右值引用参数.但是,我的测试显示rvalue引用被通用引用函数模板转换为左值引用.为什么会这样?
#include <iostream>
#include <type_traits>
using namespace std;
template <typename T>
T f1(T&&t) { //<-----this is a universal reference
cout << "is_lvalue reference:" << is_lvalue_reference<T>::value << endl;
cout << "is_rvalue reference:" << is_rvalue_reference<T>::value << endl;
cout << "is_reference:" << is_reference<T>::value << endl;
return t;
}
void f2(int&& t) {
cout << "f2 is_lvalue reference:" << is_lvalue_reference<decltype(t)>::value << endl;
cout << "f2 is_rvalue reference:" << is_rvalue_reference<decltype(t)>::value << endl;
cout << "f2 is_reference:" << is_reference<decltype(t)>::value << endl;
f1(t);
}
int main()
{ …Run Code Online (Sandbox Code Playgroud) c++ rvalue-reference lvalue-to-rvalue perfect-forwarding c++11