|
PEG.js demonstation有一个四则运算的句法分析器
- 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"
- = [ \t\n\r]*
复制代码
例子
2 * (3 + 16/2/2)输出14
解释
- Expression拆分成head和tail.
head是一个Term.
tail是几个前面带着+或-的Term(这里*表示0个或更多),每个+或-两边可以带空白(见最后一条). - Term拆分成head和tail.
head是一个Factor.
tail是几个前面带着*或/的Factor,每个*或/两边可以带空白. - Factor是一个用()括住的Expression(两边可以带空白),或一个Integer.
- Integer是几个0-9字符(这里+表示1个或更多).
- _是几个连续空白(0个或更多).
问题
如何给这个分析器加上乘方^呢? 像2^2=4、2^2^2=16这些.
注意, 乘方^是右结合的, 而*和/是左结合的.
相关
latex.js is written in JavaScript using PEG.js.
Wikipedia–Abstract syntax tree
Context-Free Grammars
$\LaTeX$ Calculator$^2$
Interpreted math equation language 🧮 |
|