顯示具有 Lex 標籤的文章。 顯示所有文章
顯示具有 Lex 標籤的文章。 顯示所有文章
2009-04-25 16:58

[LEX] 使用命令列參數開啟檔案


/*[flex] 的指令參數
* ( flex -FLi8 %f )
* -l 最大兼容性法則
* -i 不區分大小寫
* -f 產生不壓縮的完整表格,效率快,所需空間大
* -F 最佳效率與空間優化
* -L 在產生的程式碼中不加入 #line
* -7 使用 7 bit 掃瞄文字(預設)
* -8 使用 8 bit 掃瞄文字
*
* -+ 產生 C++ 掃瞄 Class
*
* -oOutputName 指定輸出檔案名稱
*
* -h 參數說明
* -V 版本顯示
* -T 顯示追蹤記錄
* */


/* [定義段落] */
%{
#include <stdio.h>

%}

/* 告知沒有自訂的 unput() */
%option nounput

/* 初始狀態 */
%s START
/* 多行註解狀態 */
%s COMMENTS

/* 換行符號 */
EN [\r\n]
/* 換行符號及空白字元 */
SP [ \t\r\n] //
/* 單引號字串 */
//STR1 (\'([^\'\r\n]|"\\\'")*\')
/* 雙引號字串 */
//STR2 (\"([^\"\r\n]|"\\\"")*\")


%% /* [規則段落] */

/* 多行註解模式 */
<COMMENTS>"*/"{SP}* { BEGIN START; }
<COMMENTS>.|{SP} ;

/* 初始模式 */
<START>"/*" { BEGIN COMMENTS; }
<START>"//".*{EN}+ ;
<START>. {fprintf(yyout,"%s",yytext);}


%% /* [自訂函數段落] */

/* 程式執行方式與檔案參數
* 程式.exe 文件1.txt 文件2.txt 文件3.txt
* 或使用文件拖放至程式上
* */
char **fileList;
unsigned currentFile = 0;
unsigned nFiles;

int main(int argc,char **argv){
// 沒有檔案
if(argc<2){
printf("沒有給予檔案參數");return 0;

}else{
// 取得檔案參數
fileList = argv+1;
nFiles = argc-1;

// 嘗試開啟第一個檔案
yywrap();
}

// 執行文字解析器
yylex();
/* 文字解析器會在檔案結束時
* 自動呼叫 yywrap() 開啟下一個檔案
* */

return 0;
}

/* 當沒自訂的 yywrap() 時
* 記得在前加上 "%option noyywrap"
* */
int yywrap(){
// 關閉上次開啟的檔案
if ((currentFile > 0) && (nFiles >= 1) && (currentFile <= nFiles)) {
// 關閉輸入與輸出的文件
fclose(yyin); fclose(yyout);

// 將暫存檔覆蓋原始輸入文件
remove(fileList[currentFile-1]);
rename("temp",fileList[currentFile-1]);
}

FILE *fileIn = NULL;
while ((currentFile < nFiles)) {
// 檢查副檔名
if(strstr(fileList[currentFile],".txt")!= NULL){
// 設定初始狀態
BEGIN START;
}else{
// 跳過不符合的檔案
continue;
}


// 嘗試開啟檔案
fileIn = fopen(fileList[currentFile++], "r");
if (fileIn != NULL) {
// 指定輸入與輸出的文件指標
yyin = fileIn;
yyout = fopen("temp","w");

// 成功開啟檔案跳出迴圈
break;
}
printf("無法開啟檔案: %s\n",fileList[currentFile-1]);
}
// 回傳狀態 ( 0:成功開啟 , 1:開啟失敗 )
return (fileIn ? 0 : 1);
}


相關連結:Yacc 与 Lex 快速入门
2008-06-01 19:34

HTML & Smarty、JavaScript、CSS 及 PHP 註解清除器

之前為了上線前去除不要的註解及多餘的空白符號,一直在找合適的工具,可是找到大部分都是 windows 的軟體,想找 Linux 的卻沒找到,於是就自己用 Lex 寫了一些,幾本上我分成四個語言的清除器,設計上是直接覆寫原始的檔案,所以在應用前請先自行複製備份,由於清除器沒有做語法驗證,再撰寫時需要特別嚴謹 ( PS: 程式碼中常被忽略的結束符號 ";" )。

清除規則:
  • HTML & Smarty
    • 清除 < 及 > 前後的空白及換行(\n)符號
    • 清除 HTML 註解 (<!-- 註解 -->)
    • 清除 Smarty 註解 ({* 註解 *})
    • 清除 JavaScript 單行及多行註解 (/* 註解 */ , //註解)
    • 清除 JavaScript 多餘的空白及換行(\n)符號
    • 完整保留單引號及雙引號內的字串
  • JavaScript
    • 清除多餘的空白及換行(\n)符號
    • 清除單行及多行註解 (/* 註解 */ , //註解)
    • 完整保留單引號及雙引號內的字串
  • CSS
    • 清除多餘的空白及換行(\n)符號
    • 清除多行註解 (/* 註解 */)
    • 完整保留單引號及雙引號內的字串
  • PHP
    • 清除行首及行尾的空白符號
    • 清除無用的空白行
    • 清除單行及多行註解 (/* 註解 */ , //註解)
    • 完整保留單引號及雙引號內的字串

這已經經過很多次的測試跟修改了,目前還沒有出現特別的狀況,有需要的人可以用用看,在 linux 上必許要安裝 flex 及 gcc 才可以編譯,當然 windows 也有的flex 及 gcc 的編譯器。

檔案連結
2008-05-04 23:16

好用的 lex 詞彙解析語言

lex 這個語言是我在二技時學會的,這原本是用來開發編譯器的語言,但他對於詞彙解析有很強的能力,而且不需要寫太多的程式碼就可以做到很大的能力,用來處理一些有規則文檔的是輕而一舉的事。

其實 lex 的語法就是『正規表示式』所組成的,所以撰寫上花的腦筋跟測試會比寫程式碼來的多,雖然很好用,但在想解析的規則時卻不是那麼快樂。

lex 是 base 在 C 上面的語言,除了解析的規則外,其他都是屬於 C 語言的撰寫,所以基本上還必須會寫 C,而且 C 的文字處理函數卻不怎麼好用。


lex&yacc
以入門書來說這本寫的真是不錯,除了語法上都講解得很清楚,還有有很多教學範例。
相關連結:Yacc 与 Lex 快速入门