CSSE 板


LINE

我一直觉得 strtok() 很难用, lex 更难用。但不知道为什麽, 人人都说要这样子做,好像只有这麽用才是正确的。 可是我怎麽都觉得是因为教科书上这麽教,而且非本科系的人, 往往都不会用,所以在某种优越感之下,就完全不讨论怎样做才 是真的好用,而一面倒地教别人要这麽做,甚或嘲笑别人没水准 没知识。从十几年前到现在,网路上的讨论区,都是这个样子。 实际上,明明就有更方便的做法,虽然很没效率,然而不是每个 时候都是效率第一的,何况实测上速度也未必比较慢。 简单来说,就是正视源码文件的结构。 基本上,现代的程式语言,大约就是由以下的结构: (以 C 为例) 1. break : ; 2. quote : "..." '...' 3. block : { ... } ( ... ) [ ... ] 4. remark : /* ... */ 5. notice : // ... \n, # ... \n 6. keyword : if, else, int, ... 7. identifier : [a-zA-Z_][0-9a-zA-Z_]* 8. operator : +-*/= ... 於是,只要照着分析即可,其中最重要的就是 block 的处理,例如 这样的源码: #include <stdio.h> int main() { printf("Hello, world!\n"); return 0; } 得到的结果应该是这样: (notice, "#include <stdio.h>") (keyword, "int") (identifier, "main") (block, "()") (block, "{\n\n printf(\"Hello, world!\n\");\nreturn0;\n\n}") 如果还需要再分析 main() 的 code, 就会得到: (identifier, "printf") (block, "(\"Hello, world!\n\")") (break, ";") (keyword, "return") (value, "0") (break, ";") 另一种做法是这样: // block_1: {} // block_2: () // quote_1: "" block[0] = { {notice, "#include <stdio.h>"}, {keyword, "int"}, {identifier, "main"}, {block_2, ""}, {block_1, 1} // reference to block[1] }; block[1] = { {text, "printf"}, // not analysis yet {block_2, 2} // reference to block[2] {text, ";\nreturn 0;"} // not analysis yet }; block[2] = { {quote_1, "Hello, world!\n"} }; 因为要得到 block, 就需要检查其中的 sub-block 和 quote, 不想重复检查的话,则可以记录下来。当然这可以设成参数, 看是要记录多少层次的 block. 无论如何,第一层分析就可以得到 global 的资料,如果想要 列出全部的函数定义,就只要寻找 (keyword, [keyword...,] identifier, block, block) 序列即可。 如果要更仔细的话, keyword, operator 或其他东西,都还可以 再分类。 总之,顺着源码的结构来读取资料,无论如何都比起用 token 一个一个来处理方便许多,一个 block 就可以跨过中间的许多 枝枝节节,而让我们直接处理同一层级的资料。 这只需要写出一个通用模组,往後就很方便了。 也就是说,不要把源码分析当做是一个特别的东西,非得利用 lex 不可,该怎麽写程式就怎麽写程式。 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.222.173.26
1F:→ maxisam:不知道版主是在业界还是学术界 68.89.158.5 01/01







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP