0

这是一个语法检查器。(是的,我知道使用正则表达式并不理想)读者已经检测到它在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*;

更新:考虑浮动值

更新:使其成为适用于 int、float、char 和 boolean 值的通用正则表达式

4

2 回答 2

1

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

例如,使用此处IsPrime定义的模板,您可以编写如下声明

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

当且仅当 234799 是 prime 时,这在语法上是有效的。

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

于 2013-08-24T18:45:02.013 回答
0

正如 nneonneo 提到的,正则表达式不适合该任务,但是如果您想匹配您拥有的示例字符串,可以使用以下命令:

^(?:\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]+)?

  • *将第一章课中的后面改为=防止+立即,后面=

正则表达式 101 演示

编辑:

^(?:\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*;$

变量名中允许和允许下划线的更多空格。

于 2013-08-24T18:53:00.593 回答