Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi中计算switch语句(Case)中的案例数_Delphi_Switch Statement_Case Statement - Fatal编程技术网

在Delphi中计算switch语句(Case)中的案例数

在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

我是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 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.