Nearley Moo - грамматика не работает с использованным лексером Moo

Я использую грамматику (и парсер) nearley.js с токенайзером moo.js. Мой файл grammar.ne выглядит следующим образом:

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

@lexer lexer

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

При синтаксическом анализе строки "sin8" для синтаксического анализатора, через nearley-test grammar.js -i "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". Этот пример взят непосредственно из документации и не работает, поэтому мне интересно, где я ошибаюсь.

2 ответа

Немного поиграв с 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 

Если moo передается как лексер, Неарли действительно не понимает простых строковых вводов. Вам нужно будет указать это в вашем токенизаторе.

Убедитесь, что у вас есть \b чтобы убедиться, что это отдельное слово, а не его часть.

Другие вопросы по тегам