Parsing 带有运算符优先规则的Perl 6语法示例
我对Perl非常陌生,希望使用新的Perl 6语法特性创建一种具有优先权的运算符的特定于域的语言。例如,以正确的方式解析“1+2*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> }
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'