使用正则表达式传递语法有效的c++声明/初始化
Using regex to pass syntax-valid c++ declaration/initialization
这是用于语法检查器的。(是的,我知道使用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-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*;$
变量名称中允许使用更多的空格并允许使用下划线。
相关文章:
- Dojo不解析自定义小部件的模板html中的小部件声明性
- 直接在函数声明上使用function.prototype.bind
- 获取HTML属性中CSS声明的值
- 对API数据使用声明性绑定
- 可以Resharper在我的javascript函数声明中添加分号
- 如何为排除无穷大和NaN的数字声明Flow类型
- 此行是否包含函数声明
- Javascript以不同的方式声明数字
- 如何使用php文件中的GET来获取我在.js文件中声明的变量
- 使用同一对象中的其他变量声明变量
- 如何在AngularJS工厂中正确声明对象属性
- 用||声明变量
- 其中的用例标签'的声明
- 如何将变量声明为全局变量
- 调用函数中声明的变量
- 一个'var'在函数内部声明
- 我应该如何声明我的自调用函数
- 使用在函数外部声明的变量的 Javascript 返回值 + undefined
- 函数声明与函数表达式之间的性能差异
- 在setInterval函数之前声明时未定义对象