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

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

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

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

如果僅僅是識(shí)別上面這些東西的話,那么語法加亮是非常容易實(shí)現(xiàn)的。但事與愿違,事情并不是如此簡(jiǎn)單。舉個(gè)例子html.在最開始的時(shí)候html的確讓我傷透了腦筋,因?yàn)樗梢郧度敫鞣N各樣的語言,并且每種語言的schema并不一樣,比如可以嵌入css,或者js,或者vbs,當(dāng)然還有php, java, c#代碼等等。這個(gè)時(shí)候該如何做呢? 我用的手段是分塊之后,對(duì)于不同的子語言應(yīng)用不同的schema,這么做并不是完全對(duì)的(和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ù)主要用來對(duì)于分完塊之后的代碼進(jìn)行細(xì)節(jié)匹配,比如匹配注釋中的email和url
//或者普通字符中的數(shù)字等等
void DetailMatch(...){
 //use regex to match some details, such as number or email
}
上面這幾個(gè)函數(shù)都簡(jiǎn)單明了,比較容易理解,對(duì)于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狀識(shí)別就夠了,所以速度是非??陀^的。

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

不敢妄自菲薄,下面貼兩個(gè)代碼片段和上面的偽代碼均是按照上述方法生成的,還算美觀.
C++代碼
#include <stdio.h>
// line comment email test@test.com 
// url:http://m.shnenglu.com/megax in comment over
/*
block comment
email test@test.com url:http://m.shnenglu.com/megax in comment over
*/
int main(int argc, char *argv[])
{
emailtest@test.com   http://m.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://m.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://m.shnenglu.com/megax in comment over
 /*
 block comment in js
 test@test.com in comment
 http://m.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://m.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://m.shnenglu.com/megax in comment
 over
-->
</body>
</html>
下面看一下cppblog自帶的代碼加亮,沒有c++的,用c#代替

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

block comment
email test@test.com url:
http://m.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:
//m.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://m.shnenglu.com/megax in comment over
    /*
    block comment in js
    test@test.com in comment
    http://m.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://m.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://m.shnenglu.com/megax in comment
    over
-->
</body>
</html>

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

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(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>
            国产精品免费网站| 在线观看欧美亚洲| 久久女同精品一区二区| 亚洲午夜国产成人av电影男同| 欧美午夜宅男影院在线观看| 欧美日韩国产999| 欧美激情亚洲自拍| 欧美日韩999| 国产精品入口| 国模叶桐国产精品一区| 黄色精品在线看| 在线日韩成人| 亚洲精品一区二区三区99| 亚洲精选大片| 国产精品久久久久久妇女6080 | 午夜久久影院| 亚洲午夜一级| 欧美一级专区免费大片| 久久九九有精品国产23| 欧美成人激情视频免费观看| 91久久精品国产91久久性色tv| 你懂的视频欧美| 亚洲日本电影| 欧美在线一区二区| 美女成人午夜| 国产精品大片wwwwww| 国内在线观看一区二区三区| 99国产精品久久久久久久成人热| 亚洲在线免费视频| 久久午夜色播影院免费高清| 亚洲大胆女人| 亚洲在线一区| 久久深夜福利免费观看| 欧美性猛交xxxx免费看久久久| 国产日韩免费| 亚洲视频一二区| 免费亚洲一区| 亚洲欧美日韩国产中文在线| 欧美成人按摩| 极品中文字幕一区| 亚洲综合久久久久| 亚洲国产高清一区二区三区| 午夜一区不卡| 国产精品h在线观看| 最新国产精品拍自在线播放| 欧美影院午夜播放| 一区二区三区蜜桃网| 欧美国产综合视频| 在线日韩电影| 久久另类ts人妖一区二区| 这里只有精品丝袜| 欧美激情精品久久久久久蜜臀| 国产一区二区三区在线免费观看| 99国产精品久久久| 亚洲大片在线| 欧美aaaaaaaa牛牛影院| 黄色亚洲精品| 久久激情视频| 亚洲欧美怡红院| 国产日韩欧美一区| 欧美一区二区三区四区在线观看地址| 亚洲精品一区二区三区福利| 欧美sm重口味系列视频在线观看| 国产亚洲一区在线| 香蕉久久精品日日躁夜夜躁| 亚洲视频在线观看| 一区二区三区日韩| 亚洲一区二区三区涩| 欧美激情一区三区| 久久综合一区二区三区| 国产日韩欧美一区二区| 性色av一区二区怡红| 一区二区三区精品在线| 国产精品国产三级国产a| 亚洲午夜精品久久久久久浪潮| 亚洲麻豆视频| 欧美乱在线观看| 亚洲老板91色精品久久| 羞羞漫画18久久大片| 男男成人高潮片免费网站| 性久久久久久久久久久久| 国产精品一区在线观看| 欧美一区二区啪啪| 欧美在线视频网站| 亚洲国产欧美一区二区三区同亚洲| 欧美成人免费全部| 性欧美xxxx视频在线观看| 亚洲欧美日韩网| 在线观看av不卡| 亚洲激情影院| 国产精品欧美激情| 久久―日本道色综合久久| 蜜臀av在线播放一区二区三区| 99精品视频一区| 午夜日韩在线| 99国产精品久久| 久久国产欧美日韩精品| 一区二区三区高清| 久久精品91久久香蕉加勒比| 99ri日韩精品视频| 久久精品国产精品亚洲| 一区二区精品| 久久手机精品视频| 亚洲摸下面视频| 麻豆免费精品视频| 欧美在线资源| 欧美一级电影久久| 欧美一区二区三区视频免费播放| 精品99一区二区| 一本色道88久久加勒比精品| 国产精品啊v在线| 亚洲电影免费| 国产精品家庭影院| 久久综合网络一区二区| 亚洲综合色婷婷| 日韩视频一区二区三区| 亚洲一级网站| 亚洲大胆人体视频| 日韩一级裸体免费视频| 国产欧美高清| 久久国产精品一区二区三区四区| 欧美美女日韩| 美女国产精品| 国产精品国产三级国产aⅴ9色| 久久国产加勒比精品无码| 欧美xxx成人| 美日韩精品免费观看视频| 亚洲视频网站在线观看| 国产亚洲精品bt天堂精选| 亚洲国产成人av好男人在线观看| 国产精品乱码妇女bbbb| 欧美国产高潮xxxx1819| 国产精品久久久久久久久免费桃花| 久久久久久夜| 欧美精品日韩三级| 久久亚洲电影| 国产精品人成在线观看免费| 亚洲国产另类久久久精品极度| 亚洲性线免费观看视频成熟| 欧美成人午夜影院| 国内精品久久久| 日韩一级不卡| 亚洲国产一区二区在线| 欧美一区二区三区免费视频| 中日韩高清电影网| 欧美成人免费全部| 免费欧美高清视频| 激情欧美日韩| 欧美成人午夜免费视在线看片| 经典三级久久| 久久国产精品久久久| 久久成人一区| 国产精品综合| 亚洲欧美日韩天堂| 久久综合综合久久综合| 国产亚洲精品一区二区| 亚洲欧美在线免费观看| 欧美一级黄色网| 国产欧美一区二区精品仙草咪| 欧美在线视频不卡| 久久视频这里只有精品| 国产日韩一区二区| 欧美亚洲视频一区二区| 欧美与欧洲交xxxx免费观看| 国自产拍偷拍福利精品免费一| 亚洲综合视频在线| 欧美一级视频免费在线观看| 国产精品免费区二区三区观看| 亚洲一区二区三区久久 | 免费不卡中文字幕视频| 亚洲裸体视频| 亚洲在线中文字幕| 国产欧美另类| 久久久精品视频成人| 另类酷文…触手系列精品集v1小说| 欧美日韩精品免费观看视一区二区| 亚洲综合日韩| 久久夜色精品国产噜噜av| 在线播放不卡| 欧美xart系列在线观看| 亚洲欧洲精品成人久久奇米网| 国产一区二区三区日韩| 亚洲影院色在线观看免费| 久久精品亚洲国产奇米99| 亚洲国产天堂久久国产91| 亚洲精品一区二区在线| 欧美久久视频| 亚洲欧美制服另类日韩| 你懂的网址国产 欧美| 亚洲国产成人久久综合| 欧美剧在线免费观看网站| 亚洲一区二区三区久久| 午夜精品久久久久| 久久久精品tv| 99国产精品久久久久久久久久| 国产精品久久久久久久午夜| 久久精品人人| 亚洲毛片一区二区| 久久精品女人天堂| 亚洲毛片在线看|