用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);
}
}
重新表达你的问题-另一种表达方式是你想处理出现在第一个#
符号之前的每行的部分。这将是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
替换字符串。