Parsing text file with #include and #define directives

Arnaud Delobelle arnodel at googlemail.com
Thu Apr 24 16:33:07 EDT 2008


python at bdurham.com writes:

> I'm parsing a text file for a proprietary product that has the following
> 2 directives:
>
> #include <somefile>
> #define <name> <value>
>
> Defined constants are referenced via <#name#> syntax.
>
> I'm looking for a single text stream that results from processing a file
> containing these directives. Even better would be an iterator(?) type
> object that tracked file names and line numbers as it returns individual
> lines.
>
> Is there a Python parsing library to handle this type of task or am I
> better off writing my own?
>
> The effort to write one from scratch doesn't seem too difficult (minus
> recursive file and constant loops), but I wanted to avoid re-inventing
> the wheel if this type of component already exists.
>
> Thank you,
>
> Malcolm

I think it's straightforward enough to be dealt with simply.  Here is
a solution that doesn't handle errors but should work with well-formed
input and handles recursive expansions.

expand(filename) returns an iterator over expanded lines in the file,
inserting lines of included files.

import re

def expand(filename):
    defines = {}
    def define_repl(matchobj):
        return defines[matchobj.group(1)]
    define_regexp = re.compile('#(.+?)#')
    for line in open(filename):
        if line.startswith('#include '):
           recfilename = line.strip().split(None, 1)[1]
           for recline in expand(recfilename):
               yield recline
        elif line.startswith('#define '):
           _, name, value = line.strip().split(None, 2)
           defines[name] = value
        else:
            yield define_regexp.sub(define_repl, line)

It would be easy to modify it to keep track of line numbers and file
names.

HTH

-- 
Arnaud



More information about the Python-list mailing list