【问题标题】:How to parse Ruby Code using IronRuby?如何使用 IronRuby 解析 Ruby 代码?
【发布时间】:2014-09-27 13:24:27
【问题描述】:

我是 IronRuby 新手。我正在尝试将它与 C# 集成。

我创建了以下示例,它工作正常。

string rubyCode = @"
                    def function_111(test)
                       print 1
                    end                   
            ";
 ScriptEngine engine = Ruby.CreateEngine();            
 ScriptScope scope = engine.CreateScope();
 engine.Execute(rubyCode, scope);
 dynamic sayHelloFun = scope.GetVariable("function_111");
 sayHelloFun("test");

如果您查看上面的代码,那么我使用的是编译和执行代码的执行方法,但我只想解析代码,这意味着它的语法是否正确。

这怎么可能?

【问题讨论】:

标签: ruby c#-4.0 ironruby


【解决方案1】:

贴出来的链接好像失效了,而且搜索引擎缓存的副本好像已经烂掉了,所以我要把帖子剩下的部分刮下来,在下面解释一下。


您可以将IronRuby 与动态语言运行时 (DLR) 一起使用来解析 Ruby 代码。这些步骤是:创建一个 Ruby 引擎实例,创建一个脚本源和单元,创建一个解析器并解析为 AST,然后使用 Walker 遍历 AST。

创建引擎

var runtime = IronRuby.Ruby.CreateRuntime();
var engine = runtime.GetEngine("rb");

创建源单元

var src = engine.CreateScriptSourceFromString(@"puts 'hello'"); // also: engine.CreateScriptSourceFromFile
var srcUnit = HostingHelpers.GetSourceUnit(src);

解析

var parser = new Parser();
var srcTreeUnit = parser.Parse(srcUnit, new RubyCompilerOptions(), ErrorSink.Default);

走 AST

var walker = new MyWalker();
walker.Walk(srcTreeUnit);

您需要继承 Walker 类,该类有许多虚拟方法来处理访问 AST 中的各种节点。 LinqPad Query 中使用的那个看起来像这样:

public class MyWalker : Walker
{
    protected override void Walk(MethodCall node)
    {
        Console.WriteLine("Method call: " + node.MethodName);
        base.Walk(node);
    }

    protected override void Walk(StringLiteral node)
    {
       Console.WriteLine("String Literal: " + node.GetMutableString().ToString());
       base.Walk(node);
    }
}

当你在上面生成的 AST 上运行这个 walker 时,你会得到以下结果:

Method call: puts
String Literal: hello

我使用LinqPad 并添加了 IronRuby 1.1.3 nuget 包并使用上述内容创建了一个LinqPad Query

【讨论】:

    猜你喜欢
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2013-04-27
    • 2012-01-30
    • 2012-09-29
    • 1970-01-01
    相关资源
    最近更新 更多