2 from pyparsing import Word, CharsNotIn, Optional, OneOrMore, ZeroOrMore, Group, ParseException, Literal, replaceWith, StringEnd, lineno, QuotedString
5 def __init__(self, s, loc, toks):
8 return "[%s]" % self.str
9 def argfun(s, loc, toks):
10 return Argument(s, loc, toks)
13 def __init__(self, s, loc, toks):
16 return "{%s}" % self.str
17 def paramfun(s, loc, toks):
18 return Parameter(s, loc, toks)
21 def __init__(self, s, loc, toks):
22 self.cmd = str(toks[0])[1:]
23 #print 'cmd', self.cmd
24 self.args = toks[1].asList()
25 self.params = toks[2].asList()
27 return self.cmd + "".join([repr(a) for a in self.args]) + "".join([repr(p) for p in self.params])
29 class ZeroOrMoreAsList(ZeroOrMore):
30 def __init__(self, *args):
31 ZeroOrMore.__init__(self, *args)
32 def listify(s, loc, toks):
34 self.setParseAction(listify)
36 arg = '[' + CharsNotIn("]") + ']'
37 arg.setParseAction(argfun)
38 # param = '{' + Optional(CharsNotIn("}")) + '}'
39 param = QuotedString('{', endQuoteChar = '}', multiline = True)
40 param.setParseAction(paramfun)
41 texcmd = Word("\\", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + ZeroOrMoreAsList(arg) + ZeroOrMoreAsList(param)
42 def texcmdfun(s, loc, toks):
43 if str(toks[0])[1:] == 'input':
44 filename = "../" + toks[2].asList()[0].str + ".tex"
45 print 'Now parsing', filename, loc
46 return parsefile(filename, lineno(loc, s))
48 return TexCmd(s, loc, toks)
49 texcmd.setParseAction(texcmdfun)
52 legal = "".join([chr(x) for x in set(range(32, 127)) - set(backslash)])
53 filler = CharsNotIn(backslash)
55 document = ZeroOrMore(texcmd | filler) + StringEnd().suppress()
58 print document.parseString('\\hello{foo}')
61 def parsefile(filename, startline):
62 f = open(filename, "rt")
67 return s[:s.index('%')] + '\n'
71 lines = [uncomment(l) for l in lines]
72 print len(lines), "lines"
74 docstr = "".join(lines)
75 # document.setFailAction(None)
77 return document.parseString(docstr)
78 except ParseException, pe:
79 print 'Fatal problem at %s line %d col %d' % (filename, pe.lineno, pe.col)
83 doc = parsefile(sys.argv[1], 0)
85 raw = open('raw', 'w')
91 if isinstance(x, TexCmd):
92 if x.cmd == 'chapter':
94 if x.cmd == 'section':
95 print ' ' * 4, repr(x)