Nearley Moo-语法不适用于Moo词法分析器

时间:2018-10-28 03:06:35

标签: javascript tokenize moo nearley

我正在使用带有moo.js标记器的Nearley.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拍摄,无法正常工作,所以我想知道我哪里写错了。

1 个答案:

答案 0 :(得分: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