我对使用php-peg的PHP中的my PEG grammar有一个问题(该项目有更新的fork,即发布给Packagist).我的项目是一个表达式解析器的分支,我想用一个更容易修改的生成的解析器来替换它.

到目前为止一切运行良好,但我有一个问题,添加隐式乘法,这是原始项目功能的一部分.

它看起来像这样:

8(5/2)

它应该隐式地用分数乘以8.

到目前为止,我的语法有很多功能,但我只想知道如何将隐式乘法添加到一个基本的计算器示例中,如下所示:

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 >
Product: Value > ( Times | Div ) *
    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'] ;
    }

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'] ;
    }

Expr: Sum
    function Sum( &$result, $sub ) {
        $result['val'] = $sub['val'] ;
    }

位于project examples directory号.

我已经在GitHub上创建了basic calculator example project个.

推荐答案

我会试着把Product规则改成这样:

Times: '*' > operand:Value >
ImplicitTimes: operand:Value >
Div: '/' > operand:Value >
Product: Value > ( Times | ImplicitTimes | Div ) *
    function Value( &$result, $sub ) {
        $result['val'] = $sub['val'] ;
    }
    function Times( &$result, $sub ) {
        $result['val'] *= $sub['operand']['val'] ;
    }
    function ImplicitTimes( &$result, $sub ) {
        $result['val'] *= $sub['operand']['val'] ;
    }
    function Div( &$result, $sub ) {
        $result['val'] /= $sub['operand']['val'] ;
    }

Php相关问答推荐

Laravel:从匹配的数组数据中获取记录

从WC会话变量更改WooCommerce checkout 托运方法成本

如何删除WordPress用户的个人资料描述或其他个人资料字段中的链接?

不包括WooCommerce中单独销售的产品

将日期数组排序为年->;月

在Laravel中从动态嵌套数组中获取值

WooCommerce在购物车项目中复制产品而不增加产品数量

Select 本地提货时隐藏WooCommerce显示的发货成本

在 WooCommerce 更新结帐事件上动态更新自定义内容

使用 PHP,我可以将 foreach 语句放入瞬态中吗?

无法允许元素(img:'src')与symfony html-sanitizer(symfony6.3 php 8.2)

用自定义代码替换 WooCommerce 单一产品简短描述

我不明白为什么我收到未定义的数组键异常错误 - Laravel 9 PHP 8

htaccess 重定向子域错误的 url

WooCommerce 有关新订单的附加邮箱通知,其中包含具体详细信息

我需要一个正则表达式模式来获取在不包含特定字符串后面的模式中的文本

用于检测此模式的正则表达式:something;something=something,something=something... 未知次数

Laravel 10 单元测试看不到来自 Artisan Command 的数据库更改

Eloquent 的模型更新了它应该 laravel php 的更多行

将加密/解密函数从 PHP 转换为 NodeJS