青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 76,  comments - 621,  trackbacks - 0
編輯器制作之語法加亮基本原理在上一篇文章里,我簡單的提及了語法加亮的基本思路,下面在總結(jié)概括一下。

筆者認(rèn)為,對于編輯器而言,如果支持非常嚴(yán)格的語法加亮的話,那么擴(kuò)展性是很低的。那么在擴(kuò)展性和正確性之間,我們應(yīng)該取得一個(gè)平衡。這個(gè)平衡就是既要保證編輯器的高效率運(yùn)轉(zhuǎn),又要保持文本配置文件的可編輯性。

首先,幾乎所有的編程語言都具有某種共性,這些共性概括如下:
1.關(guān)鍵字
2.注釋
3.字符串
4.Delimiters
5.普通字符
那么對于一個(gè)字符串序列,我們應(yīng)該如何做呢?任何一個(gè)人都會(huì)很自然的想到:從前往后掃描。對,那么如何掃描呢?我用的手段是狀態(tài)機(jī)。或者不能完全稱之為狀態(tài)機(jī),因?yàn)樵谖业臓顟B(tài)機(jī)里面用到了預(yù)先判斷,對于一個(gè)長度為N的字符串,最壞的情況下會(huì)掃描M*N*L次(其中M為某些塊的起始或者結(jié)束標(biāo)記的長度,L為塊的個(gè)數(shù),關(guān)于什么是塊,參加我的上一篇文章),所以對于我的這個(gè)狀態(tài)機(jī),稱之為狀態(tài)模式更貼切一些。狀態(tài)模式是個(gè)好東西,對于狀態(tài)模式乃何物以及如何構(gòu)造,本文不作詳細(xì)闡述。

如果僅僅是識別上面這些東西的話,那么語法加亮是非常容易實(shí)現(xiàn)的。但事與愿違,事情并不是如此簡單。舉個(gè)例子html.在最開始的時(shí)候html的確讓我傷透了腦筋,因?yàn)樗梢郧度敫鞣N各樣的語言,并且每種語言的schema并不一樣,比如可以嵌入css,或者js,或者vbs,當(dāng)然還有php, java, c#代碼等等。這個(gè)時(shí)候該如何做呢? 我用的手段是分塊之后,對于不同的子語言應(yīng)用不同的schema,這么做并不是完全對的(和Lex分析相比),或多或少會(huì)出現(xiàn)某種問題,不過大多數(shù)情況下表現(xiàn)的都非常好,這個(gè)點(diǎn)就叫平衡。

再說一下狀態(tài)分析,定義如下函數(shù): 偽代碼
//根據(jù)起始狀態(tài),分析字符串line的第index字符應(yīng)該是何種狀態(tài)
state NextState( string line, int index, state start_state ){
 switch( start_state ){
  case .
  return some_state;
  case .
  return some_state;
  case .
  return some_state;
  case .
  return some_state;
 }
}

//分析一行字符串的某一個(gè)字符應(yīng)該是何種狀態(tài),并預(yù)存入cache
state ParseLine( string line, int index, state start_state ){
 for( i=index; i<line.Length; i++ ){
  start_state = NextState( line, i, start_state );
  siwtch( start_state ){
   //set text attributes
  }
 }
 //分析完之后,在進(jìn)行分析一遍,進(jìn)行一些細(xì)節(jié)匹配
 DetailMatch(...)
 //分析完之后,我們要返回該行的最后的狀態(tài),用來作為下一行的起始狀態(tài)
 return start_state;
}

