【问题标题】:Nearley Moo - Grammar does not work with Moo lexer usedNearley Moo - 语法不适用于使用的 Moo 词法分析器
【发布时间】:2018-10-28 03:06:35
【问题描述】:

我将 nearley.js 语法(和解析器)与 moo.js 标记器一起使用。我的grammar.ne 文件如下:

@{%
    const moo = require('moo')
    let lexer = moo.compile({
        number: /[0-9]+/
    });
%}

@lexer lexer

trig -> "sin" [0-9]:+

当通过nearley-test grammar.js -i "sin8" 将字符串“sin8”解析到解析器时,出现以下错误:

throw new Error(this.formatError(token, "invalid syntax"))
      ^

Error: invalid syntax at line 1 col 1:

  sin8
  ^
    at Lexer.next (C:\Users\Florian\WebstormProjects\MineScript\node_modules\moo\moo.js:397:13)
    at Parser.feed (C:\Users\Florian\AppData\Roaming\npm\node_modules\nearley\lib\nearley.js:270:30)
    at Object.<anonymous> (C:\Users\Florian\AppData\Roaming\npm\node_modules\nearley\bin\nearley-test.js:83:12)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at startup (bootstrap_node.js:191:16)

但是,评论 @lexer lexer 使其工作,并匹配“sin8”字符串。 这个例子是直接from the documentation拍的,不起作用,所以我想知道我哪里错了。

【问题讨论】:

    标签: javascript tokenize nearley moo-lexer


    【解决方案1】:

    与 Nearley 玩了一会儿,在我看来,一旦你开始使用 Moo 。您必须在 Moo 词法分析器中定义所有可能的标记,并且您只能使用 Nearley 规则和后处理器。所以像下面这样的东西可能会起作用(我没有测试过):

    @{%
        const moo = require('moo')
        let lexer = moo.compile({
            number: /[0-9]+/,
            func: ['sin','cos'] //define sin, cos etc, here
        });
    %}
    
    @lexer lexer
    
    trig -> %func %number 
    

    【讨论】:

      【解决方案2】:

      如果 moo 作为词法分析器传递,Nearley 并不能真正理解简单的字符串输入。您需要在分词器中指定它。

      @{%
          const moo = require('moo')
          let lexer = moo.compile({
              number: /[0-9]+/,
              sin: /\bsin\b/,
          });
      %}
      
      @lexer lexer
      
      trig -> "sin" [0-9]:+

      确保有 \b 以确保它是一个单独的词,而不是它的一部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-16
        • 1970-01-01
        • 2014-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多