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编写,它是构建基本编译器的一个非常好的、易读的介绍。所讨论的技术应该有助于您在这里尝试做什么。