def col(loc, strg)

    '''

        返回当前偏移量的列位置。

        特别注意,换行位置的列位置为1

    '''

test = """\
12
34
"""
assert col(test.find("1"),test)==1
assert col(test.find("2"),test)==2
assert col(test.find("\n"),test)==1

def countedArray(expr, intExpr=None)

    '''

        "itemlen item1 item2 ... itemn" -> [item1,item2, ... itemN] 

    '''
assert countedArray(Word(alphas)).parseString('3 a b c').asList() == [['a','b','c']]
assert countedArray(Word(alphas)).parseString('2 a b c').asList() == [['a','b']]

def delimitedList(expr, delim=",", combine=False )

    '''

        "item1,item2,...itemN" -> [item1,item2,itemN]

    '''

assert delimitedList(Word(nums)).parseString("1,2,3").asList() == ['1','2','3']
assert delimitedList(Word(nums),combine=True).parseString("1,2,3").asList() == ['1,2,3']

def dictOf(key, value )

    '''

        "k1 v1 k2 v2 ... kN vN" -> {k1:v1,k2:v2,...kN:Vn}

    '''

r = dictOf(Word(nums),Word(alphas)).parseString("1 a 2 b")
assert r['1'] == 'a'
assert r['2'] == 'b'

def downcaseTokens(s,l,t)

    '''

        setParseAction的回调函数,

        用于将字符串转为小写

    '''

assert Word(alphas).setParseAction(downcaseTokens).parseString("ABCDE").asList() == ["abcde"]

def indentedBlock(blockStatementExpr, indentStack, indent=True)

    '''

        匹配缩进快的内容

    '''

test = '''\
A
    B
        C
'''
t = Forward()
l = Word(alphas) + indentedBlock(t,[1])
t << (l|Word(alphas))
assert t.searchString(test).asList() == [['A', [['B', [['C']]]]]]

def infixNotation(baseExpr, opList, lpar=Suppress:("("), rpar=Suppress:(")"))

    '''

        方便编写具有优先级操作符号的字符串,例如四则运算

    '''

import operator
op_list =[(Suppress('*'),2,opAssoc.LEFT,lambda t:reduce(operator.mul,t[0])),
          (Suppress('+'),2,opAssoc.LEFT,lambda t:reduce(operator.add,t[0]))]
num = Word(nums).setParseAction(lambda t:int(t[0]))
assert infixNotation(num,op_list).parseString("1+2*3").asList() == [7]

def keepOriginalText(s, startLoc, t)

    '''

        setParseAction的回调函数,进行原始数据的保存

    '''

assert ZeroOrMore(Word(nums)).setParseAction(keepOriginalText).parseString("1 2 3 4") == ['1 2 3 4']

def line(loc, strg)

    '''

        返回当前偏移量所在的行内容

    '''

test = '''\
123
456
'''
assert line(4,test) == '456'

def lineno(loc, strg)

    '''

        返回当前便宜量所在的行号

    '''


def locatedExpr(expr)

    '''

        对expr进行封装,多返回起始偏移量,结束偏移量命名信息

    ''' 

print locatedExpr(Word(nums))('a').parseString("12345").dump()

[[0, '12345', 5]]

- a: [0, '12345', 5]

  - locn_end: 5

  - locn_start: 0

  - value: 12345


def makeHTMLTags(tagStr)

    '''

生成html标签

    '''


def makeXMLTags(tagStr)

    '''

生成xml标签

    '''


def matchOnlyAtCol(n)

    '''

        生成setParseAction回调函数

        判断当前列位置

    '''

(Literal('a')+Literal('b').setParseAction(matchOnlyAtCol(2))).parseString("abc")

def matchPreviousExpr(expr)

    '''

        匹配之前表达式的内容

    '''

num = Word(nums)
(num+':'+matchPreviousExpr(num)).parseString("1:1")

def matchPreviousLiteral(expr)

    '''

        匹配之前表达式的内容的前缀

    '''


def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy())

    '''

        生成可以嵌套解析的表达式

    '''

print nestedExpr(content=Word(nums)).parseString("(1(2)3)").dump()

def oneOf( strs, caseless=False, useRegex=True )

    '''

       选择匹配其中一个文本

    '''

assert oneOf("a bb").parseString("bb").asList() == ['bb']

def operatorPrecedence( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') )

    '''

        同infixNotation

    '''


def originalTextFor(expr, asString=True)

    '''

        原始内容匹配

    '''

assert originalTextFor(OneOrMore(Word(nums))).parseString("1 1 2 ").asList() == ['1 1 2']

def removeQuotes(s,l,t)

    '''

        setParseAction回调函数

        去掉引号

    '''

assert quotedString.setParseAction(removeQuotes).parseString("'111'").asList() == ['111']

def replaceWith(replStr)

    '''

        替换匹配的内容

    '''

assert Word(nums).setParseAction(replaceWith("aa")).parseString("1111").asList() == ["aa"]

def srange(s)

    '''

        生成一个范围内的字符

    '''

assert srange("[1-2]") == "12"

def traceParseAction(f)

    '''

        增加跟踪信息的装饰器

    '''

@traceParseAction
def func(t):
    print 'func'
    return t
print Word(nums).setParseAction(func).parseString("11")