使用正则表达式传递语法有效的c++声明/初始化

Using regex to pass syntax-valid c++ declaration/initialization

本文关键字:c++ 声明 初始化 有效 语法 正则表达式      更新时间:2023-09-26

这是用于语法检查器的。(是的,我知道使用regex并不理想)读取器已经检测到它位于int|float|char|bool部分,现在它需要检查声明和初始化在语法上是否有效。ff是我的条件应该通过的str的样本。

a;
a, _b2;
a, _b2=0;
a=1, _b2=0;
a=1+1, _b2=a+1, c, d=555, e;
a=2.33;
a='a', b=3;
a="asb", b='3';
a=true, b=false, c="false";

不应通过:

a= , b2 = 1;
a = ;
a = '23;
a = 50, b = a+1
a = a.23;

当它看到=时,我所做的条件不匹配。你能帮我纠正我的条件吗

^('s*[A-z_][A-z0-9]*'s*(='s*0-9|='s*"[^]*"|='s*'[^]*')?'s*,)*'s*[A-z_][A-z0-9]*'s*(='s*0-9|='s*"[^]*"|='s*'[^]*')?'s*;

更新:考虑浮动值

UPDATE:使其成为适用于int、float、char和布尔值的通用正则表达式

世界上没有一个正则表达式的功能强大到足以解析C++声明,原因很简单,那就是语法对上下文非常敏感(而且很可能实际上是不可判定的)。

例如,使用这里定义的IsPrime模板,您可以编写一个类似的声明

int a = foo<IsPrime<234799>>::typen<1>();

其在语法上有效当且仅当234799是素数

考虑使用不同的方法来验证C++(例如g++ -fsyntax-only)。

正如nneonneo所提到的,regex不适合该任务,但如果您想匹配您拥有的示例字符串,可以使用以下方法:

^(?:'s*[A-Za-z_][A-Za-z0-9]*'s*(?:='s*(?:[A-Za-z0-9]+(?:[+'/*-][A-Za-z0-9]+)?|"[^"]*"|'[^']*'))?'s*,)*'s*[A-Za-z_][A-Za-z0-9]*'s*(?:='s*(?:[A-Za-z0-9]+(?:[+'/*-][A-Za-z0-9]+)?|"[^"]*"|'[^']*'))?'s*;

我从你的正则表达式中更改了几件事:

  • [A-z]更改为[A-Za-z]

  • ='s*放在"外部",因为它非常重复。

  • 为裸露的0-9添加了方括号。我相信这是一堂性格课。

  • 为字符类[0-9]添加了字母。

  • 在适当的情况下,将所有[^]更改为[^"][^']。我不太确定你在做什么,但以防万一。

  • 添加了基本的整数运算符和后面的数字(以及变量的字母)(?:[+/*-][A-Za-z0-9]+)?

  • =之后的第一个字符类中的*更改为+,以防止=之后立即出现,

regex101演示。

编辑:

^(?:'s*[A-Za-z_][A-Za-z0-9_]*'s*(?:='s*(?:[A-Za-z0-9_]+(?:'s*[+'/*-]'s*[A-Za-z0-9_]+)*|[‌​0-9]+(?:'.[0-9]+)?(?:'s*[+'/*-]'s*[0-9]+(?:'.[0-9]+)?)+|"[^"]*"|'[^']*'))?'s*,)*'s*[A-Z‌​a-z_][A-Za-z0-9_]*'s*(?:='s*(?:[A-Za-z0-9_]+(?:'s*[+'/*-]'s*[A-Za-z0-9_]+)*|[0-9]+(?:'.[0-‌​9]+)?(?:'s*[+'/*-]'s*[0-9]+(?:'.[0-9]+)?)+|"[^"]*"|'[^']*'))?'s*;$

变量名称中允许使用更多的空格并允许使用下划线。