Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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:
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
srcp: 0 : @10
op 1: @21 srcp:
@13 @14 2147483648 @15 @16 @17 stdio.h:339 extern @18 @19 @20 test.c:4
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
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
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
retn: @8
@44
parm_decl
@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:
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
-1 @38 17 64 @57
#! /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 "}"}
Y este es el resultado: