EDA365电子论坛网

标题: Unix编程的代码生成 [打印本页]

作者: pulbieup    时间: 2020-1-15 09:46
标题: Unix编程的代码生成

7 j' Q* j! a& C; fUnix下有很强大的专用代码生成器,如用yacc/lex来构建语法分析器和词法分析器、用autoconf或automake生成makefile等。这些工具具有很强大的功能,但还有一些简单轻巧的代码生成方式,下面是《Unix编程艺术》中的两个例子。
; B3 y0 m8 r; M# Z) V4 I5 J+ X+ I3 x3 W" Z5 {) ~+ `5 k2 K' f! S, |- I

2 p* Z/ ~( w2 {3 M) l! W: s生成ASCII显示的代码
4 j- m) D4 i% s& U+ R- b ' l5 w7 K  j1 r
6 [3 d( k5 x# F+ d: g
如果在程序中直接通过初始化器来写出所有行,会出现对齐、每行很难保证79字符的问题。Ascii源码的解决方法是通过脚本生成这部分代码。
/ J  T7 U9 A5 K# o
# D3 \4 `: s! ~  c3 U: \; vvoid( q$ i8 V! v. ^1 Q3 g5 u" ~* T4 s

- q" x% T* t( a( c% \: oshowHelp(FILE *out, char *progname)
& {/ r5 b+ \& j1 |) b# ]0 }& M* ~4 E6 ~$ a3 x( Y
{, H" u: R4 h$ d+ p
, V  f! J  _6 N+ \' _
fprintf(out,"Usage: %s [-dxohv] [-t] [char-alias...]\n", progname);6 A+ r5 V: S" m/ e/ P

. a, w3 ^8 T8 z& L9 d: A3 H#define P(s) fputs(s "\n", out);
+ p: |  |' d' ^, M7 I( e; w, H3 u) m% L
#include "splashscreen.h"
0 ?" c* e/ F# a/ e9 o* s( Q4 O6 I! _% W4 m1 i) _
#undef P
. h% W+ f/ ^0 K$ R5 q0 e* p
7 a) z4 y" S( ^
5 U) X$ j( i8 I4 W& j- M1 j9 H) ]7 P
exit(0);
# z8 y% C! P, ~5 j
# Q2 M0 m; z5 S' C}
) t3 J, C- U4 q2 ]
. R1 O4 K6 |# u. M) D   Z4 ~. T! T& b, |* i# M0 j
; V3 _- x# K- f4 k
splashscreen.h由Makefile生成:, ~; e4 f" J+ F/ I

% j, G2 w% B5 _; \7 Y) D5 `splashscreen.h: splashscreen
3 x  J% B5 O. V+ O- t2 I" w. k' O( S$ S, y2 K; v4 p
sed <splashscreen >splashscreen.h -e 's/\\/\\\\/g' -e 's/"/\\"/g' -e 's/.*/P("&");/'
2 ^% F! l* n2 U, C6 O
: @' T0 L8 a+ C/ ^/ K; l/ G从数据产生代码,使得可编辑的用法屏幕和它的显示一致。
& N% q, O: E: N! a
! }) X5 M. @0 H0 ?" V ' z3 B; n& q* ]0 M9 J$ A( P

6 y8 a, L7 G- ~' ^" h% s为列表生成HTML代码
; y! `& _. s6 Z4 K% t" R& k
5 I# W& q8 B5 F- M3 q/ k/ T% W- c, f. z5 e" a6 v9 X3 _2 U0 M; J
我们可以在代码中直接编写生成HTML表格的代码,但这样每当新添加数据的时候都需要修改生成<tc>和<td>的代码。更好的解决方案是把数据放在类似下面的文本文件中:
6 D' N  Q9 n$ {) u
" j. ]5 m  x0 Q4 `Aalat    :David Weber        :The Armageddon
) v0 C5 o% n- W! t4 E1 H; c2 ]9 J% c* C0 Q1 N
Aelmos    :Alan Dean Foster    :The man. T# @- p+ ]) e% _% Y

" U% C3 P3 K" i+ lAgandar    :Donald Kingsbury    :Psychohistorical Crisis. g0 v+ V6 s  h" I$ O/ }

1 l7 k: t$ A6 l9 H+ V5 b; x" Y而使用脚本来生成HTML表格:
* z  z: ]& D. S* X! W' C  D( S: i5 q! t( l1 X. N# n. b- L, C! C
# cat data | awk -F: '{printf("<tr><td>%s</td><td>%s</td></tr>\n",$1,$2,$3)}'' w, m+ o7 v, I, h; \, x! B: ^

4 O5 x; \) X1 @<tr><td>Aalat    </td><td>David Weber        </td></tr>7 P- v$ j# S$ g, y% N

9 b: X8 D" @: |( c0 o% o' C1 b<tr><td>Aelmos    </td><td>Alan Dean Foster    </td></tr>
/ x1 m" ~8 k; X% ?5 a4 J$ s6 X2 I
) Q% U: ?" G" E# ]; c, Z<tr><td>Agandar    </td><td>Donald Kingsbury    </td></tr>; f: H1 _' y4 e# ]

3 H7 s% J) s2 N6 j/ m) E: U
. u. O( {  k  V# J# ]  \. n/ G: k9 O& d  P. q
代码生成的好处:% k2 N* t( u/ k+ x/ v

0 }6 O3 h( s2 u: c尽可能少干活;* o- q, n# S: m* Z

4 a8 E5 r7 u7 ]" y; S0 n5 ]让数据塑造代码;+ A$ d# t6 v6 e' u
/ {  w- E3 n/ j) F7 I
依靠工具;9 s& e  v- G; X, q

7 w1 f( B0 Y( e4 |机制同测试分离。
4 @0 Z( K1 I* e( l* ~" O, r/ V
作者: NingW    时间: 2020-1-15 17:58
非常感谢




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2