1#! /usr/local/bin/perl -w 2 3use Parse::RecDescent; 4use Data::Dumper; 5 6my $grammar = q{ 7 8 s_expr: '(' s_expr(s) ')' # NESTED S-EXPRS 9 { $return = $item[2] } 10 | /" [^\\"]* (\\. [^\\"]*)* "/x # STRINGS 11 | /[^()\s]+/ # ANYTHING ELSE 12 13 14}; 15 16my $parser = Parse::RecDescent->new($grammar) or die; 17 18undef $/; 19my $data = <DATA>; 20 21my $nested_array = $parser->s_expr($data); 22 23 24print Data::Dumper->Dump($nested_array); 25 26__DATA__ 27 28 (net 29 (rename VDDTX "vddtx") 30 (joined 31 (portRef VDDTX) 32 (portRef &2 33 (instanceRef I_45_1102680350))) 34 (figure WIRE 35 (path 36 (pointList 37 (pt 6700 -2100) 38 (pt 6900 -2100))) 39 (path 40 (pointList 41 (pt 6900 -2100) 42 (pt 6900 -2500))))) 43 (net 44 (rename N00023 "N00023") 45 (joined 46 (portRef &2 47 (instanceRef I_45_1215476478)) 48 (portRef &1 49 (instanceRef I_45_1102680350)) 50 (portRef &2 51 (instanceRef I_45_1215470655))) 52 (figure WIRE 53 (path 54 (pointList 55 (pt 5800 -3400) 56 (pt 6900 -3400))) 57 (path 58 (pointList 59 (pt 5800 -3400) 60 (pt 5800 -3700))) 61 (path 62 (pointList 63 (pt 6900 -3100) 64 (pt 6900 -3400))) 65 (path 66 (pointList 67 (pt 8000 -3400) 68 (pt 8000 -3700))) 69 (path 70 (pointList 71 (pt 6900 -3400) 72 (pt 8000 -3400)))) 73 (instance 74 (rename TIE1 "TIE1") 75 (viewRef XTIE0A2Y2 76 (cellRef XTIE0A2Y2 77 (libraryRef RIPPER_LIBRARY))) 78 (transform 79 (origin 80 (pt 6900 -3400))))) 81 82