Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用IronRuby解析Ruby代码?_Ruby_C# 4.0_Ironruby - Fatal编程技术网

如何使用IronRuby解析Ruby代码?

如何使用IronRuby解析Ruby代码?,ruby,c#-4.0,ironruby,Ruby,C# 4.0,Ironruby,我对IronRuby是新手。我正在尝试将其与C#集成 我已经创建了以下示例,它运行良好 string rubyCode = @" def function_111(test) print 1 end "; ScriptEngine engine = Ruby.CreateEngine();

我对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");
若你们看上面的代码,那个么我使用的是编译和执行代码的execute方法,但我只想解析代码,这意味着它的语法是否正确


这怎么可能呢

发布的链接似乎已经死了,搜索引擎缓存副本似乎正在腐烂,因此我将刮去帖子的剩余部分,并在下面对其进行解释


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

创建引擎 创建源单元 作语法分析 步行 您需要对该类进行子类化,该类有许多虚拟方法来处理对AST中各种节点的访问。中使用的一个看起来是这样的:

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

我使用并添加了IronRuby 1.1.3 nuget包,并用上面的内容创建了一个应用程序。

通过谷歌搜索“IronRuby解析器”发现:它真的对我有帮助。它解决了我的问题。而且,链接已经失效。这就是为什么不鼓励只建立链接。
var parser = new Parser();
var srcTreeUnit = parser.Parse(srcUnit, new RubyCompilerOptions(), ErrorSink.Default);
var walker = new MyWalker();
walker.Walk(srcTreeUnit);
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);
    }
}
Method call: puts
String Literal: hello