如何扩展默认的PEG.js算术示例以允许多个表达式而不是单个表达式



作为解析器的一部分,我想添加算术表达式和布尔表达式。我想在https://pegjs.org/online但问题是,这个解析器是递归的,你不能写两行或更多行:

例如,这是有效的JavaScript:

2 * (3 + 4)
2 * (3 + 4)
2 * (3 + 4)
+ 10

正如您所看到的,有3个表达式,行的末尾并没有终止它们。但是对于PEG.js,它们需要显式编码,因此表达式可以终止。

如何创建这样的无限表达式,终止并转到下一个表达式?

您可以为多个表达式添加如下Start规则。

Start
= head:Expression tail:("n" Expression)* {
return [head].concat(tail.map(function(element) {
return element[1];
}));
}
Expression
= head:Term tail:(_ ("+" / "-") _ Term)* {
return tail.reduce(function(result, element) {
if (element[1] === "+") { return result + element[3]; }
if (element[1] === "-") { return result - element[3]; }
}, head);
}
Term
= head:Factor tail:(_ ("*" / "/") _ Factor)* {
return tail.reduce(function(result, element) {
if (element[1] === "*") { return result * element[3]; }
if (element[1] === "/") { return result / element[3]; }
}, head);
}
Factor
= "(" _ expr:Expression _ ")" { return expr; }
/ Integer
Integer "integer"
= _ [0-9]+ { return parseInt(text(), 10); }
_ "whitespace"
= [ tnr]*

最新更新