Pyparsing help

rh0dium steven.klass at gmail.com
Sun Mar 23 00:51:07 EDT 2008


On Mar 22, 6:30 pm, Paul McGuire <pt... at austin.rr.com> wrote:
> Oof, I see that you have multiple "Layer" entries, with different
> qualifying labels.  Since the dicts use "Layer" as the key, you only
> get the last "Layer" value, with qualifier "PRBOUNDARY", and lose the
> "Layer" for "METAL2".  To fix this, you'll have to move the optional
> alias term to the key, and merge "Layer" and "PRBOUNDARY" into a
> single key, perhaps "Layer/PRBOUNDARY" or "Layer(PRBOUNDARY)" - a
> parse action should take care of this for you.  Unfortnately, these
> forms will not allow you to use object attribute form
> (md.Layer.lineStyle), you will have to use dict access form
> (md["Layer(PRBOUNDARY)"].lineStyle), since these keys have characters
> that are not valid attribute name characters.
>
> Or you could add one more level of Dict nesting to your grammar, to
> permit access like "md.Layer.PRBOUNDARY.lineStyle".
>
> -- Paul

OK - We'll I got as far as you did but I did it a bit differently..
Then I merged some of your data with my data.  But Now I am at the
point of adding another level of the dict and am struggling..  Here is
what I have..

    # parse actions
    LPAR = Literal("(")
    RPAR = Literal(")")
    LBRACE = Literal("{")
    RBRACE = Literal("}")
    EQUAL = Literal("=")

    # This will get the values all figured out..
        # "metal2" 1 6.05E-05 30
    cvtInt = lambda toks: int(toks[0])
    cvtReal = lambda toks: float(toks[0])

    integer = Combine(Optional(oneOf("+ -")) + Word(nums))\
        .setParseAction( cvtInt )
    real = Combine(Optional(oneOf("+ -")) + Word(nums) + "." +
                   Optional(Word(nums)) +
                   Optional(oneOf("e E")+Optional(oneOf("+ -"))
+Word(nums)))\
        .setParseAction( cvtReal )
    atfstr = quotedString.setParseAction(removeQuotes)
    atflist = Group( LPAR.suppress() +
                    delimitedList(real, ",") +
                    RPAR.suppress() )

    atfvalues = ( real | integer | atfstr | atflist )

    # Now this should work out a single line inside a section
        # maskName                        = "metal2"
        # isDefaultLayer                  = 1
        # visible                         = 1
        # fatTblSpacing                   = (0.21,0.24,0.6,
        #                                    0.6,0.6,0.6)
        # minArea                         = 0.144
    atfkeys = Word(alphanums)
    attrDict = dictOf( atfkeys , EQUAL.suppress() + atfvalues)

    # Now we need to take care of the "Metal2" { one or more
attrDict }
        # "METAL2" {
        #                 layerNumber                     = 36
        #                 maskName                        = "metal2"
        #                 isDefaultLayer                  = 1
        #                 visible                         = 1
        #                 fatTblSpacing                   =
(0.21,0.24,0.6,
        #
0.24,0.24,0.6,
        #
0.6,0.6,0.6)
        #                 minArea                         = 0.144
        # }
    attrType = dictOf(atfstr, LBRACE.suppress() + attrDict +
RBRACE.suppress())

    # Lastly we need to get the ones without attributes (Technology)
    attrType2 = LBRACE.suppress() + attrDict + RBRACE.suppress()
    mainDict = dictOf(atfkeys, attrType2 | attrType )

    md = mainDict.parseString(test1)


But I too am only getting the last layer.  I thought if broke out the
"alias" area and then built on that I'd be set but I did something
wrong.




More information about the Python-list mailing list