Skip to content

Lite PEG

duangsuse edited this page May 7, 2018 · 6 revisions

Lite PEG 规则

Work in progress, 也有可能不会出,因为 duangsuse 现在还太菜,不会用解析器生成器, 垃圾 @duangsuse

  • 为什么不会呢

duangsuse 还无法理解为什么 PEG 可以通过奇怪的 add -> multiply '+' add 这样的语法规则去解决运算符优先级的问题

duangsuse 还无法理解解析中的交换律

duangsuse 并不了解正则表达式,不过这个可以学,但是内容量比较大

  • PEG 是什么?

P arsing E xpression G rammar, 一种描述解析器语法规则的语法

  • 看起来怎么样?
// Simple Arithmetics Grammar
// ==========================
//
// Accepts expressions like "2 * (3 + 4)" and computes their value.

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]*
              
  • 能吃吗

不能吃呦 😺