我正在尝试使用Parse::RecDescent
make解析器来解析括号表达式和一元运算符?
.
到目前为止,我创建解析器时失败了,因为规则expression
是左递归的:
use strict;
use warnings;
use Parse::RecDescent;
my $test = <<END;
((foo)? bar)
END
my $grammar = q(
parse: expression(s)
expression: string | parend | expression(s)
parend : "(" (string | expression) ")" /\??/
string : /\w+/ /\??/
);
my $parser = Parse::RecDescent->new($grammar);
my $result = $parser->parse($test);
if($result){
print $result;
}else{
print STDERR "Invalid grammar\n";
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Perl中的Parse :: RecDescent解析器,我似乎有最糟糕的时间从它获取信息.在线提供的信息似乎没有非平凡的例子.
这是代码:
event_function: object_list ':' event_list ';'
<defer:
{ #item is a special character with Parse::Recdescent.
print Dumper($item{object_list});
$return = $item[1];
}
>
| object_list ':' ';'
<defer:
{
print Dumper($item{object_list});
$return = $item[1];
}
>
Run Code Online (Sandbox Code Playgroud)
这是输出
PS W:\developers\paulnathan\rd_dir> perl parser.pl testfile
$VAR1 = 4;
$VAR1 = 8;
PS W:\developers\paulnathan\rd_dir>
Run Code Online (Sandbox Code Playgroud)
输入文件正确解析.
stuff, stuff2: pre-operation event = {foo1, foo2};
Run Code Online (Sandbox Code Playgroud)
它应该输出一个由"stuff","stuff2"键入的哈希值.
思考?
编辑:
object_list :
object ',' object_list
<defer:
{
my $retval = ();
$retval = …
Run Code Online (Sandbox Code Playgroud)