You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 21:55:12