改写... 的
我想知道如何最好地解析函数/条件。所以如果你有类似的东西:[if {a} is {12 or 34}][if {b} not {55}] show +c+ [/if][/if]
这是条件中的条件。看起来我只能用正则表达式来做这件事。
原始问题
现在我有一种非常简单的方法可以通过actionscript解析一些命令。
我正在使用正则表达式来查找标签,命令和操作数...
+key_word+ // any text surrounded by +
[ifempty +val_1+]+val_2+[/ifempty] //simple conditional
[ifisnot={`true,yes`} +ShowTitle+]+val_3+[/ifisnot] // conditional with operands
我的当前算法将开头标记[**]
与第一个结束标记[/**]
匹配,即使它不匹配。这意味着我无法执行[ifempty +val_2+][ifnotempty +val_2]+val_3+[/ifnotempty]+val_4+[/ifempty]
之类的操作 - 基本上将一个条件放在另一个条件中。
我正在使用内联解析方法,根据此正则表达式将字符串拆分为字符串数组\[[^\/](?:[^\]])*\](?:[^\]])*\[\/(?:[^\]])*\]
任何人都可以使用更强大的解析约定/标准来建议更强大的算法吗?特别是as3。
答案 0 :(得分:2)
正则表达式定义常规语言。常规语言不能具有受约束但可能无限递归的区域。
一种思考方式是所有常规语言都可以由有限状态机表示。对于每个可能的if数,你需要一个状态,但是机器必须是'有限的',所以你的绑定。一个典型的例子是:
a{n}b{n}, n >= 0
(meaning n a's, followed by n b's)
当您解析每个a时,您需要转到另一个状态(FSM没有超出其状态的内存,这是他们记住n以后再匹配它的唯一方法)。要解析任意数量的n,你需要无数个状态。
这与你所处的情况相同,正则表达式可以表示有限数量的ifs(虽然它需要相当多的复制粘贴),但不是无限数。但请注意,一些正则表达式实现会有所作为,使它们比它们的数学等价物具有更大的功率。
无论如何,最好的办法是使用更强大的解析方法。 recursive descent parser实施起来特别有趣,可以轻松完成您的需要。您还可以查看LR解析器,或使用堆栈构建简单的解析器。根据您的语言,您可能能够找到解析库,例如Python的pyparse或C ++的Boost Spirit。