如何为PHP PEG基础计算器语法添加隐式乘法支持?
给php-peg计算器添加隐式乘法支持
要实现8(5/2)这类隐式乘法解析,只需在原有PEG语法中添加隐式乘法的匹配规则,并将其纳入乘除运算的处理逻辑中,具体修改如下:
修改后的完整语法代码
Number: /[0-9]+/ Value: Number > | '(' > Expr > ')' > function Number( &$result, $sub ) { $result['val'] = $sub['text'] ; } function Expr( &$result, $sub ) { $result['val'] = $sub['val'] ; } Times: '*' > operand:Value > Div: '/' > operand:Value > // 新增隐式乘法规则:无*号,直接紧跟Value即视为乘法 ImplicitTimes: operand:Value > function Value( &$result, $sub ) { $result['val'] = $sub['val'] ; } function Times( &$result, $sub ) { $result['val'] *= $sub['operand']['val'] ; } function Div( &$result, $sub ) { $result['val'] /= $sub['operand']['val'] ; } // 隐式乘法的处理逻辑和显式乘法完全一致 function ImplicitTimes( &$result, $sub ) { $result['val'] *= $sub['operand']['val'] ; } Plus: '+' > operand:Product > Minus: '-' > operand:Product > Sum: Product > ( Plus | Minus ) * function Product( &$result, $sub ) { $result['val'] = $sub['val'] ; } function Plus( &$result, $sub ) { $result['val'] += $sub['operand']['val'] ; } function Minus( &$result, $sub ) { $result['val'] -= $sub['operand']['val'] ; } // 修改Product规则,将隐式乘法纳入乘除运算循环 Product: Value > ( Times | Div | ImplicitTimes ) * Expr: Sum function Sum( &$result, $sub ) { $result['val'] = $sub['val'] ; }
关键修改说明
- 新增
ImplicitTimes规则:匹配无*号直接紧跟的Value,比如数字后接括号表达式8(...),由于Number规则会优先匹配连续数字,不会出现85被误解析为8*5的情况。 - 将
ImplicitTimes加入Product的循环分支:因为隐式乘法和显式乘除优先级相同,放在Product层级处理能保证运算顺序符合数学逻辑。 - 隐式乘法的处理函数复用显式乘法的逻辑,无需额外编写新的运算代码。
修改完成后,即可正确解析8(5/2)为8*(5/2),同时不影响原有显式运算的功能。
内容的提问来源于stack exchange,提问作者jcubic
相关产品推荐
相关产品推荐

