anchor.diff:          Error("Duplicate item name %s" % name)
       names[name] = None
       variables.append((type, name, array, default))
  +
  +def modparam(type, name, default, doc):
  +    if name in names:
  +        Error("Duplicate item name %s" % name)
  +    names[name] = None
  +    modparams.append((type, name, default, doc))
   
   def removeprefix(s,p):
       if s.startswith(p): return s[len(p):]
  
positive.code:                 | NAME {{ return NAME }}
                  | FPNUMBER {{ return float(FPNUMBER.rstrip("f")) }}
                  | NUMBER {{ return int(NUMBER,0) }}
      rule OptValue: Value {{ return Value }}
                  | {{ return 1 }}
  %%
  
  def parse(rule, text, filename=None):
      global P, S
  
negative.code:         if personality: has_personality = True
      for type, name, array, value in variables:
          if array: has_array = True
      for type, name, default, doc in modparams:
          decl = mp_decl_map[type]
          if decl:
              print >>f, "%s %s" % (type, name),
              if default: print >>f, "= %s;" % default
              else: print >>f, ";"
              print >>f, "%s(%s, %s);" % (decl, name, q(doc))
              
      print >>f
      print >>f, "struct state {"
      print >>f, "    struct state *_next;"
  