原帖由
cjaizss 于 2008-4-30 19:01 发表

to LZ,关于表达式的解析:
语法大致为
表达式->(表达式)
表达式->非 表达式
表达式->表达式 与 表达式
表达式->表达式 或 表达式
检索出括号、与、或、非,建立一个可能是树形的东西就可以了
树的没有分 ...
我来说说我的实现方法吧,让大家批评批评。
首先声明一下:我的编译原理等于没学,数据结构还算熟悉。
1> 词法分析模块:根据我的拙见,这部分无非就是分出所有的词汇,然后和标准的“词汇表”进行对比
2> 语法分析:(举例) 例如:对于此类表达式: ip.addr == 200.22.33.44 && tcp.srcport == 80
存在的运算符分为两类:
1> 逻辑运算符 && ||
2> 关系运算符 == != > < >= <=
方法是这样的: 1> 对于任何一个表达式,找到逻辑运算符 && 或 ||,把表达式分成两部分
2> 运用递归思想,分出所有的“基本表达式”(注释:基本表达式就是不包含“&&”或“||”的表达式)
3> 既然能够把每个“基本表达式”分离出来,则对每个基本表达式做以下处理:
--------------------------
每个表达式肯定具有这样的特征:(例如:ip.srcaddr == 202.30.40.50)
1> 左值 :ip.srcaddr
2> 运算符:==
3> 右值 :202.30.40.50
规则应该可以这样描述的:
1> 运算符 决定 左值 (例如:当运算符为 >= 时,左值是ip.srcaddr 是不符合语法的)
2> 左值 决定 右值 (就是验证右值的合法性)
3> 如果上面两关都过的话,就可以进行计算了,计算的方法我是这样想的
以前,上数据结构课程时,讲到“堆栈的应用一章时,讲到了堆栈在“后续表达式的计算的应用问题”,我觉得用同样的算法可以实现本表达式的运算,其实这里更简单:
表达式: ip.srcaddr == 202.30.40.50 && tcp.srcport == 80
令:
string1 = "ip.srcaddr == 200.30.40.50 && tcp.srcport == 80"
从报文中到ip.srcaddr 和 tcp.srcport 相关字段,进行替换
得到
string2 = "200.30.40.40 == 202.30.40.50 && 80 == 80"
这个时候应该用这样的理论:
当一个报文能够通过filter时,代表这个报文符合这个filter的所有条件,换句话说:
这个表达式中的所有 “基本表达式” 的 结果(true OR false),经过逻辑运算之后,结果一定 = true
例如:
200.30.40.50 == 202.30.40.50 && 80 == 80
--------------------------------------- ------------
| |
| |
V V
表达式1 表达式2
求表达式1和表达式2的结果很简单吧,求得: 表达1=false, 表达式2=true
false && true = false,所以这个package是不符合条件的
说的比较乱,不知道对不对,呵呵。
[
本帖最后由 anank 于 2008-4-30 19:34 编辑 ]