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)