pegjs 几个例子

原文链接: pegjs 几个例子

上一篇: ecs 游戏设计 架构

下一篇: canvas 水墨画效果

没好好学编译原理, 有点难受了

https://juejin.cn/post/6844903713828519943

https://pegjs.org/online

https://juejin.cn/post/6844904068117168142

https://zhuanlan.zhihu.com/p/23152218

https://zhuanlan.zhihu.com/p/252343056

https://www.zhihu.com/question/54614415

数据集简单的select实现

start
= selectStatements:selectStatement* 
{ 
    return selectStatements.join("\n")
}

selectStatement
= select _ colunm_clause:colunm_clause _ from _ table_name:table_name __ ';'{ return `column_name=${colunm_clause}, table_name=${table_name}`}

colunm_clause
= column_name
/ '*'

column_name
= name:ident_part+ {return name.join("")}

table_name
= name:ident_part+ {return name.join("")}

ident_part
= [A-Za-z0-9]

select
= 'select'i

from
= 'from'i

__ = whitespace*
_ = whitespace+

whitespace
= [ \t\r\n];

up-aeb3b0a965bc53dc31891d0e576d4188ef0.png

简单的css

StartRule
  = '.'selector:(Word) WSS LB* '{' LB* WSS property:(Word) WSS ':' WSS value:(WordWithNumeric) WSS ';' WSS LB* '}' {
    return {
        "selector": selector,
        "property": property,
        "value": value
    }
  }

Word
    = l:AlphaChars+ {
        return l.join('');
    }

WordWithNumeric
    = l:ALPHA_NUMERIC_CHARS+ {
        return l.join('');
    }

AlphaChars
    = [a-zA-Z]

ALPHA_NUMERIC_CHARS
  = [a-zA-Z0-9]

WS "whitespace"
    = [ \t]

WSS "whitespaces"
    = WS*  

LB "Linebreak"
    = [\r\n]

up-84fac6f4b37b6ba3750ef9380257e7a63b5.png

.main{margin: 20px;}

.main { margin  : 20px;  }

.main
{
  margin  : 20px;  
}

逆波兰表达式

{
  function buildBinaryExpression(op, left, right) {
    return {
      type: 'BinaryExpression',
      operator: op,
      left: left,
      right: right
    }
  }
  
  function evalBinaryExpression(op, left, right) {
    switch (op) {
    case "+": return left + right; break
    case "-": return left - right; break
    case "*": return left * right; break
    case "/": return left / right; break
    }
  }
}

Expression
  = head:Integer tail:ExpressionRest* {
      return tail.reduce(function (acc, e) {
        return buildBinaryExpression(e.operator, acc, e.right)
      }, head)
    }

ExpressionRest
  = _ right:Expression _ op:("*" / "/" / "+" / "-") {
      return {
        operator: op,
        right: right
      }
    }

Integer "integer"
  = [0-9]+ { return parseInt(text(), 10); }

_ "whitespace"
  = [ \t\n\r]*
1 2 + 4 * 5 + 3 -
{
   "type": "BinaryExpression",
   "operator": "-",
   "left": {
      "type": "BinaryExpression",
      "operator": "+",
      "left": {
         "type": "BinaryExpression",
         "operator": "*",
         "left": {
            "type": "BinaryExpression",
            "operator": "+",
            "left": 1,
            "right": 2
         },
         "right": 4
      },
      "right": 5
   },
   "right": 3
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值