Rule #1 - add IS MADE OF add + number
OR number + number
add: add'+'number | number'+'number ;
number + number + number + number
[number + number] + number + number
[add + number] + number
[add + number] add
1 + 2 * 3 / 4 - 5 + 6
1 + (2 * 3 / 4) - 5 + 6
add: add+mul | mul'+'mul ; mul: mul '*; number | number'*'number ;
number + number * number * number number + [number * number] * number
number + [mul * number] number + mul ???
add: add'+'mul | mul'+'mul | mul ; mul: mul'*'number | number'*'number | number ;
add: add'+'mul | mul ; mul: mul'*'number | number ;
number + number * number * number
number + [number] * number * number number + [mul * number] * number number + [mul * number] [number] + mul [mul] + mul [add + mul] add
>>>fromplyplusimportGrammar
>>> g=Grammar("""...""")
>>>printg.parse('1+2*3-5').pretty()
start
add
add
add
mul
number
1
add_symbol
+
mul
mul
number
2
mul_symbol
*
number
3
add_symbol
-
mul
number
5
start: add; ?add: add add_symbol mul | mul; // Expand add if it's just a mul ?mul: mul mul_symbol number | number;// Expand mul if it's just a number number:'[d.]+'; mul_symbol:'*'|'/'; add_symbol:'+'|'-';
>>> g=Grammar("""...""")
>>>printg.parse('1+2*3-5').pretty()
start
add
add
number
1
add_symbol
+
mul
number
2
mul_symbol
*
number
3
add_symbol
-
number
5
start: add;
?add: (add add_symbol)? mul;
?mul: (mul mul_symbol)? atom;
@atom: neg | number |'('add')';
neg:'-'atom;
number:'[d.]+';
mul_symbol:'*'|'/';
add_symbol:'+'|'-';
WHITESPACE:'[ t]+'(%ignore);
>>>importoperator as op
>>>fromplyplusimportSTransformer
classCalc(STransformer):
def_bin_operator(self, exp):
arg1, operator_symbol, arg2=exp.tail
operator_func={'+': op.add,
'-': op.sub,
'*': op.mul,
'/': op.div }[operator_symbol]
returnoperator_func(arg1, arg2)
number =lambdaself, exp:float(exp.tail[0])
neg =lambdaself, exp:-exp.tail[0]
__default__=lambdaself, exp: exp.tail[0]
add=_bin_operator
mul=_bin_operator
>>> Calc().transform( g.parse('1 + 2 * -(-3+2) / 5.6 + 30'))
31.357142857142858
>>>eval('1 + 2 * -(-3+2) / 5.6 + 30')
31.357142857142858
defmain():
calc=Calc()
whileTrue:
try:
s=raw_input('> ')
exceptEOFError:
break
ifs=='':
break
tree=calc_grammar.parse(s)
printcalc.transform(tree)
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有