Example #1
0
 def ruleTest(self,rule,series):
   for s in series:
     #print "s: %s" % s
     parser = MakeParser(rule)
     self.stateTest(parser, s[0], '')
     for i, t in enumerate(s[1:]):
       #print "sending token: %s,%s" % (i, t)
       disp = parser.parse(t['tok'])
       self.stateTest(parser, t, disp)
Example #2
0
 def parse(self,token):
   if self.name in self.debug:
     print
     print "%s parsing %s" % (self.name, token)
   logging.debug("%s PlusParser parsing token '%s'" % (self.name, token))
   if not self.active:
     self.active = MakeParser(self.rule.items, self)
   self.bad = self.bad or self.active.bad
   if self.bad:
     raise Exception("%s PlusParser is bad" % self.name)
   wasdone = False
   if self.active.done:
     wasdone = True
     if self.name in self.debug:
       print " - wasdone"
   disp = self.active.parse(token)
   if self.name in self.debug:
     print " - received '%s'" % disp
   if wasdone and self.active.bad:
     # re-establish
     if self.name in self.debug:
       print "%s re-establishing" % self.name
     self.active = MakeParser(self.rule.items, self)
     self.unconfirmed = ''
     disp += self.parse(token)
     if self.name in self.debug:
       print "%s is re-established" % self.name
       print "%s evil=%s" % (self.name, self.evil)
     if self.neverGoBad and self.bad:
       raise Exception("%s StarParser has gone bad (eagerly)" % self.name)
     return disp
   self.bad = self.active.bad
   self.evil = self.active.evil
   self.done = self.active.done
   if self.name in self.debug:
     if self.evil:
       print "%s is evil, unconfirmed='%s'" % (self.name, self.unconfirmed)
   if self.done:
     self.unconfirmed = ''
   else:
     self.unconfirmed += disp
   if self.bad:
     if self.done:
       raise Exception("Plus noticed another terrible parser was both bad and done")
     if self.neverGoBad:
       raise Exception("%s StarParser has gone bad (eagerly)" % self.name)
     if self.unconfirmed:
       self.evil = True
       if self.name in self.debug:
         if self.evil:
           print "%s is evil2, unconfirmed='%s'" % (self.name, self.unconfirmed)
   if self.name in self.debug:
     print "%s evil=%s" % (self.name, self.evil)
   return disp
Example #3
0
class ActionParser(Parser):
  def __init__(self,rule,parent):
    if not isinstance(rule, Action):
      raise Exception("Cannot use an ActionParser on a non-Action rule")
    Parser.__init__(self, rule, parent)
    self.actioned = False
    self.active = MakeParser(rule.items, self)

  def parse(self,token):
    disp = self.active.parse(token)
    self.bad = self.active.bad
    self.done = self.active.done
    if not self.actioned and not self.bad and self.done:
      self.rule.func(self)
      self.actioned = True
      return disp
    return ''

  # The Action's msg should contain at most a single %s, which will be filled
  # by the display of its sub-parser.  It may have other text in its msg which
  # we'll want to display too.  So we let the Rule do the work.
  def display(self):
    d = self.active.display()
    return self.rule.display([d])
Example #4
0
 def __init__(self,rule,parent):
   Parser.__init__(self, rule, parent)
   self.firstparse = True
   msg = self.rule.msg.split('%s')
   self.msg_start = msg[0]
   self.msg_middle = self.rule.msg.count('%s') > 0
   self.msg_end = ''
   if len(msg) == 2:
     self.msg_end = msg[1]
   elif len(msg) > 2:
     raise Exception("DispParser %s found inappropriate msg '%s'" % (self.name, msg))
   if len(self.rule.items) != 1:
     raise Exception("DispParser %s must have 1 item" % self.name)
   self.parser = MakeParser(self.rule.items[0], self)
   self.bad = self.parser.bad
   self.done = self.parser.done
   self.name = self.name % self.parser.name
   self.debug = []
