summaryrefslogtreecommitdiff
path: root/lib/python2.7/site-packages/wx-3.0-msw/wx/py/parse.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python2.7/site-packages/wx-3.0-msw/wx/py/parse.py')
-rw-r--r--lib/python2.7/site-packages/wx-3.0-msw/wx/py/parse.py128
1 files changed, 128 insertions, 0 deletions
diff --git a/lib/python2.7/site-packages/wx-3.0-msw/wx/py/parse.py b/lib/python2.7/site-packages/wx-3.0-msw/wx/py/parse.py
new file mode 100644
index 0000000..bb6c819
--- /dev/null
+++ b/lib/python2.7/site-packages/wx-3.0-msw/wx/py/parse.py
@@ -0,0 +1,128 @@
+"""parse.py is a utility that allows simple checking for line continuations
+to give the shell information about where text is commented and where it is
+not and also how to appropriately break up a sequence of commands into
+separate multi-line commands...
+"""
+
+__author__ = "David N. Mashburn <david.n.mashburn@gmail.com>"
+# created 12/20/2009
+
+import re
+
+# change this to testForContinuations
+
+def testForContinuations(codeBlock,ignoreErrors=False):
+ """ Test 4 different types of continuations:""" + \
+ """ String Continuations (ie with ''')""" + \
+ """ Indentation Block Continuations (ie "if 1:" )""" + \
+ """ Line Continuations (ie with \\ character )""" + \
+ """ Parenthetical continuations (, [, or {"""
+
+ stringMark = None
+ paraList = []
+ indentNumber=[0]
+
+ stringMarks = ['"""',"'''",'"',"'"]
+ openMarks = ['(','[','{']
+ closeMarks = [')',']','}']
+ paraMarkDict = { '(':')', '[':']', '{':'}' }
+
+ stringContinuationList=[]
+ lineContinuationList=[] # For \ continuations ... False because cannot start as line Continuation...
+ indentationBlockList=[]
+ parentheticalContinuationList=[]
+ newIndent=False
+ lspContinuation=False
+ for i,l in enumerate(codeBlock.split('\n')):
+ currentIndentation = len(l)-len(l.lstrip())
+
+ if i>0:
+ lspContinuation = lineContinuationList[-1] or \
+ stringContinuationList[-1] or \
+ parentheticalContinuationList[-1]
+ # first, check for non-executing lines (whitespace and/or comments only)
+ if l.lstrip()=='':
+ emptyLine=True
+ elif l.strip()[0]=='#':
+ emptyLine=True
+ else: # otherwise, check the indentation...
+ emptyLine=False
+ if newIndent and currentIndentation>indentNumber[-1]:
+ newIndent=False
+ indentNumber.append(currentIndentation)
+ elif lspContinuation:
+ pass
+ elif not newIndent and currentIndentation in indentNumber:
+ while currentIndentation<indentNumber[-1]:
+ indentNumber.pop() # This is the end of an indentation block
+ elif not ignoreErrors:
+ #print 'Invalid Indentation!!'
+ return ['Invalid Indentation Error',i]
+
+ firstWord = re.match(' *\w*',l).group().lstrip()
+ if firstWord in ['if','else','elif','for','while',
+ 'def','class','try','except','finally']:
+ hasContinuationWord = True
+ else:
+ hasContinuationWord = False
+
+
+ commented=False
+ nonCommentLength=len(l)
+
+ result = re.finditer('"""'+'|'+"'''" + r'''|"|'|\"|\'|\(|\)|\[|\]|\{|\}|#''',l)
+ for r in result:
+ j = r.group()
+
+ if stringMark == None:
+ if j=='#': # If it is a legitimate comment, ignore everything after
+ commented=True
+ # get length up to last non-comment character
+ nonCommentLength = r.start()
+ break
+ elif j in stringMarks:
+ stringMark=j
+ else:
+ if paraList != [] and j in closeMarks:
+ if paraMarkDict[paraList[-1]]==j:
+ paraList.pop()
+ elif not ignoreErrors:
+ #print 'Invalid Syntax!!'
+ return ['Invalid Syntax Error',i]
+ if j in openMarks:
+ paraList.append(j)
+ elif stringMark==j:
+ stringMark=None
+
+ stringContinuationList.append(stringMark!=None)
+
+ indentationBlockList.append(False)
+ nonCommentString = l[:nonCommentLength].rstrip()
+ if nonCommentString!='' and stringContinuationList[-1]==False:
+ if nonCommentString[-1]==':':
+ indentationBlockList[-1]=True
+ newIndent=True
+
+ lineContinuationList.append(False)
+ if len(l)>0 and not commented:
+ if l[-1]=='\\':
+ lineContinuationList[-1]=True
+
+ parentheticalContinuationList.append( paraList != [] )
+
+ # Now stringContinuationList (et al) is line by line key for magic
+ # telling it whether or not each next line is part of a string continuation
+
+ if (stringContinuationList[-1] or indentationBlockList[-1] or \
+ lineContinuationList[-1] or parentheticalContinuationList[-1]) \
+ and not ignoreErrors:
+ #print 'Incomplete Syntax!!'
+ return ['Incomplete Syntax Error',i]
+
+ if newIndent and not ignoreErrors:
+ #print 'Incomplete Indentation!'
+ return ['Incomplete Indentation Error',i]
+
+ # Note that if one of these errors above gets thrown, the best solution is to pass the resulting block
+ # to the interpreter as exec instead of interp
+ return stringContinuationList,indentationBlockList,lineContinuationList,parentheticalContinuationList