def testParseExpression(self): kit = OperatorBuilder() kit.atomic_term_expr = Rex(r"^\d") | Rex(r"^\w") kit.composed_term_node_labels = ( "t", ) kit.generated_term_label = "t" descAndExprs = [] descAndExprs.append(( "atomicExpr", kit.build_atom_to_term_expr() )) descAndExprs.append(( "funcCallExpr", kit.build_tO_expr(( BuildToNode("CL", Literal("(")), BuildToNode("CR", Literal(")")) ), pseudoPrefix="TO") )) descAndExprs.append(( "parenExpr", kit.build_O_expr(( BuildToNode("PL", Literal("(")), BuildToNode("PR", Literal(")")) )) )) descAndExprs.append(( "indexExpr", kit.build_tO_expr(( Literal("["), Literal("]") )) )) descAndExprs.append(( "unaryMinusExpr", kit.build_Ot_expr(Literal("-")) )) descAndExprs.append(( "binaryStarExpr", kit.build_tOt_expr(Literal("*")) )) descAndExprs.append(( "binaryMinusExpr", kit.build_tOt_expr(Literal("-")) )) descAndExprs.append(( "conditionExpr", kit.build_tOt_expr(( Literal("?"), Literal(":") ), pseudoPrefix="TOT") )) results = map(scan_seq, [ r"[code,-,[t,1],-,[t,2],*,(,[t,3],-,[t,4],),-,[t,a],\[,[t,5],\],*,[t,6],?,[t,7],:,[t,8],-,[t,9],?,[t,b],(,[t,c],-,[t,1],\,,[t,d],),:,[t,e]]", r"[code,-,[t,1],-,[t,2],*,(,[t,3],-,[t,4],),-,[t,a],\[,[t,5],\],*,[t,6],?,[t,7],:,[t,8],-,[t,9],?,[t,[TO],[t,b],[CL,(],[t,c],-,[t,1],\,,[t,d],[CR,)]],:,[t,e]]", r"[code,-,[t,1],-,[t,2],*,[t,[PL,(],[t,3],-,[t,4],[PR,)]],-,[t,a],\[,[t,5],\],*,[t,6],?,[t,7],:,[t,8],-,[t,9],?,[t,[TO],[t,b],[CL,(],[t,c],-,[t,1],\,,[t,d],[CR,)]],:,[t,e]]", r"[code,-,[t,1],-,[t,2],*,[t,[PL,(],[t,3],-,[t,4],[PR,)]],-,[t,[t,a],\[,[t,5],\]],*,[t,6],?,[t,7],:,[t,8],-,[t,9],?,[t,[TO],[t,b],[CL,(],[t,c],-,[t,1],\,,[t,d],[CR,)]],:,[t,e]]", r"[code,[t,-,[t,1]],-,[t,2],*,[t,[PL,(],[t,3],-,[t,4],[PR,)]],-,[t,[t,a],\[,[t,5],\]],*,[t,6],?,[t,7],:,[t,8],-,[t,9],?,[t,[TO],[t,b],[CL,(],[t,c],-,[t,1],\,,[t,d],[CR,)]],:,[t,e]]", r"[code,[t,-,[t,1]],-,[t,[t,2],*,[t,[PL,(],[t,3],-,[t,4],[PR,)]]],-,[t,[t,[t,a],\[,[t,5],\]],*,[t,6]],?,[t,7],:,[t,8],-,[t,9],?,[t,[TO],[t,b],[CL,(],[t,c],-,[t,1],\,,[t,d],[CR,)]],:,[t,e]]", r"[code,[t,[t,-,[t,1]],-,[t,[t,2],*,[t,[PL,(],[t,[t,3],-,[t,4]],[PR,)]]],-,[t,[t,[t,a],\[,[t,5],\]],*,[t,6]]],?,[t,7],:,[t,[t,8],-,[t,9]],?,[t,[TO],[t,b],[CL,(],[t,[t,c],-,[t,1]],\,,[t,d],[CR,)]],:,[t,e]]", r"[code,[t,[TOT],[t,[t,-,[t,1]],-,[t,[t,2],*,[t,[PL,(],[t,[t,3],-,[t,4]],[PR,)]]],-,[t,[t,[t,a],\[,[t,5],\]],*,[t,6]]],?,[t,7],:,[t,[t,8],-,[t,9]],?,[t,[TO],[t,b],[CL,(],[t,[t,c],-,[t,1]],\,,[t,d],[CR,)]],:,[t,e]]]", ]) text = "-1-2*(3-4)-a[5]*6?7:8-9?b(c-1,d):e" seq = [ 'code' ] + split_to_strings(text, re.compile(r"[a-z]+|(\d|[.])+|[-+*/%()?:,]|\[|\]")) for ( desc, expr ), result in zip(descAndExprs, results): print "step: %s" % desc seq = expr.parse(seq) seq_wo_attr = seq_remove_strattrs(seq) sys.stdout.write("\n".join(seq_pretty(seq_wo_attr)) + "\n") self.assertEquals(seq_wo_attr, result)
def testParseExpressionWithGerbageToken(self): kit = OperatorBuilder() kit.atomic_term_expr = Rex(r"^\d") kit.composed_term_node_labels = ( "t", ) kit.generated_term_label = "t" descAndExprs = [] descAndExprs.append(( "atomicExpr", kit.build_atom_to_term_expr() )) descAndExprs.append(( "funcCallExpr", kit.build_tO_expr(( BuildToNode("CL", Literal("(")), BuildToNode("CR", Literal(")")) ), pseudoPrefix="TO") )) descAndExprs.append(( "parenExpr", kit.build_O_expr(( BuildToNode("PL", Literal("(")), BuildToNode("PR", Literal(")")) )) )) descAndExprs.append(( "unaryMinusExpr", kit.build_Ot_expr(Literal("-")) )) descAndExprs.append(( "binaryStarExpr", kit.build_tOt_expr(Literal("*")) )) descAndExprs.append(( "binaryMinusExpr", kit.build_tOt_expr(Literal("-")) )) text = "-1-2*(3-gerbage)-4" seq = [ 'code' ] + split_to_strings(text, re.compile(r"[a-z]+|(\d|[.])+|[-+*/%()?:,]|\[|\]")) for desc, expr in descAndExprs: #print "step: %s" % desc seq = expr.parse(seq) seq_wo_attr = seq_remove_strattrs(seq)