Example #5
0
 def parse(self,token):
   if self.parser.name in self.debug:
     print "%s parsing %s" % (self.name, token)
   if self.bad:
     raise Exception("%s DispParser: cannot parse '%s'; already bad" % (self.name, token))
   if not self.parser:
     self.parser = MakeParser(self.rule.items[0], self)
   disp = self.parser.parse(token)
   self.bad = self.parser.bad
   self.evil = self.parser.evil
   self.done = self.parser.done
   if self.bad:
     if self.parser.name in self.debug:
       print "%s went bad" % self.name
     if self.firstparse:
       if self.parser.name in self.debug:
         print "%s bad and firstparse" % self.name
       return ''   # deny a bad first parse
     if self.parser.name in self.debug:
       print "%s bad and wasdone" % self.name
     if self.msg_middle:
       disp += copy(self.msg_end)
     else:
       disp = copy(self.msg_end)
     self.msg_end = ''
   if self.firstparse:
     if self.msg_middle:
       if self.parser.name in self.debug:
         print "%s firstparse yields '%s':'%s'" % (self.name, self.msg_start, disp)
       disp = copy(self.msg_start) + disp
     else:
       if self.parser.name in self.debug:
         print "%s firstparse yields '%s'" % (self.name, disp)
       disp = copy(self.msg_start)
     self.msg_start = ''
     self.firstparse = False
   if self.parser.name in self.debug:
     print "%s boring yields '%s'" % (self.name, disp)
   return disp
Example #6
0
def ShokParser():
    parser = MakeParser(CmdLines)
    parser.neverGoBad = True
    return parser
Example #7
0
 def __init__(self,rule,parent):
   if not isinstance(rule, Action):
     raise Exception("Cannot use an ActionParser on a non-Action rule")
   Parser.__init__(self, rule, parent)
   self.actioned = False
   self.active = MakeParser(rule.items, self)
Example #8
0
class DispParser(Parser):
  def __init__(self,rule,parent):
    Parser.__init__(self, rule, parent)
    self.firstparse = True
    msg = self.rule.msg.split('%s')
    self.msg_start = msg[0]
    self.msg_middle = self.rule.msg.count('%s') > 0
    self.msg_end = ''
    if len(msg) == 2:
      self.msg_end = msg[1]
    elif len(msg) > 2:
      raise Exception("DispParser %s found inappropriate msg '%s'" % (self.name, msg))
    if len(self.rule.items) != 1:
      raise Exception("DispParser %s must have 1 item" % self.name)
    self.parser = MakeParser(self.rule.items[0], self)
    self.bad = self.parser.bad
    self.done = self.parser.done
    self.name = self.name % self.parser.name
    self.debug = []

  def parse(self,token):
    if self.parser.name in self.debug:
      print "%s parsing %s" % (self.name, token)
    if self.bad:
      raise Exception("%s DispParser: cannot parse '%s'; already bad" % (self.name, token))
    if not self.parser:
      self.parser = MakeParser(self.rule.items[0], self)
    disp = self.parser.parse(token)
    self.bad = self.parser.bad
    self.evil = self.parser.evil
    self.done = self.parser.done
    if self.bad:
      if self.parser.name in self.debug:
        print "%s went bad" % self.name
      if self.firstparse:
        if self.parser.name in self.debug:
          print "%s bad and firstparse" % self.name
        return ''   # deny a bad first parse
      if self.parser.name in self.debug:
        print "%s bad and wasdone" % self.name
      if self.msg_middle:
        disp += copy(self.msg_end)
      else:
        disp = copy(self.msg_end)
      self.msg_end = ''
    if self.firstparse:
      if self.msg_middle:
        if self.parser.name in self.debug:
          print "%s firstparse yields '%s':'%s'" % (self.name, self.msg_start, disp)
        disp = copy(self.msg_start) + disp
      else:
        if self.parser.name in self.debug:
          print "%s firstparse yields '%s'" % (self.name, disp)
        disp = copy(self.msg_start)
      self.msg_start = ''
      self.firstparse = False
    if self.parser.name in self.debug:
      print "%s boring yields '%s'" % (self.name, disp)
    return disp

  def fakeEnd(self):
    if self.parser:
      return self.parser.fakeEnd() + self.msg_end
    return self.msg_end