Php 使用标记器解析自定义DSL中的条件

Php 使用标记器解析自定义DSL中的条件,php,parsing,tokenize,php-parser,Php,Parsing,Tokenize,Php Parser,我试图解析PHP中API提供的“规则字符串” 假设我有一系列的项目,比如 $items = [41, 42, 51, 54, 65, 12]; 我想评估一下这个表达式 ({41} AND {51}) OR ({31} AND {42}) 在本例中,它应该返回true,因为$items数组同时包含41项和51项 我开始使用这个库创建一个标记器,现在让它将字符串解析为一个标记数组 array:25 [ 0 => array:3 [ 0 => "(" 1 =>

我试图解析PHP中API提供的“规则字符串”

假设我有一系列的项目,比如

$items = [41, 42, 51, 54, 65, 12];
我想评估一下这个表达式

({41} AND {51}) OR ({31} AND {42})
在本例中,它应该返回true,因为$items数组同时包含41项和51项

我开始使用这个库创建一个标记器,现在让它将字符串解析为一个标记数组

array:25 [
  0 => array:3 [
    0 => "("
    1 => 0
    2 => 1
  ]
  1 => array:3 [
    0 => "{"
    1 => 1
    2 => 2
  ]
  2 => array:3 [
    0 => "41"
    1 => 2
    2 => 3
  ]
  3 => array:3 [
    0 => "}"
    1 => 4
    2 => 4
  ]
  4 => array:3 [
    0 => " "
    1 => 5
    2 => 8
  ]
  5 => array:3 [
    0 => "AND"
    1 => 6
    2 => 5
  ]
  6 => array:3 [
    0 => " "
    1 => 9
    2 => 8
  ]
  7 => array:3 [
    0 => "{"
    1 => 10
    2 => 2
  ]
  8 => array:3 [
    0 => "51"
    1 => 11
    2 => 3
  ]
  9 => array:3 [
    0 => "}"
    1 => 13
    2 => 4
  ]
  10 => array:3 [
    0 => ")"
    1 => 14
    2 => 7
  ]
  11 => array:3 [
    0 => " "
    1 => 15
    2 => 8
  ]
  12 => array:3 [
    0 => "OR"
    1 => 16
    2 => 6
  ]
  13 => array:3 [
    0 => " "
    1 => 18
    2 => 8
  ]
  14 => array:3 [
    0 => "("
    1 => 19
    2 => 1
  ]
  15 => array:3 [
    0 => "{"
    1 => 20
    2 => 2
  ]
  16 => array:3 [
    0 => "31"
    1 => 21
    2 => 3
  ]
  17 => array:3 [
    0 => "}"
    1 => 23
    2 => 4
  ]
  18 => array:3 [
    0 => " "
    1 => 24
    2 => 8
  ]
  19 => array:3 [
    0 => "AND"
    1 => 25
    2 => 5
  ]
  20 => array:3 [
    0 => " "
    1 => 28
    2 => 8
  ]
  21 => array:3 [
    0 => "{"
    1 => 29
    2 => 2
  ]
  22 => array:3 [
    0 => "42"
    1 => 30
    2 => 3
  ]
  23 => array:3 [
    0 => "}"
    1 => 32
    2 => 4
  ]
  24 => array:3 [
    0 => ")"
    1 => 33
    2 => 7
  ]
]
然而,这是我的天赋耗尽的地方,我不确定如何处理代币,以便我可以对我的$items数组运行条件


这可能是我完全错误的做法

请参阅我关于如何构建解析器和如何构建表达式计算器的SO答案:嗨@IraBaxter,我已经看了你的一些答案,正在努力应用你在我的问题中所写的内容。1)编写语法。2) 然后为该语法编写递归下降解析器。3) 然后扩展它以计算表达式。如果你不能完成第一步,你可能根本不会成功。我的答案告诉您如何执行步骤2和步骤3。@IraBaxter我希望能得到一些反馈,了解我目前的方向是否正确,以及下一步的方向。我首先标记我的表达式,然后处理它们,对吗?解析器吞下一系列标记,一次一个,从解析文本的开始到结束。无论是在调用解析器之前构建该系列,还是解析器在“获取”令牌时导致生成下一个令牌,在实现解析器时通常都不是一个大问题。任何一种方法都会奏效。我建议使用递归解析器(RD)的简单方法是根据解析器的需要生成令牌。事实上,RD解析器结构被组织为识别代码结构的子例程;将子例程写入已识别的标记是很简单的。