本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

将伪代码转换为可用(使用正则表达式?)

发布于2021-11-02 21:00     阅读(130)     评论(0)     点赞(19)     收藏(2)


作为我正在编写的系统的一部分,用户可以创建他们自己的自定义规则,在某些事件发生时运行。

他们可以使用一定数量的对象来创建这些规则,所有这些对象都具有一定数量的属性和方法:

对象列表

因此,作为规则的示例,我们可以说:

“如果这个单元的奖项是‘杰出’,那么设置这个单元的所有标准来授予‘达到’”

IF UNIT.award equals “Distinction”
THEN UNIT.criteria.set_award(‘A’)

“否则,如果该单元奖励是'优异',则将该单元的任何标准的奖励设置为'实现'”

IF UNIT.award equals “Merit”
THEN UNIT.criteria.filter(‘starts’, ‘name’, ‘P’, ‘M’).set_award(‘A’)

“否则,如果该单元奖励为'通过,则将该单元名称以'P'开头的任何标准的奖励设置为'达到'”

IF UNIT.award equals “Merit”
THEN UNIT.criteria.filter(‘starts’, ‘name’, ‘P’).set_award(‘A’)

我遇到的问题是,我只是不确定如何获取对象、属性和方法的字符串,例如“UNIT.criteria.filter('starts', 'name', 'P').set_award('A' )”并将其转换为可用的东西。

我想将字符串转换为的最终结果是:

示例结果

因此,我可以将其转换为实际的正确对象并返回相关值或运行相关方法。

由于我只需要支持一定数量的东西(至少现在是这样)并且我不需要任何复杂的东西,比如计算支持或变量,创建一个 Lexer 系统似乎有点过分,所以我想只使用一个正则表达式来拆分所有部分。

因此,使用上面的示例,我可以对“.”进行简单的拆分。字符,但如果该字符用于方法参数中,例如“CRITERION.filter('is', 'name', 'P.1')”,那么它就完全搞砸了。

我可以使用一个不太常见的字符来拆分它们,例如双冒号或类似“::”的东西,但如果有人出于某种原因将其放入参数中,它仍然会导致相同的问题。我尝试创建一个在字符上拆分的正则表达式,仅当它不在引号之间时,但我无法让它工作。

所以基本上我的问题是:正则表达式是最好的方法吗?(如果是这样,如果它在方法中,任何人都可以帮助我让它忽略指定的字符)。或者有没有另一种方法可以让我更容易/更好地做到这一点?

谢谢。


解决方案


我认为像 eloquent 这样的 ORM 语言可以为您做到这一点。

但如果我必须这样做,那么首先我会拆分 IF THEN ELSE 部分。离开:

  1. UNIT.award 等于“杰出”
  2. UNIT.criteria.filter('starts', 'name', 'P', 'M').set_award('A')

我猜“等于”也可以是“不等于”或“更大”,所以......我会围绕它拆分第一位。

/(?'ident'[a-z.]*?) (?'expression'equals|greater) (?'compare'[0-9a-z\“\”]+)/gi

但是围绕“equals”的爆炸也会做同样的事情。

然后我会在点周围爆炸第二部分。给予:

  1. 单元
  2. 标准
  3. 过滤器(a,b,c,d)
  4. set_ward(e)

弹出前 2 个以获取对象和属性,然后是可能的过滤器和操作的列表。

但坦率地说,我会开发一种不会将属性与操作和过滤器混合在一起的语言。

就像是:

IF object.prop EQUALS const|var 
THEN UPDATE object.prop 
WITH const|var [WHERE object.prop filter const|var [AND|OR const|var]] 

Eloquent 直接在 php 中做到了:

DB::table('users')
            ->where('id', 1)
            ->update(['votes' => 1]);

所以也许我会做这样的事情:

THEN object.prop->filter(a,b,c,d)->set('award','A')

这使得在 -> 周围拆分操作和在 周围的属性变得容易。

无论如何......我在https://regex101.com/上做我的正则表达式 希望这会有所帮助。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.phpheidong.com/blog/article/190959/8b4e81bb5ff7d408a96a/

来源:php黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

19 0
收藏该文
已收藏

评论内容:(最多支持255个字符)