其實 lex 的語法就是『正規表示式』所組成的,所以撰寫上花的腦筋跟測試會比寫程式碼來的多,雖然很好用,但在想解析的規則時卻不是那麼快樂。
lex 是 base 在 C 上面的語言,除了解析的規則外,其他都是屬於 C 語言的撰寫,所以基本上還必須會寫 C,而且 C 的文字處理函數卻不怎麼好用。
以入門書來說這本寫的真是不錯,除了語法上都講解得很清楚,還有有很多教學範例。
相關連結:Yacc 与 Lex 快速入门
table.innerHTML+="<tr><td>test</td></tr>";
var tdObj=document.createElement('td');
trObj.appendChild(document.createTextNode("test"));
var trObj=document.createElement('tr');
trObj.insertBefore(tdObj);
table.insertBefore(trObj);
tr.style.display="none";
td.style.display="none";
table .hide{ display : none; }
tr.className="hide";
td.className="hide";
for (var i=0; i<data.length; i++) {
document.getElementById("link").innerHTML += data[i];
document.getElementById("link").hreh += "&" + data[i];
document.getElementById("link").title += data[i] + ",";
document.getElementById("link").className += data[i] + " ";
document.getElementById("link").name += data[i] + "_";
}
/*利用暫存變數作處理*/
var temp1='', temp2='', temp3='', temp4='', temp5='';
/*利用 l 紀錄 length 的值,以避免多次存取成員變數*/
for (var i=0,l=data.length; i<l; i++) {
/*利用 d 紀錄 data[i] 的值,以避免多次存取成員變數*/
d = data[i];
temp1 += d;
temp2 += "&" + d;
temp3 += d + ",";
temp4 += d + " ";
temp5 += d + "_";
}
/*利用暫存變數紀錄 DOM 物件*/
var link = document.getElementById("link");
link.innerHTML += temp1;
link.hreh += temp2;
link.title += temp3;
link.className += temp4;
link.name += temp5;
/*切割文字*/
function toReg(str){
var array = str.match(/<[^>]*>|[^< ,.\r\n\t]+[ ,.\r\n\t]*/ig);
result = [];
for(var i = 0, l = array.length; i < l; i++) {
if(array[i].charAt(0) == '<') {
temp = array[i].match(/[^<][^> ]*/i);
result[i] = {
txt: array[i],
tag: temp
};
}else{
result[i] = {
txt: array[i],
tag: false
};
}
}
return result;
}
/*最長共同部分序列*/
function LCS(na, oa){
var m = na.length, n = oa.length;
var i, j;
var d = [];
/*Dynamic*/
for(i = 0; i <= m; i++) {
d[i] = [];
d[i][0] = 0;
}
for(j = 1; j <= n; j++) {
d[0][j] = 0;
}
/*動態規劃演算法*/
for(i = 1; i <= m; i++) {
for(j = 1; j <= n; j++) {
if(na[i - 1].txt == oa[j - 1].txt) {
d[i][j] = d[i - 1][j - 1] + 1;
}else if(na[i - 1].tag && na[i - 1].tag==oa[j - 1].tag) {
d[i][j] = d[i - 1][j - 1] + 1;
}else if (d[i][j - 1] > d[i - 1][j]) {
d[i][j] = d[i][j - 1];
}else {
d[i][j] = d[i - 1][j];
}
}
}
/*標註共同部分序列*/
i = m;
j = n;
while (i > 0 && j > 0) {
if(d[i][j] == d[i - 1][j]) {
i--;
}else if(d[i][j] == d[i][j - 1]) {
j--;
}else{
i--;
j--;
na[i].com = j;
oa[j].com = i;
}
}
delete d;
}
/*合併比較陣列*/
function merge(na, oa){
var m = na.length, n = oa.length;
var result = [];
if(!m && !n) { return null; }
var i;
var oldPrint = 0;
for(i = 0; i < m; i++) {
/*有共同的資料*/
if(na[i].com != undefined) {
/*有刪除的舊資料*/
if(na[i].com > oldPrint) {
var maxRow=(na[i].com < n) ? na[i].com : n;
for(j = oldPrint; j < maxRow; j++) {
if(oa[j].tag) {
result.push(oa[j].txt);
}else{
result.push('<del>' + oa[j].txt + '</del>');
}
}
}
/*記錄下一次舊資料的指標*/
oldPrint = na[i].com + 1;
/*儲存共同的資料*/
result.push(na[i].txt);
/*新的差異資料*/
}else{
if(na[i].tag) {
result.push(na[i].txt);
}else{
result.push('<ins>' + na[i].txt + '</ins>');
}
}
}
return result;
}
//要回傳的陣列
var selData=["A","B","C","D"];
//清空母視窗的陣列,將陣列長度設為零
window.opener.resultArray.length = 0;
//將參數值填入母視窗的陣列中
for(i=0,l=selData.length; i<l; i++){
window.opener.resultArray.push(selData[i]);
}