Parser needed.

Skybuck Flying skybuck2000 at hotmail.com
Tue Jun 2 00:51:47 EDT 2015


If some of this code could be made to work it could be of some use:

ParserEngine is the least important...

MessageParser is interesting.

class AbstractSectionsParser(AbstractParser):
# Provides a method to return a list of sections
def GetResult(self):
  # Returns the list with the found resources.
  pass

class AbstractParser(object):
# Must be implemented by objects that want to use the DemoFileParser.
# Provides an empty implementation for conveniance
def StartParsing(self, filename):
  # Is called before the first line is parsed.
  # "filename" Absolute path to the file being parsed
  pass

def NewLine(self, line, lineNumber):
  # Is called by the parser when it has fetched a new line
  # "line" Content of the line
  # "lineNumber" Current line number (0 index)
  pass

def HasAllInformation(self):
  # Is called before each line is read. When you return true, parsing
  # will stop prematurely.
  # returns true if this plugin does not want to  process any more lines
  return False

def StopParsing(self, lineCount):
  # Is called, when all lines have been read by the parser.
  # "lineCount" Total number of lines in the demo file.
  pass

class MessagesParser(AbstractSectionsParser):
# Parses a demo file for "Notifications"
# The list in which the parser stores the pprocessed messages
# The string we are looking for in parsed messages
# Number of open braces ("{" increments, "}" decrements)
# The number of open braces at the last encounter of "Messages"
# The line at which the last "Messages" section started
# Flag that indicates if the parser has currently entered a
# "Messages" section
# Flag that indicates if we are currently processing a Messages
# section that contains the messageSearchString
# The last visited message test
# The command identifier
# The time index of the message in seconds
# The entity ref for this message
def __init__(self, messageSearchString):
   # Creates a new MessageParser object
   # <param name="messageSearchString">The string to look for in parsed
  self._result = List[DemoSection]()
  self._braceLevel = 0
  self._lastMessagesBraceLevel = 0
  self._lastMessagesSectionStart = 0
  self._inMessagesSection = False
  self._inSearchSection = False
  self._messageText = ""
  self._command = -1
  self._time = -1
  self._entityRef = -1
  self._messageSearchString = messageSearchString

def NewLine(self, line, lineNumber):
   # Is called by the parser when it has fetched a new line
   # <param name="line">Content of the line</param>
   # <param name="lineNumber">Current line number (0 index)</param>
  if line.Trim().StartsWith("Messages"):
   self._lastMessagesSectionStart = lineNumber
   self._lastMessagesBraceLevel = self._braceLevel
   self._inMessagesSection = True
  if self._inMessagesSection and line.Trim().StartsWith("Time"):
   timeString = line.Substring(line.IndexOf("Time ") + 5)
   self._time = Double.Parse(timeString, 
System.Globalization.CultureInfo.GetCultureInfo("en-US").NumberFormat)
  if self._inMessagesSection and line.Trim().StartsWith("Message ") and 
line.Contains(self._messageSearchString):
   self._inSearchSection = True
   self._messageText = line.Substring(line.IndexOf("Message ") + 8)
  if self._inMessagesSection and line.Trim().StartsWith("Command"):
   self._command = Convert.ToInt32(line.Substring(line.IndexOf("Command ") + 
8))
  if self._inMessagesSection and line.Trim().StartsWith("EntityRef"):
   self._entityRef = Convert.ToInt32(line.Substring(line.IndexOf("EntityRef 
") + 10))
  if self._inSearchSection and line.Trim().StartsWith("}") and 
self._braceLevel - 1 == self._lastMessagesBraceLevel:
   self._inMessagesSection = False
   self._inSearchSection = False
   message = DemoMessage()
   message.StartLine = self._lastMessagesSectionStart
   message.EndLine = lineNumber + 1
   message.Message = self._messageText
   message.Time = self._time
   message.Command = self._command
   message.EntityRef = self._entityRef
   self._result.Add(message)
  if line.Trim().StartsWith("{"):
   self._braceLevel += 1
  if line.Trim().StartsWith("}"):
   self._braceLevel -= 1

def GetResult(self):
  # Returns the list of parsed messages
  # <returns>Returns a list of parsed messages</returns>
  return self._result


class ParserEngine(object):
def Parse(filename, plugin):
  """ <summary>
   Parses a demo file
   </summary>
   <param name="filename">The file to be parsed</param>
   <param name="plugin">The ParserPlugin to use</param>
   <returns>true if parsing was successful</returns>
  """
  # here we read the contents of the demo file line-by-line
  line = ""
  lineNumber = 0
  # only run if the file actually exists
  if File.Exists(filename):
   plugin.StartParsing(filename)
   # start reading file line by line
   file = None
   try:
    file = StreamReader(filename)
    # parse as long as we don't have all information and there are still 
lines to read
    while not plugin.HasAllInformation() and (line = file.ReadLine()) != 
None:
     plugin.NewLine(line, lineNumber)
     lineNumber += 1
    plugin.StopParsing(lineNumber)
   except Exception, e:
    # report exception
    MessageBox.Show("The demo file " + filename + " could not be parsed for 
meta information.\n" + "Please report the following error under \"Updates & 
Help\"\n" + e.Message, "Error Parsing Demo Directory", MessageBoxButtons.OK, 
MessageBoxIcon.Error)
   finally:
    # close file, no matter what
    if file != None:
     file.Close()
   # abort parsing, if exception occured
   if file == None:
    return False
  else:
   # report error, if file does not exist
   MessageBox.Show("The demo file " + filename + " does not exist.\n" + 
"Please report the this error under \"Updates & Help\"\n", "File Not Found", 
MessageBoxButtons.OK, MessageBoxIcon.Error)
   return False
  return True

Parse = staticmethod(Parse)

def Parse(fileContents, plugin):
  """ <summary>
   Parses a demo file in memory
   </summary>
   <param name="fileContents">The contents of a demo file to be 
parsed</param>
   <param name="plugin">The ParserPlugin to use</param>
   <returns>true if parsing was successful</returns>
  """ #, ToolStripProgressBar progressBar)
  if fileContents != None:
   # here we read the contents of the demo file line-by-line
   lineNumber = 0
   #progressBar.Maximum = fileContents.Count();
   #progressBar.Step = 1;
   enumerator = fileContents.GetEnumerator()
   plugin.StartParsing("no file")
   # parse as long as we don't have all information and there are still 
lines to read
   while not plugin.HasAllInformation() and enumerator.MoveNext():
    plugin.NewLine(enumerator.Current, lineNumber)
    lineNumber += 1
   #progressBar.PerformStep();
   plugin.StopParsing(lineNumber)
  else:
   # report error, if file does not exist
   MessageBox.Show("The demo file buffer was null.\n" + "Please report the 
this error under \"Updates & Help\"\n", "Demo File Buffer Null", 
MessageBoxButtons.OK, MessageBoxIcon.Error)
   return False
  return True

Parse = staticmethod(Parse)

Bye,
  Skybuck.




More information about the Python-list mailing list