2

PEGJSチュートリアルからの引用:

パーサーを生成するには、PEG.buildParser メソッドを呼び出し、文法をパラメーターとして渡します。

var parser = PEG.buildParser("start = ('a' / 'b')+");

私の文法はもう少し複雑です:

start
  = additive

additive
  = left:multiplicative "+" right:additive { return left + right; }
  / multiplicative

multiplicative
  = left:primary "*" right:multiplicative { return left * right; }
  / primary

primary
  = integer
  / "(" additive:additive ")" { return additive; }

integer "integer"
  = digits:[0-9]+ { return parseInt(digits.join(""), 10); }

PEG.buildParser文法の開始規則、つまりに合格する必要がadditiveありますが、正しく理解できません。PEG.buildParser(additive)またはと書く PEG.buildParser(start)と、FireBug は次のように言いました SyntaxError: Expected "=" or string but end of input found。私が書くPEG.buildParser(start = additive)と、私は得GrammarError: Referenced rule "additive" does not existます。私の文法を渡す正しい方法は何ですか?

4

2 に答える 2

1

buildParser完全な文法は、文字列として解析する必要があります。

PEG = require('pegjs');
var parser = PEG.buildParser(
  'start\n' +
  '  = additive\n' +
  '\n' +
  'additive\n' +
  '  = left:multiplicative "+" right:additive { return left + right; }\n' +
  '  / multiplicative\n' +
  '\n' +
  'multiplicative\n' +
  '  = left:primary "*" right:multiplicative { return left * right; }\n' +
  '  / primary\n' +
  '\n' +
  'primary\n' +
  '  = integer\n' +
  '  / "(" additive:additive ")" { return additive; }\n' +
  '\n' +
  'integer "integer"\n' +
  '  = digits:[0-9]+ { return parseInt(digits.join(""), 10); }'
);
console.log(parser.parse('(1+2)*3'));
于 2014-04-16T11:11:09.697 に答える
1

文法をファイルからロードし、パーサーをファイルにエクスポートする場合は、この例を試してください。

const peg = require('pegjs');
const fs = require('fs');

const grammarAsString = fs.readFileSync('./grammar.pegjs').toString();

const option = {
  output: 'source',
};

const parserSourceCode = peg.generate(grammarAsString, option);
fs.writeFileSync('./parser.js', parserSourceCode);

const parser = required('./parser.js');
const output = parser.parse("(1 + 2) * 3"); // output = 9

パーサーをオブジェクトにしてそれを直接使用する場合は、出力値を「ソース」から「パーサー」に直接変更するか、まったく渡さないでください。デフォルトはパーサーです。

const peg = require('pegjs');
const fs = require('fs');

const grammarAsString = fs.readFileSync('./grammar.pegjs').toString();

const parserObjet = peg.generate(grammarAsString);
const output = parserObject.parse("(1 + 2) * 3"); // output = 9
于 2019-12-23T00:21:17.780 に答える