Parsing 带有运算符优先规则的Perl 6语法示例

Parsing 带有运算符优先规则的Perl 6语法示例,parsing,grammar,raku,Parsing,Grammar,Raku,我对Perl非常陌生,希望使用新的Perl 6语法特性创建一种具有优先权的运算符的特定于域的语言。例如,以正确的方式解析“1+2*6” 到目前为止,我找到的文档(例如)还没有针对具有优先声明的运算符的语法规则的示例 我有一个非常简单的例子 use v6; #use Grammar::Tracer; grammar TestGrammar { token TOP { <digit> <infix> <digit> }

我对Perl非常陌生,希望使用新的Perl 6语法特性创建一种具有优先权的运算符的特定于域的语言。例如,以正确的方式解析“1+2*6”

到目前为止,我找到的文档(例如)还没有针对具有优先声明的运算符的语法规则的示例

我有一个非常简单的例子

use v6;

#use Grammar::Tracer;

grammar TestGrammar {

    token TOP {
        <digit> <infix> <digit>
    }

    token infix:sym<times> is equiv(&infix:<*>) { <sym> }

}

sub MAIN() {
    my $text = "1 times 2" ;
    say $text ;

    my $match = TestGrammar.parse($text);
    say $match;
}

我只想构造一个抽象语法树。

好吧,你不能在语法中设置中缀运算符和定义优先级等。这些当前仅适用于扩展Perl 6

这里有一个可能的方法。它在加法之前解析乘法项,还允许使用单词或符号,例如
*

使用v6;
语法测试语法{
规则顶部{}
ruleadd{+%[确实提到,尽管规则和标记是特殊的方法,但它们都可以声明为multi,并像常规方法一样接受参数

该方法利用递归和多重分派来实现运算符优先级

使用v6;
语法测试语法{
规则顶部{}
#操作员多重调度,从最松到最紧
多标记op(3){'+'|'-'|加|减}
多标记op(2){'*'|'/'|乘|除}
多令牌op(1){'**'}
#表达式多分派(递归)
多规则表达式(0){|'('~'')}
多规则表达式($pred){+%[]}
}
副标题(){
“2+2”、“2+2”、“1*2”、“1+2**3*6”、“4次(7减3)*3”){
美元;
my$match=TestGrammar.parse($\ux);
说$match;
}
}

是的,这是我希望避免的标准方法。最后我想定义我自己的许多操作符(后循环修复、列表等)我认为perl可以处理这个问题。你知道这是否也适用于吗?Perl6从nqp继承了HLL::语法,这可能也适合你。你也可以尝试询问perl 6 irc-update:现在有一些文档和工作示例,用于使用nqp工具链实现HLL和特定于域的语言!请参阅。工作ed示例从第118页开始,
multi-token op(3){'+'.'-''add | minus}
只需更改
+
-
add
,以及
minus
3
?@ChristopherBottoms是的,在上述示例中,所有加法运算符都处于最低的递归和优先级
No such method 'infix' for invocant of type 'TestGrammar'