//這個(gè)函數(shù)主要用來對于分完塊之后的代碼進(jìn)行細(xì)節(jié)匹配,比如匹配注釋中的email和url
//或者普通字符中的數(shù)字等等
void DetailMatch(...){
 //use regex to match some details, such as number or email
}
上面這幾個(gè)函數(shù)都簡單明了,比較容易理解,對于ParseLine我們發(fā)現(xiàn)在進(jìn)行行跳轉(zhuǎn)的時(shí)候DetailMatch并不是必須的。什么叫行跳轉(zhuǎn)呢?比如打開一個(gè)代碼文件,現(xiàn)在我要跳轉(zhuǎn)到第5000行,那么很顯然第5000行需要放到屏幕上頭,這個(gè)時(shí)候我怎么知道第5000行的起始狀態(tài)呢?當(dāng)然也得從第一航開始分析,但是我們發(fā)現(xiàn)DetailMatch其實(shí)并不是必須的,因?yàn)槲覀冎恍枰鲏K狀識別就夠了,所以速度是非??陀^的。

先寫這么多了,等我以后老了,我打算把這些東西寫成一本書,名字就叫編輯器制作基本原理,呵呵.

不敢妄自菲薄,下面貼兩個(gè)代碼片段和上面的偽代碼均是按照上述方法生成的,還算美觀.
C++代碼
#include <stdio.h>
// line comment email test@test.com 
// url:http://www.shnenglu.com/megax in comment over
/*
block comment
email test@test.com url:http://www.shnenglu.com/megax in comment over
*/
int main(int argc, char *argv[])
{
emailtest@test.com   http://www.shnenglu.com/megax in comment over int a = Class::Somfunction(); // function char * p = "abcdef string to new line"; // string can continue, just test char* p = "abcef\"\\"; //escpae char* p = 'abcef\"\\'; //escpae, just test; asm{ ; test sub lan ; line comment email test@test.com ; url:http://www.shnenglu.com/megax in comment over mov ax, 10 add ax, 0x12AD add ax, 123L jump loop1 } // number test int a = 1234; int b = 0xA12D; int c = 1234L; float a = 123.456; return 0; }
HTML代碼嵌入css,js
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link href="images/favicon.ico" rel="SHORTCUT ICON" />
<title>test</title>
<script type="text/javascript">
function setTab(m,n){
 var tli=document.getElementById("menu"+m).getElementsByTagName("a");
 var mli=document.getElementById("main"+m).getElementsByTagName("div");
 for(i=0;i<tli.length;i++){
  tli[i].className=i==n?"current1 current2":"";
  mli[i].style.display=i==n?"block":"none";
 } 
 var a = 0x012345678;
 var a = 0xABCDEF12345;
 // line comment test@test.com in comment  http://www.shnenglu.com/megax in comment over
 /*
 block comment in js
 test@test.com in comment
 http://www.shnenglu.com/megax in comment
 over
 */
}
</script> function style var
<style>
body{
 function style var
 font-size: 12px;
 font-family: "sfdsfdsf";
 /*
 block comment in css
 test@test.com in comment
 http://www.shnenglu.com/megax in comment
 over
 */
}

</style>
</head>
<body>
<table>
</table>
function style var /*sdfdsfdsf*/ return var
<!-- 
block comment in html
 test@test.com in comment
 http://www.shnenglu.com/megax in comment
 over
-->
</body>
</html>
下面看一下cppblog自帶的代碼加亮,沒有c++的,用c#代替

#include <stdio.h>
// line comment email test@test.com 
// url:http://www.shnenglu.com/megax in comment over
/*

block comment
email test@test.com url:
http://www.shnenglu.com/megax in comment over
*/
int main(int argc, char *argv[])
{
    
int a = Class::Somfunction(); // function
    char * p = "abcdef
    string to new line"; // string can continue, just test
    char* p = "abcef\"\\"; //escpae
    char* p = 'abcef\"\\'//escpae, just test;
    asm{
        ; test sub lan
        ; line comment email test@test.com 
        ; url:http:
//www.shnenglu.com/megax in comment over
        mov ax, 10
        add ax, 
0x12AD
        add ax, 
123L
        jump loop1
    }
    
// number test
    int a = 1234int b = 0xA12D;
    
int c = 1234Lfloat a = 123.456;
    
    
return 0;
}

HTML的

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link href="images/favicon.ico" rel="SHORTCUT ICON" />
<title>test</title>
<script type="text/javascript">
function setTab(m,n){
    
var tli=document.getElementById("menu"+m).getElementsByTagName("a");
    
var mli=document.getElementById("main"+m).getElementsByTagName("div");
    
for(i=0;i<tli.length;i++){
        tli[i].className
=i==n?"current1 current2":"";
        mli[i].style.display
=i==n?"block":"none";
    }    
    
var a = 0x012345678;
    
var a = 0xABCDEF12345;
    
// line comment test@test.com in comment  http://www.shnenglu.com/megax in comment over
    /*
    block comment in js
    test@test.com in comment
    http://www.shnenglu.com/megax in comment
    over
    
*/
}
</script> function style var
<style>
body
{
    function style var
    font-size
: 12px;
    font-family
: "sfdsfdsf";
    
/*
    block comment in css
    test@test.com in comment
    http://www.shnenglu.com/megax in comment
    over
    
*/
}

</style>
</head>
<body>
<table>
</table>
function style var /*sdfdsfdsf*/ return var
<!-- 
block comment in html
    test@test.com in comment
    http://www.shnenglu.com/megax in comment
    over
-->
</body>
</html>

posted on 2008-07-09 20:23 megax 閱讀(2171) 評論(4)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲特黄一级片| 亚洲美女在线一区| 伊人狠狠色丁香综合尤物| 国产真实乱子伦精品视频| 国产亚洲欧美激情| 国产一区二区三区高清 | 欧美精品一区二| 欧美日本一区二区三区| 欧美日韩国产高清| 国产精品卡一卡二卡三| 国产日韩欧美不卡在线| 樱桃成人精品视频在线播放| 亚洲国产日日夜夜| 一区二区三区国产| 欧美一站二站| 欧美/亚洲一区| 亚洲国产日韩一级| 9色精品在线| 欧美一区二区免费| 免费一级欧美片在线播放| 欧美人在线视频| 国产精品入口夜色视频大尺度 | 亚洲欧美日韩精品综合在线观看| 午夜欧美精品| 老司机一区二区| 亚洲黄页视频免费观看| 亚洲夜间福利| 麻豆九一精品爱看视频在线观看免费| 欧美精品情趣视频| 国产美女一区二区| 亚洲激情视频在线| 香蕉久久夜色| 欧美xxx在线观看| 在线视频中文亚洲| 久久一二三四| 国产精品少妇自拍| 亚洲精品1区2区| 午夜精品福利视频| 亚洲国产成人久久综合| 亚洲欧美日韩精品久久久| 免费日韩av| 国产精品一区二区a| 亚洲欧洲在线观看| 久久久久九九视频| 一本高清dvd不卡在线观看| 久久久久久69| 国产精品视频免费| 亚洲免费观看| 蜜臀av国产精品久久久久| 宅男在线国产精品| 欧美成人午夜免费视在线看片| 国产欧美精品日韩| 宅男噜噜噜66一区二区| 欧美sm视频| 久久国产精品第一页| 欧美特黄一级大片| 91久久视频| 理论片一区二区在线| 亚洲小说春色综合另类电影| 欧美韩日视频| 亚洲电影在线看| 久久久久国产精品一区二区| 亚洲无玛一区| 欧美日韩精品在线播放| 亚洲欧洲一区| 欧美+亚洲+精品+三区| 欧美一区二区日韩一区二区| 国产精品扒开腿爽爽爽视频| 亚洲日本中文字幕区| 久久综合久久综合久久| 先锋影院在线亚洲| 国产精品久久久久久妇女6080| 亚洲免费观看高清在线观看 | 日韩亚洲综合在线| 欧美va亚洲va香蕉在线| 欧美一激情一区二区三区| 国产精品乱码一区二三区小蝌蚪| 一区二区激情| 亚洲精品久久在线| 欧美了一区在线观看| 亚洲精品免费一区二区三区| 美女视频一区免费观看| 久久精品视频免费观看| 国产在线精品一区二区夜色| 欧美在线你懂的| 亚洲欧美卡通另类91av | 亚洲综合日韩在线| 一区二区三区四区五区在线| 欧美精品综合| 一区二区三区日韩欧美精品| 亚洲娇小video精品| 欧美精品v国产精品v日韩精品| 亚洲国产免费看| 亚洲成色精品| 欧美成在线视频| 亚洲精品九九| 亚洲精品欧洲| 欧美午夜激情视频| 亚洲一区在线免费观看| 国产精品99久久久久久久久久久久| 欧美色道久久88综合亚洲精品| 宅男在线国产精品| 一区二区三区偷拍| 国产精品一区二区三区四区五区 | 日韩视频在线观看国产| 亚洲精品国久久99热| 欧美日韩视频在线第一区| 宅男噜噜噜66国产日韩在线观看| 一本色道久久综合亚洲精品小说| 国产精品成人一区二区三区夜夜夜| 一区二区三区免费观看| 在线中文字幕日韩| 国产乱码精品一区二区三| 久久国产日韩| 久热精品视频在线免费观看| 亚洲精品一区二区三区婷婷月 | 午夜影视日本亚洲欧洲精品| 亚洲欧美成人精品| 国产在线成人| 亚洲大片免费看| 欧美日本一区二区高清播放视频| 亚洲中午字幕| 久久gogo国模裸体人体| 亚洲观看高清完整版在线观看| 91久久在线播放| 国产精品免费一区二区三区在线观看 | 99热这里只有成人精品国产| 中文精品视频| 黄色成人免费观看| 亚洲国产婷婷香蕉久久久久久| 欧美三区不卡| 久久看片网站| 欧美精品18videos性欧美| 亚洲一区二区三区中文字幕 | 日韩视频在线一区二区三区| 国产精品一区二区在线观看| 免费亚洲电影在线观看| 欧美了一区在线观看| 久久精品青青大伊人av| 欧美成年视频| 欧美一级理论性理论a| 久热精品视频在线免费观看 | 欧美日韩国产成人在线观看| 欧美一级一区| 欧美国产亚洲精品久久久8v| 欧美一区日本一区韩国一区| 老色鬼精品视频在线观看播放| 亚洲一级在线| 噜噜噜在线观看免费视频日韩| 亚洲男人的天堂在线aⅴ视频| 久久久精品动漫| 亚洲一二三四久久| 免费成人美女女| 午夜视频在线观看一区二区三区| 美日韩精品免费| 欧美在线观看www| 欧美欧美在线| 欧美va日韩va| 国产日韩一区欧美| 一区二区久久久久| 91久久香蕉国产日韩欧美9色| 午夜免费日韩视频| 亚洲午夜电影网| 欧美成人一区二区三区片免费| 久久er精品视频| 欧美视频中文字幕在线| 欧美激情一区二区三区成人 | 国产精品福利网| 亚洲国产一区二区三区在线播| 国产主播精品在线| 亚洲一区二区免费看| 亚洲视频1区2区| 欧美激情成人在线视频| 久久在线视频在线| 国产日韩欧美在线一区| 中文精品视频| 一区二区激情视频| 欧美精品福利视频| 欧美激情亚洲国产| 伊人久久综合| 久久激五月天综合精品| 欧美一区在线直播| 国产精品网站一区| 中文亚洲免费| 亚洲私人影院在线观看| 欧美极品色图| 91久久精品日日躁夜夜躁欧美| 激情综合五月天| 久久精品人人做人人爽| 久久精品五月婷婷| 国产午夜亚洲精品理论片色戒| 亚洲一级网站| 午夜精品三级视频福利| 国产精品yjizz| 一区二区久久久久| 亚洲一区国产精品| 国产精品久久久一区二区三区| 99视频有精品| 亚洲一区日韩| 国产精品视频你懂的|