anchor.diff:      print ast
   }
   
  -header "sslTreeParser.__main__" {
  +header "sslPreprocessor.__main__" {
       from sslLexer import Lexer
       from sslParser import Parser
       
  
positive.code:     |! #(LSQUARE etn:NAME eti:rtl_expand)
          {
              if #eti.getType() != NUM:
                  raise SemanticException(#eti, "undefined indice")
              ## = self.astFactory.dup(self.tables[etn.getText()][int(#eti.getText())])
          }
      |! #(RSQUARE lexpr:rtl_expand t:NAME i:rtl_expand rexpr:rtl_expand)
          {
              if #i.getType() != NUM:
                  raise SemanticException(#n, "undefined indice")
              op = self.astFactory.dup(self.tables[t.getText()][int(#i.getText())])
              ## = #(#op, #lexpr, #rexpr)
          }
      |! #(LPAREN f:NAME { args = [] } (arg:rtl_expand { args.append(#arg) } )* )
          {
              if f.getText() in self.functions:
                  params, rtl = self.functions[f.getText()]
                  self.locals.append(dict(zip(params, args)))
                  self.rtl_expand(rtl)
                  ## = self.returnAST
                  self.locals.pop()
              else:
                  ## = #(LPAREN, #f)
                  for _arg in args:
                      ##.addChild(_arg)
          }
  	|! #(r:. {/*print "=>", #r; */## = self.astFactory.dup(#r)} (no:rtl_expand { ##.addChild(#no) } )* )
  	;
  
negative.code: fast_entry: NAME INDEX^ NAME;
  
  
  class sslPreprocessor extends TreeParser;
  options {
  	buildAST = true;
  }
  
  start
  	: #(SPEC (part)*)
  		{
              names = self.instructions.keys()
              names.sort()
              for name in names:
                  params, body_ast = self.instructions[name]
                  params_ast = #(#[PARAMS,"PARAMS"])
                  for param in params:
                     params_ast.addChild(#(#[NAME,param]))
                  instr_ast = #(#[INSTR,"INSTR"], #[NAME,name], params_ast, body_ast)
                  ##.addChild(instr_ast)
  		}
  	;
  
  part
  	:! #(CONSTANT cn:NAME cv=constant_expr)
  		{ self.constants[cn.getText()] = #[NUM, str(cv)] }
  	|! #(TABLE tn:NAME tv=table_expr)
  		{ self.tables[tn.getText()] = tv }
  	|! #(FUNCTION fn:NAME fp=parameter_list fb:RTL)
  		{ self.functions[fn.getText()] = fp, self.astFactory.dupTree(fb) }
  	|! #(INSTR inam=instr_name ip=parameter_list ib:RTL)
  		{
              for n, v in inam:
                  self.locals.append(v)
  