Está en la página 1de 4

EL GCC CONSTRUYE UN RBOL SINTACTICO?

Si. El rbol sintctico es una representacin del programa una vez parseado por el compilador o intrprete. Aqu vemos una serie de pasos para representar visualmente este rbol. En este caso, utilizamos el compilador Gcc Necesitaremos:

o Gcc o Gawk o Graphviz


En primer lugar creamos un archivo test.c que contiene un Hello World clsico. test.c

#include<stdio.h> int main(int arg_count,char ** arg_values) { printf("Hello World\n"); return 0; }


Ejecutamos este comando para pasarle los parmetros adecuados a Gcc. ast-raw.sh

gcc -fdump-tree-original-raw ./test.c

Y nos genera este archivo con el volcado del rbol.

test.c.003t.original

;; Function main (null) ;; enabled by -tree-original @1 bind_expr type: @2 void_type name: @3 statement_list 0 : @4 type_decl name: <built-in>:0 @5 call_expr type: @6 return_expr type: @7 identifier_node strg: @8 integer_type name: prec: max : @9 addr_expr type: @10 nop_expr type: @11 modify_expr type: @12 type_decl name: <built-in>:0

@2 @4 @5 @7 @8 @2 void @12 32 @15 @16 @18 @8 @22

body: algn: 1 : type: fn : expr: lngt: size: sign: op 0: op 0: op 0: type:

@3 8 @6 @2 @9 @11 4 @13 signed @17 @19 @20 @8

srcp: 0 : @10

algn: 32 min : @14

op 1: @21 srcp:

@13 @14 2147483648 @15 @16 @17 stdio.h:339 extern @18 @19 @20 test.c:4

integer_cst integer_cst integer_cst pointer_type function_decl

type: @23 type: @8 type: @8 size: @24 name: @26

low : 32 high: -1

low : -

low : 2147483647 algn: 64 ptd : @25 type: @25 srcp: link: @27 @28 @30 @31 size: @24

body: undefined pointer_type addr_expr result_decl qual: r algn: 64 type: @29 type: @8 note: algn: type: strg: name: prec: max : type: size: prms: strg: size: qual: size: sign: size: type: unql: ptd : op 0: scpe:

srcp: @13

@21 @22 @23

integer_cst identifier_node integer_type

@24 @25 @26 @27 @28

integer_cst function_type identifier_node pointer_type integer_type

pointer_type string_cst gt: 13 @31 function_decl test.c:3 @32 identifier_node @33 integer_cst @34 integer_cst @35 integer_cst @36 tree_list @37 type_decl <built-in>:0 @38 integer_type

@29 @30

artificial size: 32 @8 low : 0 int lngt: 3 @32 size: @24 algn: 64 sign: unsigned min : @34 @23 low : 64 @35 algn: 8 retn: @36 printf lngt: 6 @24 algn: 64 ptd : c name: @37 unql: @35 algn: 8 prec: signed min : @39 max : @24 algn: 64 ptd : @41 strg: Hello World type: @43 extern srcp:

64 @33

@8

@28 @38 8 @40 @41

name: @42 args: strg: type: type: type: valu: name: name: prec: max : type: type: size: domn: strg: size:

@44 link: bit_size_type @23 low : @23 low : @23 low : @18 @45 type: @37 8 @40 @38 @38 @46 @47 main @35

lngt: 13 0 -1 8 @38 srcp: algn: 8 min : @39 low : -128 elts: @38

size: @35 sign: signed high: -1 low : 127 algn: 8 lngt: 4 algn: 8

@39 @40 @41 @42 @43

integer_cst integer_cst array_type identifier_node function_type

retn: @8

@44

parm_decl

@45 @46 @47 @48 @49 @50 @51 @52 @53

identifier_node integer_cst integer_type tree_list identifier_node integer_cst integer_cst tree_list integer_type

@54 pointer_type @55 tree_list @56 type_decl <built-in>:0 @57 integer_cst @58 integer_cst @59 pointer_type @60 identifier_node @61 integer_type

prms: name: srcp: size: strg: type: size: sign: valu: strg: type: type: valu: name: prec: max : size: valu: name: type: type: size: strg: name: prec: max : type:

@48 @49 type: test.c:3 @13 algn: char lngt: @23 low : @24 algn: signed min : @8 chan: arg_count @53 low : @53 low : @54 chan: @56 size: 64 sign: @58 @24 algn: @2 @60 type:

@8 32 4 104 64 @50 @52

scpe: @31 argt: @8 used: 0

prec: 64 max : @51

lngt: 9 0 12 @55 @24 algn: 64 unsigned min : @57 64 @61 ptd : @59 srcp:

@62

integer_cst

@61 low : 0 @53 high: -1 @24 algn: 64 long unsigned int @56 size: @24 64 sign: unsigned @62 @61 low : -1

low : ptd : lngt: algn: min :

-1 @38 17 64 @57

A continuacin necesitaremos los siguientes archivos: pre.awk

#! /usr/bin/gawk -f /^[^;]/{ gsub(/^@/, "~@", $0); gsub(/( *):( *)/, ":", $0); print; }
treeviz.awk

#! /usr/bin/gawk -f #http://alohakun.blog7.fc2.com/?mode=m&no=355 BEGIN {RS = "~@"; printf "digraph G {\n node [shape = record];";} /^[0-9]/{ s = sprintf("%s [label = \"{%s | {", $1, $1); for(i = 2; i < NF - 1; i++) s = s sprintf("%s | ", $i); s = s sprintf("%s}}\"];\n", $i); $0 = s; while (/([a-zA-Z]+):@([0-9]+)/){ format = sprintf("\\1 \\3\n %s:\\1 -> \\2;", $1);

$0 = gensub(/([a-zA-Z]+):@([0-9]+)(.*)$/, format, "g"); }; printf " %s\n", $0; } END {print "}"}

Ya prcticamente lo tenemos. Ejecutamos: ast2dot.sh

./pre.awk test.c.* | ./treeviz.awk > tree.dot

Y finalmente utilizamos dot (includo en Graphviz) para crear la imagen: dot2png.sh

dot -Tpng tree.dot -o tree.png

Y este es el resultado:

También podría gustarte