我正在尝试在我的应用程序中创建一个简单的脚本解释器。在我的应用程序中使用的有效脚本将类似于:
#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);
}
}
答案 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
修改字符串。