[英]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.