簡體   English   中英

PEGJS:如何傳遞語法

[英]PEGJS: How to pass a grammar

引用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 通過我的語法的正確方法是什么?

完整的語法必須被解析為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'));

如果您想從文件加載語法並將解析器導出到文件,請嘗試此示例

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM