使用函数解释“自定义代码”

时间:2012-07-31 08:17:20

标签: php api interpreter

我正在尝试创建一个自己的代码,以允许客户在pixel matrix上发布内容。

这是一个代码示例: 15e3n:3;geo(386299n283752w):4;delta(16e3n:5;line(20e0n;20e10n;0e10n;color:d);19w55n;rectangle(50w50n;height:100;width:50));88e2n:randomColor()

我想使用像geodeltalinerectanglegeorandomColor这样的函数来解释这一点。在()之间写入的内容是参数,以;分隔。 (15e3n在这种情况下是“15 east,3 north”)

实施例: function(param1:value1;param2:value2;value3;value4);function2(param1:value1)

应该执行这些函数,并且应该将结果替换为函数,如下所示:

文字16e13n:3;line(17e13n;19e13n;color:4);15e13n:3应该会产生16e13n:3;17e13n:4;18e13n:4;19e13n:4;15e13n:3。因为带有参数line的函数17e13n;19e13n;color:4的结果17e13n:4;18e13n:4;19e13n:4;替换了输入中的函数。

我怎样才能做到这一点?什么是最好的方法?正则表达式? 是否有关于如何执行此操作的示例?

现在,这看起来有点复杂:)

我提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

注意:内容不是有效的PHP脚本

我的建议是:

5e3n:3;geo(386299n283752w):4;delta(16e3n:5;line(20e0n;20e10n;0e10n;color:d);19w55n;rectangle(50w50n;height:100;width:50));88e2n:randomColor()

首先实现解析器将语句分隔成数组。你可以循环每个字符,保持一个括号的计数器,然后用括号外的;分割,得到这个数组:

array(
    0 => object(prefix => "5e3n", suffix => "3"),
    1 => object(prefix => "geo(386299n283752w)", suffix => "4"),
    2 => object(prefix => "delta(16e3n:5;line(20e0n;20e10n;0e10n;color:d);19w55n;rectangle(50w50n;height:100;width:50))", suffix => ""),
    3 => object(prefix => "88e2n", suffix => "randomColor()")
)

然后提取函数参数,你可能想要使用对象......

array(
    0 => object(prefix => "5e3n", suffix => "3"),
    1 => object(
        prefix => (object)func(
            name => "geo",
            params => array(
                0 => "386299n283752w"
            )
        ),
        suffix => "4"),
    ),
    2 => object(
        prefix => (object)func(
            name => "delta",
            params => array(
                0 => "16e3n:5",
                1 => "line(20e0n;20e10n;0e10n;color:d)",
                2 => "19w55n",
                3 => "rectangle(50w50n;height:100;width:50)"
            )
        ),
        suffix => ""
    ),
    3 => object(
        prefix => "88e2n",
        suffix => (object)func(
            name => "randomColor",
            params => array()
        )
    )
)

递归执行此操作,直到提取内部所有函数。

然后从深度开始,通过(object)func块将switch块替换为结果字符串来处理函数,function processFunc($func){ switch($func->name){ case "randomColor": return selectRandomColor(); /* ... */ } } 块根据名称执行适当的操作,例如:

(object)func(
    name => "randomColor",
    params => array()
)

将处理此事:

"blueColor"

进入这个:

array(
    0 => object(prefix => "5e3n", suffix => "3"),
    1 => object(prefix => "6e2n", suffix => "4"),
    2 => object(prefix => "88e2n", suffix => "")
)

然后在最后你会得到一个内容的单个数组,例如(不直接匹配上面):

{{1}}

然后将它们重新组合成一个结果字符串。

我不打算为你写一个完整的脚本,但是这里有一个如何处理它的想法。虽然这可能不完整,但通过思考,你应该能够完成它。