首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用STD.pm6语法解析Perl6代码?

如何使用STD.pm6语法解析Perl6代码?
EN

Stack Overflow用户
提问于 2016-01-18 00:26:28
回答 2查看 164关注 0票数 2

我想要使用STD.pm6从Perl6解析Perl6代码的最小工作示例

运行像这样的东西

代码语言:javascript
复制
use v6;
use STD.pm6;
my $j = slurp 'e:\src\perl6\valid-p6-script.p6';
my $o = STD::Grammar.parse($j);
say $o.perl;

under debugger给了我非常奇怪的输出:

代码语言:javascript
复制
e:\src\prg\perl6>c:\rakudo\bin\perl6-debug-m.bat -I. p6.p6
>>> LOADING p6.p6
>>> LOADING E:\src\prg\perl6\STD.pm6
Unhandled exception: ctxlexpad needs an MVMContext
   at gen/moar/m-CORE.setting:15136  (C:\rakudo/share/perl6/runtime/CORE.setting.moarvm::24)
 from gen/moar/m-CORE.setting:15250  (C:\rakudo/share/perl6/runtime/CORE.setting.moarvm:AT-KEY:95)
 from gen/moar/m-CORE.setting:4291  (C:\rakudo/share/perl6/runtime/CORE.setting.moarvm:postcircumfix:<{ }>:4294967295)
 from C:\rakudo/share/perl6/lib/Debugger/UI/CommandLine.pm:736  (C:\rakudo\share\perl6\lib\Debugger\UI\CommandLine.pm.mo
arvm::82)
 from gen/moar/m-CORE.setting:2826  (C:\rakudo/share/perl6/runtime/CORE.setting.moarvm:sink-all:168)
 from gen/moar/m-CORE.setting:10187  (C:\rakudo/share/perl6/runtime/CORE.setting.moarvm:sink:36)
 from C:\rakudo/share/perl6/lib/Debugger/UI/CommandLine.pm:730  (C:\rakudo\share\perl6\lib\Debugger\UI\CommandLine.pm.mo
arvm:unhandled:114)
 from C:\rakudo/share/perl6/lib/Debugger/UI/CommandLine.pm:721  (C:\rakudo\share\perl6\lib\Debugger\UI\CommandLine.pm.mo
arvm::25)
 from gen/moar/m-Metamodel.nqp:3586  (C:\rakudo\share\nqp\lib/Perl6/Metamodel.moarvm:enter:28)
 from gen/moar/m-CORE.setting:5190  (C:\rakudo/share/perl6/runtime/CORE.setting.moarvm:CALL-ME:57)
 from gen/moar/m-BOOTSTRAP.nqp:2749  (C:\rakudo/share/nqp/lib/Perl6/BOOTSTRAP.moarvm::93)
 from gen\moar\stage2\NQPHLL.nqp:1425  (C:\rakudo\share\nqp\lib/NQPHLL.moarvm:command_eval:380)
 from src/Perl6/Compiler.nqp:59  (C:\rakudo\share\nqp\lib/Perl6/Compiler.moarvm:command_eval:93)
 from gen\moar\stage2\NQPHLL.nqp:1365  (C:\rakudo\share\nqp\lib/NQPHLL.moarvm:command_line:114)
 from gen/moar/m-perl6-debug.nqp:497  (C:\rakudo\share\perl6\runtime\perl6-debug.moarvm:MAIN:190)
 from gen/moar/m-perl6-debug.nqp:440  (C:\rakudo\share\perl6\runtime\perl6-debug.moarvm:<mainline>:68)
 from <unknown>:1  (C:\rakudo\share\perl6\runtime\perl6-debug.moarvm:<main>:8)
 from <unknown>:1  (C:\rakudo\share\perl6\runtime\perl6-debug.moarvm:<entry>:9)

或者不使用调试器:

代码语言:javascript
复制
e:\src\prg\perl6>c:\rakudo\bin\perl6.bat -I. p6.p6
===SORRY!=== Error while compiling E:\src\prg\perl6\STD.pm6
Semicolon form of 'grammar' without 'unit' is illegal.  You probably want to use 'unit grammar'
at E:\src\prg\perl6\STD.pm6:8
------> :ver<6.0.0.alpha>:auth<http://perl.org>;<HERE><EOL>
  from p6.p6:2
EN

回答 2

Stack Overflow用户

发布于 2016-01-19 01:26:39

STD.pm6是Larry在开发各种Perl6编译器(Rakudo、Pugs、Niecza等)期间维护的参考语法/验证器。它附带了一个名为viv的专用工具,可以将它翻译成Perl5,据我所知,它从未在任何主流编译器上运行过。

随着6.c语言的发布,引用实现的火炬基本上传递给了Rakudo,后者使用用NQP编写的its own grammar来解析Perl6。

虽然这个语法(与corresponding actions结合)可以通过导入这些模块:from<NQP>来用于手动解析,但更友好的方法(例如,不需要声明$*LINEPOSCACHE)将通过相应的编译器对象:

代码语言:javascript
复制
say nqp::getcomp('perl6').eval($source, :target<parse>).dump;

其他感兴趣的目标可能是:target<syntaxcheck>以及更低级的:target<ast>,或者对于好奇的人来说,甚至可能是:target<mast>

票数 5
EN

Stack Overflow用户

发布于 2016-01-19 00:32:10

#perl6对话中的工作示例:

代码语言:javascript
复制
use nqp; 
use Perl6::Grammar:from<NQP>; 
use Perl6::Actions:from<NQP>; 
my $source = q|say "hello world";|; 
my $*LINEPOSCACHE; 
my $p6c = Perl6::Grammar.parse($source, :actions(Perl6::Actions.new())); 
say $p6c.dump
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34840615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档