基于逆波兰记号电信计费话单过滤算法设计
3.3 过滤条件语义的定义
语义定义是和功能需求紧密联系的,并可以根据需求的变化进行调整和扩充。文法G中各终结符号语义见表1。
例如话单过滤表达式(((A>4224000)∩(A≤6899123))∪(N=1)),其语义为主叫号码段在4224000和6899123之间,或者主被叫归属相同计费区。
3.4 过滤条件形式定义和物理存储的相互转换
话单过滤条件的形式定义和物理表述分别采用中缀法和后缀法,前者直接面向最终用户,后者是针对设计人员算法实现的需要,因此必须采用合理的机制进行相互转换。这里需要解决两个问题:一是要设计一个最终用户可理解的图形界面向导、采用中缀法来配置过滤表达式;二是设计一个依据中缀式形成后缀式的算法。在本文中作如下定义:
3.4.1 过滤表达式的用户配置
这里预定义关系表T_EXPRESS,其结构见表2。该表用于存储所有话单过滤条件的原子表达式和组合表达式。基于该表,设计相关的图形配置界面向导是很容易达到用户配置过滤表达式要求的。

3.3节中话单过滤表达式在表中存储方式见表3,记录序号5指示的组合表达式就是该过滤条件表达式的入口。
3.4.2 中缀式向后缀式转换算法
实现中缀表达式向后缀表达式的转换可采用递归算法,伪C语言代码如下:
String GetSuffixExpress(int seq) {
Billing_Record_Express=GetBillingRecordExpress(seq);
If Billing_Record_Express.ftype=原子表达式
Return Billing_Record_Express.felement + ″,″+
Billing_Record_Express.fvalue +″,″+ Billing_Record_Express.foperate;
Else //组合表达式
Return GetSuffixExpress(int(Billing_Record_
Express.felement)) + ″,″+ GetSuffixExpress(int
(Billing_Record_Express.fvalue)) + ″,″+
Billing_Record_Express.foperate;
}
评论