看板Programming
标 题Re: [问题] 有没有人用过Yacc
发信站政大狂狷年少 (Fri Feb 2 00:17:04 2007)
转信站ptt!ctu-reader!ctu-gate!news.nctu!newsfeed.nthu!news.nthu!news.cs.nthu
※ 引述《[email protected] (Victor)》之铭言:
> 我这几天都在跟语法奋战
> 为了我的网页bot能够分析网页找出连结等等工作
> 我花了非常大的力气写出了Parser
> 写到後来看见语法都有点想吐 = =|||
> 接着...又遇到一个问题
> 连URI都要写个Parser.....
> 虽然说,URI算很简单了,可是真的要详细的照规格写也会花不少力气
> 我就在想,我做的一直是重覆的工作
> 应该有办法简化这样的工作
> 於是我发现了Yacc & Lex这个东东
> 一个很有趣的东西,透过一些语法,来产生分析语法的程式
> 有人用过吗?
大学修过 compiler 的人几乎写作业都会用过,
就算大学没修过,
硕士班也还有机会,
所以用过的人一定不少,
但这东西说真的有点古老,
不如直接拿 boost 的 spirit 上,
不管用 lex & yacc 写大 parser,
或是用 boost spirit 写大 parser,
要先好好读完一本书是必要的,
花同样的努力去学一样东西,
不如学些现代一点的东西。
其实教 compiler 的老师应该都会明讲,
lex & yacc 几乎不会被用在 commercial product 上 (尽管事实上还不少),
是属於教学性质的小玩具,
我不对这说法做过多评论,
但就经验来说 lex 生出来的 lexcial analayzer 的确比手写的快,
但 yacc 生出来的 parser 几乎都会比手写的来得慢,
而且两者相较於 boost spirit 都有 debug 困难的缺点。
> 问题来了...,这样产生出来的程式效率如何?
这个描述在上面了。
> 还有....,它正规表示法是产生C程式来达成
> 还是动态用C提供函式供呼叫?
是产生 C 程式码来进行呼叫的,
lex 生成的 C 程式主要以 yylex() 为进入点,
yacc 生成的 C 程式主要以 yyparse() 为进入点。
> 虽然说Boost有提供正规表示法可以用,我一直都还没用过= ="
在 boost spirit 的概念中只有 parser 没有 scanner,
使用 EBNF 的 syntax 去描述它 (不过需要一点转换以符合 C++ 本身 syntax)。
也许你在 boost 看到的是 regex 或 tokenizer 之类的 libs,
它们「也许」可以帮得上忙,
因为有些解析网页程式的目的并不复杂,
只要「聪明一点」的 scanner 就可以完成了,
而不需要一个真的 parser 去解析完整的 syntax,
不过我的个性是要做就要做全套,
所以我个人是推荐你使用 spirit。
> 就像当初对STL有点疑问,那样的效能好吗?
> 用正规表示法分析出来的东西会比手写的快吗?
这要看 regular expression 是在 compile-time 被转换成 C/C++ code,
还是在 runtime 才被分析,
前者效率较好,
後者效率较差,
lex/yacc 是属於前者,
spirit 则两者皆非,
因为它本身就是合法的 C++ code,
并不需要经过制式方法转换,
一些 overhead 也得以避免,
这是它胜过 lex/yacc 的原因之一。
> 以上,谢谢
--
Name: Tseng, Ling-hua E-mail Address:
[email protected]
School: National Tsing Hua University Department: Computer Science
Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design
Researching: Software pipelining for VLIW architectures
Homepage:
https://it.muds.net/~uranus
--
╔═══╗ ┼────────────────────────╮
║狂狷 ║ │
* Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮
║ 年少║ ┼╮
< IP:140.119.164.252 > ╰─╮
╚╦═╦╝ ╰
* From:61-230-220-28.dynamic.hinet.net
─╨─╨─ KGBBS ─ ◎ 遨翔"BBS"的狂狷不驯;属於年少的轻狂色彩 ◎
[修改]tinlans:61-230-220-28.dynamic.hinet.net 07/02/02 0:17:04
1F:推 godfat:boost::spirit 大好 XD 220.135.28.18 02/02 02:15
2F:推 FlyinDeath:好详细的介绍!! 我也想找资料来看了! 134.208.3.23 02/02 14:09