【问题标题】:How do I parse javascript code in Jint interpreter?如何在 Jint 解释器中解析 javascript 代码?
【发布时间】:2016-09-15 21:49:49
【问题描述】:

我想确保 javascript 代码是有效的语法:

string test = " var i = 0; ";
Jint.Engine ScrptingEngine = new Jint.Engine();
bool result = ScrptingEngine.Parse(test);

【问题讨论】:

    标签: c# jint


    【解决方案1】:

    您可以使用Execute() 方法“解析”您的JavaScript,并使用GetValue() 方法检索该值,然后断言它按预期工作。

    string test = " var i = 0; ";
    Jint.Engine ScrptingEngine = new Jint.Engine();
    var result = ScrptingEngine.Execute(test).GetValue("i");
    Assert.AreEqual(0, result);
    

    另外,如果 JavaScript 无效,Execute 方法也会抛出一个JavaScriptException

    try
    {
        ScrptingEngine.Execute("xx = ss == esfx = fuct()"); 
    }
    catch(JavaScriptException ex) {}
    

    【讨论】:

    • 你是对的,但 Execute 实际上会运行代码,我认为这不是一个好主意。如果目前无法在不运行代码的情况下验证代码,我仍会将这个答案标记为正确。
    • @YongkeBillYu 在不实际运行的情况下验证 JavaScript 非常棘手,并且需要强大的 AST 解析器。我不知道 jint 是否支持这一点,而且我在 api 的任何地方都看不到 Validate 方法。
    • 你能把我链接到 API 吗?
    • @YongkeBillYu 当然可以。我只能找到 GitHub 上有限的 README。 github.com/sebastienros/jint
    • @YongkeBillYu 查看源代码,它显然使用了 ast,但我找不到解析方法。
    【解决方案2】:

    如果将脚本添加到对象,则它不应运行任何代码。

    var myscript = @"
    var badFunction = function(){/* please don't run this*/ } 
    badFunction ();"
    
    new Engine().Execute("var noRun = {" + myscript + "}");
    

    虽然脚本本身不会破坏对象封装,但不能保证。

    【讨论】:

      【解决方案3】:

      调用 JavaScriptParser 怎么样?

      Esprima.JavaScriptParser parser = new Esprima.JavaScriptParser(script);
      parser.ParseScript();
      

      当您将 Jint 添加到您的项目时,您还会获得 Esprima 命名空间,这就是 Jint 在内部使用的名称(如果我正确阅读了源代码的话)。

      然后你可以赶上Esprima.ParserException

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-25
        相关资源
        最近更新 更多