原文链接: pegjs 几个例子
上一篇: ecs 游戏设计 架构
下一篇: canvas 水墨画效果
没好好学编译原理, 有点难受了
https://juejin.cn/post/6844903713828519943
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];
简单的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]
.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
}