Php 使用标记器解析自定义DSL中的条件
我试图解析PHP中API提供的“规则字符串” 假设我有一系列的项目,比如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 =>
$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解析器结构被组织为识别代码结构的子例程;将子例程写入已识别的标记是很简单的。