用c#编写一个非常简单的解释器

本文关键字:非常 一个 简单 解释器 | 更新日期: 2023-09-27 18:19:16

我想在我的应用程序中做一个简单的脚本解释器。在我的应用程序中使用的有效脚本应该是这样的:

#this is a comment
*IDN? #this is a comment after a valid command
:READ? #this was also a comment after a valid command
RST
#last line was a valid comment but with no comment!

现在,在将脚本内容加载到字符串数组中后,我想执行每一行,如果它不以#开始,并且如果存在,也忽略同一行中的#:

    foreach(var command in commands)
    {
        if(!command.StartsWith("#"))
        {
            _handle.WriteString(command);
        }
    }

我的代码将负责开始注释。但是如何检查内联注释呢?

我有了这个想法,这个代码是白痴证明吗?

        foreach(var command in commands)
        {
            if(!command.StartsWith("#"))
            {
                if(command.IndexOf('#') != null)
                {
                    _handle.WriteString(command.Remove(command.IndexOf('#')));
                }
            else
                _handle.WriteString(command);
            }
        }

用c#编写一个非常简单的解释器

重新表达你的问题-另一种表达方式是你想处理出现在第一个#符号之前的每行的部分。这将是String.Split返回的数组的第一个元素:

foreach(var command in commands)
{
    var splits = command.Split('#');
    if(!String.IsNullOrEmpty(splits[0]))
    {
        _handle.WriteString(splits[0]);
    }
}

现在处理#字符,无论它出现在行中。

你可能想看看Irony。它是一个框架,可以用来解析自定义的"语言",就像你正在尝试的那样。您将能够定义一组命令和语法等。即使它是alpha状态,对于你的目的,它应该是足够稳定的。

查看这个Irony教程来创建您自己的域特定语言。

去掉#之后的所有内容。这个正则表达式也会去掉注释前的空白。如果还剩下什么,可能是命令。

using System.Text.RegularExpressions;
...
command = Regex.Replace(command, @"'s*#.*$", "");
if (command != "")
{
    // this is a command, not a comment line
    // and any comment has been stripped off
}

我说"可能"是因为只有#之前的空白被剥离。如果空格引起问题,您可以考虑使用Trim替换字符串。