tag:blogger.com,1999:blog-59465307047421309702024-03-06T16:20:07.273+08:00Jax 的工作紀錄除了在整理學習上的經驗,同時也能幫助其他需要的人Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.comBlogger3125tag:blogger.com,1999:blog-5946530704742130970.post-81527929291500380862009-04-25T16:58:00.008+08:002009-04-25T17:20:19.901+08:00[LEX] 使用命令列參數開啟檔案<pre class="c" name="code"><br />/*[flex] 的指令參數<br /> * ( flex -FLi8 %f )<br /> * -l 最大兼容性法則<br /> * -i 不區分大小寫<br /> * -f 產生不壓縮的完整表格,效率快,所需空間大<br /> * -F 最佳效率與空間優化<br /> * -L 在產生的程式碼中不加入 #line<br /> * -7 使用 7 bit 掃瞄文字(預設)<br /> * -8 使用 8 bit 掃瞄文字<br /> *<br /> * -+ 產生 C++ 掃瞄 Class<br /> *<br /> * -oOutputName 指定輸出檔案名稱<br /> *<br /> * -h 參數說明<br /> * -V 版本顯示<br /> * -T 顯示追蹤記錄<br /> * */<br /><br /><br /> /* [定義段落] */<br />%{<br />#include <stdio.h><br /><br />%}<br /><br /> /* 告知沒有自訂的 unput() */<br />%option nounput<br /><br /> /* 初始狀態 */<br />%s START<br /> /* 多行註解狀態 */<br />%s COMMENTS<br /><br /> /* 換行符號 */<br />EN [\r\n]<br /> /* 換行符號及空白字元 */<br />SP [ \t\r\n] //<br /> /* 單引號字串 */<br />//STR1 (\'([^\'\r\n]|"\\\'")*\')<br /> /* 雙引號字串 */<br />//STR2 (\"([^\"\r\n]|"\\\"")*\")<br /><br /><br />%% /* [規則段落] */<br /> <br /> /* 多行註解模式 */<br /><COMMENTS>"*/"{SP}* { BEGIN START; }<br /><COMMENTS>.|{SP} ;<br /><br /> /* 初始模式 */<br /><START>"/*" { BEGIN COMMENTS; }<br /><START>"//".*{EN}+ ;<br /><START>. {fprintf(yyout,"%s",yytext);}<br /><br /><br />%% /* [自訂函數段落] */<br /><br />/* 程式執行方式與檔案參數<br /> * 程式.exe 文件1.txt 文件2.txt 文件3.txt<br /> * 或使用文件拖放至程式上<br /> * */<br />char **fileList;<br />unsigned currentFile = 0;<br />unsigned nFiles;<br /><br />int main(int argc,char **argv){<br /> // 沒有檔案<br /> if(argc<2){<br /> printf("沒有給予檔案參數");return 0;<br /><br /> }else{<br /> // 取得檔案參數<br /> fileList = argv+1;<br /> nFiles = argc-1;<br /><br /> // 嘗試開啟第一個檔案<br /> yywrap();<br /> }<br /><br /> // 執行文字解析器<br /> yylex();<br /> /* 文字解析器會在檔案結束時<br /> * 自動呼叫 yywrap() 開啟下一個檔案<br /> * */<br /> <br /> return 0;<br />}<br /><br />/* 當沒自訂的 yywrap() 時<br /> * 記得在前加上 "%option noyywrap"<br /> * */<br />int yywrap(){<br /> // 關閉上次開啟的檔案<br /> if ((currentFile > 0) && (nFiles >= 1) && (currentFile <= nFiles)) {<br /> // 關閉輸入與輸出的文件<br /> fclose(yyin); fclose(yyout);<br /><br /> // 將暫存檔覆蓋原始輸入文件<br /> remove(fileList[currentFile-1]);<br /> rename("temp",fileList[currentFile-1]);<br /> }<br /><br /> FILE *fileIn = NULL;<br /> while ((currentFile < nFiles)) {<br /> // 檢查副檔名<br /> if(strstr(fileList[currentFile],".txt")!= NULL){<br /> // 設定初始狀態<br /> BEGIN START;<br /> }else{<br /> // 跳過不符合的檔案<br /> continue;<br /> }<br /><br /><br /> // 嘗試開啟檔案<br /> fileIn = fopen(fileList[currentFile++], "r");<br /> if (fileIn != NULL) {<br /> // 指定輸入與輸出的文件指標<br /> yyin = fileIn;<br /> yyout = fopen("temp","w");<br /><br /> // 成功開啟檔案跳出迴圈<br /> break;<br /> }<br /> printf("無法開啟檔案: %s\n",fileList[currentFile-1]);<br /> }<br /> // 回傳狀態 ( 0:成功開啟 , 1:開啟失敗 )<br /> return (fileIn ? 0 : 1);<br />}<br /><br /></pre><br />相關連結:<a href="http://www.ibm.com/developerworks/cn/linux/sdk/lex/">Yacc 与 Lex 快速入门</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com3tag:blogger.com,1999:blog-5946530704742130970.post-67966992951415630662008-06-01T19:34:00.011+08:002011-05-06T18:13:43.469+08:00HTML & Smarty、JavaScript、CSS 及 PHP 註解清除器之前為了上線前去除不要的註解及多餘的空白符號,一直在找合適的工具,可是找到大部分都是 windows 的軟體,想找 Linux 的卻沒找到,於是就自己用 Lex 寫了一些,幾本上我分成四個語言的清除器,設計上是直接覆寫原始的檔案,所以在應用前請先自行複製備份,由於清除器沒有做語法驗證,再撰寫時需要特別嚴謹 ( PS: 程式碼中常被忽略的結束符號 <span style="color: rgb(255, 0, 0);">";"</span> )。<br /><br />清除規則:<ul><li>HTML & Smarty</li><ul><li>清除 < 及 > 前後的空白及換行(\n)符號</li><li>清除 HTML 註解 (<!-- 註解 -->)</li><li>清除 Smarty 註解 ({* 註解 *})</li><li>清除 JavaScript 單行及多行註解 (/* 註解 */ , //註解)</li><li>清除 JavaScript 多餘的空白及換行(\n)符號</li><li>完整保留單引號及雙引號內的字串</li></ul><li>JavaScript</li><ul><li>清除多餘的空白及換行(\n)符號</li><li>清除單行及多行註解 (/* 註解 */ , //註解)</li><li>完整保留單引號及雙引號內的字串</li></ul><li>CSS</li><ul><li>清除多餘的空白及換行(\n)符號</li><li>清除多行註解 (/* 註解 */)</li><li>完整保留單引號及雙引號內的字串</li></ul><li>PHP</li><ul><li>清除行首及行尾的空白符號</li><li>清除無用的空白行</li><li>清除單行及多行註解 (/* 註解 */ , //註解)</li><li>完整保留單引號及雙引號內的字串</li></ul></ul><br />這已經經過很多次的測試跟修改了,目前還沒有出現特別的狀況,有需要的人可以用用看,在 linux 上必許要安裝 flex 及 gcc 才可以編譯,當然 windows 也有的flex 及 gcc 的編譯器。<br /><br /><a target="_blank" href="http://sites.google.com/site/weskerjax/code-demo/lex_clear.rar">檔案連結</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-80826494656375282222008-05-04T23:16:00.011+08:002013-06-11T20:58:09.088+08:00好用的 lex 詞彙解析語言lex 這個語言是我在二技時學會的,這原本是用來開發編譯器的語言,但他對於詞彙解析有很強的能力,而且不需要寫太多的程式碼就可以做到很大的能力,用來處理一些有規則文檔的是輕而一舉的事。<br />
<br />
其實 lex 的語法就是『正規表示式』所組成的,所以撰寫上花的腦筋跟測試會比寫程式碼來的多,雖然很好用,但在想解析的規則時卻不是那麼快樂。<br />
<br />
lex 是 base 在 C 上面的語言,除了解析的規則外,其他都是屬於 C 語言的撰寫,所以基本上還必須會寫 C,而且 C 的文字處理函數卻不怎麼好用。<br />
<br />
<br />
<a target="_blank" href="http://www.oreilly.com.tw/product_unix.php?id=a020"><img style="cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh034aPDsaoBlalC_Ivirof7Guj56Xx4OHK96ZgSj0kiT8-yBgNG1PEnlA7OK1ALExndtIgqYtd1Pwq0Wx7z3O71phgxbTmIc9Bo5Jje5SqdLTDAD5xx-LOskyfp6oyfnmXwuMfWPs4cyxS/" alt="lex&yacc" id="BLOGGER_PHOTO_ID_5196552758909537986" /></a><br />
以入門書來說這本寫的真是不錯,除了語法上都講解得很清楚,還有有很多教學範例。<br />
相關連結:<a target="_blank" href="http://www.ibm.com/developerworks/cn/linux/sdk/lex/">Yacc 与 Lex 快速入门</a>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0