关于算法:在C#中解析脚本循环

Parsing script loops in C#

我正在编写一个应用程序,该应用程序将以自定义语言(稍微基于C语法和Allman样式的格式)解析脚本,并正在寻找一种比我目前所做的更好(读取:更快)的方法将脚本代码块解析为字符串数组(当前方法可以,但它比任何其他方法都更适合调试)。

脚本内容当前从文件读取到字符串数组并传递给方法。

以下是脚本块模板:

1
2
3
4
5
6
7
8
9
10
11
12
loop [/* some conditional */ ]
{
  /* a whole bunch of commands that are to be read into
   * a List<string>, then converted to a string[] and
   * passed to the next step for execution */

   /* some command that has a bracket delimited set of
    * properties or attributes */
   {
     /* some more commands to be acted on */
   }
}

基本上,大括号块可以嵌套(就像其他任何基于C的语言一样),我正在寻找找到这样单个块的最佳方法。

用大括号分隔的块的格式始终是这样的-括号的内容将从左括号后的行开始,并在最后一个属性/command/comment/whatever后的行中后跟一个括号。

例如:

1
2
3
4
5
6
7
8
9
loop [ someVar <= 10 ]
{
  informUser"Get ready to do something"
  readValue
  {
    valueToLookFor = 0x54
    timeout = 10 /* in seconds */
  }
}

这将告诉应用程序循环,而somevar小于10(抱歉的吸盘评论)。每次,我们都会向用户传递一条消息,并从某个地方查找特定的值(超时时间为10秒)。

下面是我现在的操作方法(注意:调用此方法的方法会将包含当前脚本的整个字符串[]传递到其中,其中包含要读取的索引):

2

我同意这可能是一个稍显迟钝和缓慢的方法,这就是为什么我要就如何重新实现这一点征求任何意见,以提高速度和清晰度(如果能够达到平衡,也就是说)。

我希望远离regex,因为我不能用它来保持括号计数,而且我不确定您是否可以编写regex语句(这是正确的术语吗?)可以递归地执行。我在考虑从内向外工作,但我相信这会很慢。

我不想找人帮我重写,但我可以使用的算法或技术/库的一般概念会改进我的方法。

作为附带问题,编译器如何处理源代码中的多个嵌套括号?


让我们来构建一个编译器,由Jack Crenshaw编写,它是构建基本编译器的一个非常好的、易读的介绍。所讨论的技术应该有助于您在这里尝试做什么。