用python和javascript编写的高度可配置的基于优先级的解析器
pre-js-p的Python项目详细描述
这是什么?
prejspy是一个高度可配置的基于优先级的解析器,用python和javascript编写。 默认语法基于javascript的一个子集,但可以适应许多不同的场景。
>>>fromPreJsPyimportPreJsPy>>>parser=PreJsPy()>>>parser.parse("6 * 9 == 42"){'type':'BinaryExpression','operator':'==','right':{'type':'Literal','raw':'42','value':42.0},'left':{'type':'BinaryExpression','operator':'*','right':{'type':'Literal','raw':'9','value':9.0},'left':{'type':'Literal','raw':'6','value':6.0}}}
>varPreJsPy=require('pre-js-py').PreJsPy;>parser=newPreJsPy()>parser.parse('6 * 9 == 42'){type:'BinaryExpression',operator:'==',left:{type:'BinaryExpression',operator:'*',left:{type:'Literal',value:6,raw:'6'},right:{type:'Literal',value:9,raw:'9'}},right:{type:'Literal',value:42,raw:'42'}}
这个库的javascript版本改编自javascript库jsep,它是(c)2013 stephen oney,http://jsep.from.so/,并根据mit许可证的条款发布。代码已经移植到python中,并且添加了许多实用函数。
语法功能
- 符号值
- 常数
- 例如`true`、`false`和`null`
- 可配置:可添加任意常数
- 标识符
- 可能包含$、\u或字母数字字符,但不能以数字开头
- 可以包括属性名和访问器,例如foo,bar.baz,foo['bar'].baz
- 各种文字类型
- 数字文本(`42.001`)
- 十进制表示法(`-42`)
- 指数表示法(`6.7E-10`)
- 字符串文本(`"Hello world"`)
- 可以是双引号或单引号
- 特殊字符可以转义
- 数组文本(`[1, 2, 3]`)
- 必须用方括号括起来
- 可以嵌套
- 多种类型的运算符
- 一元运算符
- 默认情况下`-`、`!`、`~`和`+`
可以添加自定义运算符,现有的运算符可以删除
- 二进制运算符
- 基于优先级
- 默认情况下包含所有javascript运算符
- 可以使用自定义先例添加自定义先例
- 括号可用于替代先例
- javascript条件运算符
- 单三元运算符`a ? b : c`
- 调用表达式
- 必须使用圆括号
- 例如`Math.cos(x)`
API
javascript和python中的api几乎相同。唯一的区别来自语言本身的特点。
varparser=newPreJsPy();// creates a new parser parser.getConstants()// returns an object containing constants parser.setConstants(d)// sets the current constants know to the parser parser.getUnaryOperators()// gets an array of unary operators parser.setUnaryOperators(ary)// sets an array of unary operators parser.getBinaryOperators()// returns an object mapping binary operators to their precedence parser.setBinaryOperators(ary)// sets the binary operators to precedence mapping parser.parse(s)// parses a string into a AST
parser=PreJsPy()# creates a new parserparser.getConstants()# returns an object containing constantsparser.setConstants(d)# sets the current constants know to the parserparser.getUnaryOperators()# gets an array of unary operatorsparser.setUnaryOperators(ary)# sets an array of unary operatorsparser.getBinaryOperators()# returns an object mapping binary operators to their precedenceparser.setBinaryOperators(ary)# sets the binary operators to precedence mappingparser.parse(s)# parses a string into a AST
安装
此包发布在 Python Package Index 安装只需通过pip:
pip install pre_js_py
它也发表在 Nodejs Package Manager 只需通过NPM即可完成安装:
npm install pre-js-py
许可证+确认
本模块及相关文档版权所有(C)Tom Wiesing 2016 并根据麻省理工学院的许可证获得许可,详情请参见license。