Re: [問題] 有沒有人用過Yacc
※ 引述《StubbornLin.bbs@ptt.cc (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: uranus@it.muds.net
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
推
02/02 02:15, , 1F
02/02 02:15, 1F
推
02/02 14:09, , 2F
02/02 14:09, 2F
討論串 (同標題文章)
Programming 近期熱門文章
PTT數位生活區 即時熱門文章