|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
2 W0 s; i% d4 }& [/ ?: V' G( J
Unix下有很强大的专用代码生成器,如用yacc/lex来构建语法分析器和词法分析器、用autoconf或automake生成makefile等。这些工具具有很强大的功能,但还有一些简单轻巧的代码生成方式,下面是《Unix编程艺术》中的两个例子。1 ~: |% @& P+ a0 M/ {& f* R
( i1 N+ N1 @8 _0 z, s- v5 g3 O3 T7 x- S. e# j( X
生成ASCII显示的代码5 s% N1 D' J' {
; W; E* ^3 `; { }4 ?7 T; T, m) T+ k5 D& t4 m2 S
如果在程序中直接通过初始化器来写出所有行,会出现对齐、每行很难保证79字符的问题。Ascii源码的解决方法是通过脚本生成这部分代码。" x( ]1 v% ^5 g; X
8 ^$ B/ }( U) Y# j) l7 y
void& n* E! X$ A0 m
- d! n. I1 s$ I' X& u
showHelp(FILE *out, char *progname)
0 Y+ y6 F+ h" u I
# F6 f, H$ L$ O; i) Z3 F$ g2 N& T e; W3 E I{
7 z8 W$ N# s7 n8 x" b2 Z% R
4 A( w/ b9 Y1 lfprintf(out,"Usage: %s [-dxohv] [-t] [char-alias...]\n", progname);( C. g+ h ^% Z6 p
$ P' ~2 j3 P) y6 o, i
#define P(s) fputs(s "\n", out);
8 l* z1 n3 v6 [ H7 V' y9 p8 k1 X
#include "splashscreen.h"
3 R3 r! B) m2 Q0 `- O1 o( Z4 A
. d! f) N) v, Z) k+ t7 a, J7 z# V#undef P) ?) s; x# g7 L. c# n" @7 z. Y
9 x3 G+ Z1 Q, T4 `. d
9 B" l% n& Q; l/ H
0 m6 y* g) U2 o1 W" o
exit(0);
- E* |- N" ~8 H4 ~4 B# _
! j% Z0 l4 i! {' | `- H}
& `, J1 t; I% J, i+ `
' D0 E4 h( N# N
, V! O- s( |6 W. F$ r! l- E$ h& d8 E5 W& k. S
splashscreen.h由Makefile生成:2 M. v' K' J$ h$ _3 L' c) x$ {
0 M5 c _1 ]! u* ?' N; P9 d6 Nsplashscreen.h: splashscreen
6 H6 u9 v, K8 F8 i W9 c/ F5 l8 u: ]
sed <splashscreen >splashscreen.h -e 's/\\/\\\\/g' -e 's/"/\\"/g' -e 's/.*/P("&");/'( ?1 K6 I3 V1 }. a2 x2 M9 n
6 j; w( J: q& e( \9 f. N' ~从数据产生代码,使得可编辑的用法屏幕和它的显示一致。
: ^% n# A6 s& f% R- Y% U" I0 i- @" f- w( d% T8 r7 M% L
0 P- I0 S( ^+ A4 ?3 ]+ `
) z* L; R) p S u# J9 M0 a) @8 ]) D为列表生成HTML代码0 T, E9 w# Z5 }$ a1 Z C
' a! O( n. G# T, h \7 K
8 l/ B; _" B+ s我们可以在代码中直接编写生成HTML表格的代码,但这样每当新添加数据的时候都需要修改生成<tc>和<td>的代码。更好的解决方案是把数据放在类似下面的文本文件中:; c) g7 e2 J% n: m
8 d, B' f9 t% i3 Q/ U4 w, NAalat :David Weber :The ARMageddon
, \* M; m' J8 o! H) G7 f/ Z" O9 q
9 c: p1 l$ w3 z" ^0 DAelmos :Alan Dean Foster :The man
8 P) ]9 I( u( a
( `+ M3 b0 j. a7 {4 @7 U2 `' ^% sAgandar :Donald Kingsbury :Psychohistorical Crisis& N- E% F" j6 k
$ i7 x2 E; y; C* i) D c而使用脚本来生成HTML表格:4 f, \+ Z/ n5 ^% _9 x# B: U. E( h
7 f7 J N: s7 q; a1 J# cat data | awk -F: '{printf("<tr><td>%s</td><td>%s</td></tr>\n",$1,$2,$3)}'' x: a/ j2 b; z, p: ~2 ^
& Z- s; ^5 |; U' a" T/ y
<tr><td>Aalat </td><td>David Weber </td></tr>: b, c* }, p3 F( a) D9 N/ Z, r H7 X& W
# |6 z/ \/ W3 M S( U+ d<tr><td>Aelmos </td><td>Alan Dean Foster </td></tr>
$ p4 b5 q( B0 `% `; T/ s+ I
& h9 ?* A4 ~1 u& S<tr><td>Agandar </td><td>Donald Kingsbury </td></tr>8 A& a z. S- [
$ r$ r* O% V- f% ?+ l G, L8 L
, c0 n$ D& p, e: l6 [
% A6 v5 T% _' @) O- O! h G$ H
代码生成的好处:3 |* e& g5 K0 h. |2 E' H4 }
7 w, ]0 f; o! S6 [* F, z! A
尽可能少干活;6 U) n, u' \" k+ O0 O9 h1 [
J$ N) a7 h/ H! _0 x6 }让数据塑造代码;* i; Q9 t1 W$ x0 u0 a! u, p- N1 o
& X5 z/ C. X" o& z, N) E& t+ {, Z
依靠工具;+ E+ U; W7 C& y0 N& P; Q2 q
! B7 `9 @- ~; }" g3 X; T
机制同测试分离。$ {" [" E9 C" m9 J+ p$ i) \ D' c; o
|
|