在Delphi中计算switch语句(Case)中的案例数
我是Delphi的新手,我想从Delphi中的case语句中计算案例数量。例如,在这段代码中有3个case语句和一个默认case语句,因此这段代码中的总case是4。我该如何计算这些在Delphi中计算switch语句(Case)中的案例数,delphi,switch-statement,case-statement,Delphi,Switch Statement,Case Statement,我是Delphi的新手,我想从Delphi中的case语句中计算案例数量。例如,在这段代码中有3个case语句和一个默认case语句,因此这段代码中的总case是4。我该如何计算这些 colour := Green; Case colour of Red : ShowMessage('The colour is Red'); Green : ShowMessage('The colour is Green'); Blue : ShowMessage('The colour is Bl
colour := Green;
Case colour of
Red : ShowMessage('The colour is Red');
Green : ShowMessage('The colour is Green');
Blue : ShowMessage('The colour is Blue');
else ShowMessage('The colour is Unknown!');
end;
正如其他人提到的,您可以使用解析器来实现这一点。从头开始编写对象Pascal解析器是一项主要任务,但现有的解析器有很多 这个答案中使用的那个 Jacob Thurman是Delphi的Castalia工具的解析器- 看 这里有一篇关于它的解释性文章 TmwSimplePasPar解析器基本上使用一个输入流来查找 用宾语帕斯卡写成的句子。当它这样做时,它调用 一系列识别方法,每个遇到的ObjectPascal片段一个 在输入流中。使用它的方法是派生这个类的后代 并覆盖与手头任务相关的特定识别方法 使TmwSimplePasPar特别适合您的任务的是 特定于Case语句、它们的标签和选择器的方法。如你所愿 请参见,下面的代码覆盖这些方法以收集有关案例的信息 语句在输入流中遇到。唯一有必要的地方 要更改与重写的TmwSimplePasPar方法相比的代码,请执行以下操作: CaseStatement one,我在块中添加了一条语句,用于处理 识别else块(如果存在) 我之所以调用我的解析器类TNaiveCaseParser,有两个原因,即 尽可能简单: 它只正确处理遇到的第一个Case语句 它忽略了嵌套Case语句的可能性。要处理这些问题,你必须 需要某种堆栈来跟踪当前的Case语句 代码: 请注意,我在D7中用于测试的源代码是
unit Test;
interface
implementation
procedure TestCase;
var
colour : (Black, Red, Green, Blue);
begin
colour := Green;
Case colour of
Black,
Red : ShowMessage('The colour is Red or Black');
Green : ShowMessage('The colour is Green');
Blue : ShowMessage('The colour is Blue');
else
ShowMessage('The colour is Unknown!');
end;
end;
end.
输出是
标签:4,选择器:3,有Else块
顺便说一句,大约一个小时前,我开始为这个答案编写代码之前,我没有使用过瑟曼的解析器,我认为这说明了解析器的设计和质量。我忍不住要问,你试图用这个计数解决的实际问题是什么?为了找到圈复杂度,我需要计算casesAh的数量,好啊好了,Delphi中没有内置的东西。@Papagaio使用Sonarqube和Delphi插件怎么样?@DavidHeffernan:事实上,这个问题促使我看了看Jacob Thurman在2011年左右推出的Castalia解析器。
unit Test;
interface
implementation
procedure TestCase;
var
colour : (Black, Red, Green, Blue);
begin
colour := Green;
Case colour of
Black,
Red : ShowMessage('The colour is Red or Black');
Green : ShowMessage('The colour is Green');
Blue : ShowMessage('The colour is Blue');
else
ShowMessage('The colour is Unknown!');
end;
end;
end.