找回密码
 注册
关于网站域名变更的通知
查看: 344|回复: 1
打印 上一主题 下一主题

Unix编程的代码生成

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-1-15 09:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-26 01:14 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表