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

时间:2011-12-30 14:48:15

标签: c# interpreter

我正在尝试在我的应用程序中创建一个简单的脚本解释器。在我的应用程序中使用的有效脚本将类似于:

#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);
        }
    }

我的代码将负责发表评论。但是如何检查内联评论?

我有这个想法,这段代码会是IDIOT-PROOF吗?

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

3 个答案:

答案 0 :(得分:4)

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

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

这现在处理#字符,无论它出现在哪一行。

答案 1 :(得分:2)

您可能需要查看Irony。它是一个框架,可用于解析您正在尝试的自定义“语言”。您将能够定义一组命令和语法等。即使它是alpha状态,但为了您的目的,它应该足够稳定。

检查this Irony tutorial以创建您自己的特定于域的语言。

答案 2 :(得分:1)

#之后摆脱一切。这个正则表达式也将在评论之前删除任何空格。如果剩下任何东西,那可能就是一个命令。

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修改字符串。