EDA365电子论坛网
标题:
Unix编程的代码生成
[打印本页]
作者:
pulbieup
时间:
2020-1-15 09:46
标题:
Unix编程的代码生成
7 j' Q* j! a& C; f
Unix下有很强大的专用代码生成器,如用yacc/lex来构建语法分析器和词法分析器、用autoconf或automake生成makefile等。这些工具具有很强大的功能,但还有一些简单轻巧的代码生成方式,下面是《Unix编程艺术》中的两个例子。
; B3 y0 m8 r; M# Z) V4 I5 J+ X+ I3 x
3 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: \; v
void
( q$ i8 V! v. ^1 Q3 g5 u" ~* T4 s
- q" x% T* t( a( c% \: o
showHelp(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( Q
4 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; c
2 ]9 J% c* C0 Q1 N
Aelmos :Alan Dean Foster :The man
. T# @- p+ ]) e% _% Y
" U% C3 P3 K" i+ l
Agandar :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