如何在c#中解释伪代码?

如何在c#中解释伪代码?,c#,algorithm,pseudocode,C#,Algorithm,Pseudocode,我有一个数据解释算法&实际数据。使用此算法,我必须解释实际数据并将其显示为报告 为此,首先我需要创建一个表单,它将接受来自用户的一些变量值。这些变量在伪代码中定义如下。(举一个例子) 在variables.txt文件中有几个类似的变量。我不想使用StreamReader,逐行阅读并解释变量 相反,我正在寻找一些逻辑,它可以将XXXX{}作为一个对象读取,并将Type:Range作为Attribute:Value读取。这样,我可以跳过读取文件并将其转换为可理解代码的一个步骤 像这样,我还有其他需要

我有一个数据解释算法&实际数据。使用此算法,我必须解释实际数据并将其显示为报告

为此,首先我需要创建一个表单,它将接受来自用户的一些变量值。这些变量在伪代码中定义如下。(举一个例子)

在variables.txt文件中有几个类似的变量。我不想使用StreamReader,逐行阅读并解释变量

相反,我正在寻找一些逻辑,它可以将XXXX{}作为一个对象读取,并将Type:Range作为Attribute:Value读取。这样,我可以跳过读取文件并将其转换为可理解代码的一个步骤

像这样,我还有其他需要检查的文件。例如, 如果性别='9',那么 性别:=U 恩迪夫

有什么方法可以轻松快速地解释它们吗?有人能帮我吗


我正在使用C#作为我的编程语言。

所以你需要一个DSL解析器

我可以给你一些建议,这会让你很容易地建立一个语法

这里有一个完全未经测试的简单语法:

grammar ConfigFile;

file: object+;
object: ID '{' property+ '}';
property: ID ':' value ';';
value: (ID|CHAR)+;

ID: [a-zA-Z][a-zA-Z0-9_]*;
WS: [ \t\r\n]+ -> channel(HIDDEN);
CHAR: .;

替代解决方案:您也可以使用正则表达式:

(?<id>\w+)\s*\{\s*(?:(?<prop>\w+)\s*:\s*(?<value>.+?)\s*;\s*)*\}

这个解决方案不像解析器解决方案那样“漂亮”,但在没有任何外部库的情况下也能工作。

我建议您不要使用正则表达式。也许一开始它就可以工作,但是如果您的任务变得更复杂,那么regex可能无法解决您的问题,因为从技术上讲它无法做到这一点

更好的选择(增加库的代价)是使用一些解析器。对于C语言来说,可能没有其他语言那么多,但已经足够了——随便挑吧:-)。你有,,,或者我的


如果您感觉到您将遇到数学优先级问题(即,您将不得不对“5+5*2”之类的表达式求值,它应该给出15,而不是20),那么比较自顶向下的解析器——ANLTR就是其中之一——语法优先于自下而上的解析器——例如NLT。通常,在第一种情况下,您必须以奇怪的顺序编写规则(您必须嵌入规则),而在后一种情况下,您只需设置规则的顺序(声明
*
+
之前)。换句话说,规则与优先级是分开的。

因此您需要构建一个4GL来加载现有的数据定义,以使工作流在.net应用程序中可用?您好,ANTLR看起来很接近我搜索的内容。我不希望使用正则表达式,因为它以后会变得复杂。我只是在寻找一个干净的解决办法。基本上,我不熟悉特定领域的语言翻译。所以我需要更多的帮助。不久前,我购买了ANTLR4参考指南并开始阅读。我在VisualStudio中通过Nuget安装了ANTLR4,用代码创建了一个.g4文件并编译了它。现在我想把我的变量语法文件作为输入,并得到它的C代码。你能帮我吗?有没有一个地方我可以看到一步一步的指南?如果你有参考指南,那么你已经有了最好的信息来源。哦,还有一个用于visual studio的ANTLR插件,它简化了编译过程。从ANTLR v4开始,您不再需要使用奇怪的语法来编码优先规则。您只需按照优先顺序在规则中编写备选方案。
(?<id>\w+)\s*\{\s*(?:(?<prop>\w+)\s*:\s*(?<value>.+?)\s*;\s*)*\}
var text = @"
AGEYEARS {
    Description: Age in Years;
    Type: Range;
    MinVal: 0;
    MaxVal: 124;
    Default: 0;
    ErrorAction: ERT1:=04 GRT4:=960Z; 
}

OTHER {
    Foo: Bar;
    Bar: Baz;
}";


var re = new Regex(@"(?<id>\w+)\s*\{\s*(?:(?<prop>\w+)\s*:\s*(?<value>.+?)\s*;\s*)*\}");

foreach (Match match in re.Matches(text))
{
    Console.WriteLine("Object {0}:", match.Groups["id"].Value);

    var properties = match.Groups["prop"].Captures.Cast<Capture>();
    var values = match.Groups["value"].Captures.Cast<Capture>();

    foreach (var property in properties.Zip(values, (prop, value) => new {name = prop.Value, value = value.Value}))
    {
        Console.WriteLine("    {0} = {1}", property.name, property.value);
    }

    Console.WriteLine();
}