Perl:Regexp :: Grammars

时间:2014-09-12 08:04:29

标签: perl regexp-grammars

我尝试了Regexp :: Grammars,我遇到了2个问题。也许有人可以帮助我。

use strict;
use warnings;
use Regexp::Grammars;

my $gr = 
qr
{       
    <debug: off>
    <warning: off>

    <root>

    <rule: root>
        ^<X=val> <O=op> <Y=val>$
        <MATCH=(?{ 
                if ($MATCH {O} eq "+")
                {
                    $MATCH = $MATCH {X} + $MATCH {Y};
                }
                elsif ($MATCH {O} eq "*")
                {
                    $MATCH = $MATCH {X} * $MATCH {Y};
                } 
                elsif ($MATCH {O} eq "/")
                {
                    $MATCH = $MATCH {X} / $MATCH {Y};
                } 
                print"\nCALC=$MATCH"; 
            })>

    <token: val>
        <X=([0-9]+)>
        <MATCH=(?{ print "\nVAL: " . $MATCH {X}; $MATCH = $MATCH {X}; 
        })>

    <token: op>
        <X=([\+\*\/])>
        <MATCH=(?{ print "\nOP: " . $MATCH {X}; $MATCH = $MATCH {X}; })>
    }xms;

##########################################

my $input = "10 + 3";

if ($input =~ $gr) 
{
    foreach (keys %/)
    {
        print "\nHSH: \"$_\" = " .  $/{$_};
    }
}

这是输出。

VAL: 10
OP: +
VAL: 3
[eos]   \_____<grammar> matched '10 + 3'    
CALC=13
HSH: "" = 10 + 3
HSH: "root" = 1

到目前为止,我认为它工作正常。 令牌中的MATCH只是让我有更好的调试。

但我不确定2分。

  • 为什么还有这个[eos]线呢?我禁用了调试。
  • 如何在根元素中得到结果(CALC = 13),结果是哈希? 我期待root = 13。

感谢您的帮助!

祝你好运, 克里斯

1 个答案:

答案 0 :(得分:2)

刚刚发现的是根规则中的打印导致1.似乎它更像是一个返回问题。但它也使用MATCH = assign,如果它是最后一个命令。