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

歲月流轉(zhuǎn),往昔空明

C++博客 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
  118 Posts :: 3 Stories :: 413 Comments :: 0 Trackbacks

#

今天群里面正好有朋友問(wèn)起這個(gè)問(wèn)題,就簡(jiǎn)單的解答下,如果有問(wèn)題的話,歡迎大家留言批評(píng)指正。

常用的源代碼授權(quán)協(xié)議主要分為以 下兩類,商業(yè)協(xié)議和開(kāi)源協(xié)議。今天主要討論一下開(kāi)源協(xié)議。首先需要明確的是,既然是許可,就一定會(huì)具備法律效力。如果你的GNU作品被人侵權(quán)了的話,去找 GSF(GNU Software Foundation)吧,讓他們把你打官司,就像Skype被告了那樣的,哈。唔,當(dāng)然你自己打也是可以的,就是搜集證據(jù)方面可能有點(diǎn)難度。

開(kāi)源協(xié)議,都有一個(gè)共同的特性,就是開(kāi)放了源代碼(這句話貌似很廢話yeah)。他們的區(qū)別在于三點(diǎn):
1.對(duì)源代碼的修改限制。一些開(kāi)源協(xié)議會(huì)告訴你,只能使用已有源代碼而不能進(jìn)行修改。
2.對(duì)原有協(xié)議許可的修改限制。通常的開(kāi)源協(xié)議都會(huì)讓使用者在發(fā)布的二進(jìn)制軟件或者源代碼中,保有被使用的軟件的版權(quán)信息和協(xié)議許可。
3. 對(duì)二進(jìn)制和源代碼產(chǎn)品的發(fā)布限制。對(duì)于GPL協(xié)議而言,使用了GPL協(xié)議的產(chǎn)品的軟件,是不允許單獨(dú)發(fā)行二進(jìn)制產(chǎn)品的,而必須要將源代碼以GPL的協(xié)議發(fā) 布出來(lái)。這就是所謂的“傳染性”。這也就意味著,只要你的產(chǎn)品的使用鏈上有GPL的玩意兒,對(duì)不起,你就只能GPL了。
而LGPL協(xié)議就要寬松的多。如果你使用了別人LGPL協(xié)議的二進(jìn)制,只需要保有許可并不加修改,就不影響你的產(chǎn)品授權(quán)。但是如果你使用、修改了別人LGPL協(xié)議的源代碼,那么,修改后的源代碼就必須要公開(kāi),并且一樣遵守LGPL協(xié)議。

GPL這樣的協(xié)議,相對(duì)是嚴(yán)格的。開(kāi)源協(xié)議里面,還有很寬松的BSD,MIT和BOOST協(xié)議。這些協(xié)議的被授權(quán)方,可以自由修改、散播源代碼或者源代碼衍生的產(chǎn)品,只需要你產(chǎn)品的授權(quán)協(xié)議里,將BSD,MIT,BOOST協(xié)議一并附上就可以了。
http://www.awflasher.com/blog/archives/939
這里有GPL,LGPL,APACHE,BSD,MIT五種常見(jiàn)開(kāi)源協(xié)議的簡(jiǎn)單介紹。其他的可以參見(jiàn)baidu/wiki,或者如果你有足夠的法律知識(shí),可以去直接看協(xié)議條款吧,嘎嘎。

今天朋友的問(wèn)題是,如果一個(gè)東西全部都是他做的,想以GPL的形式公開(kāi),同時(shí)還想賣錢,可以嗎?
答案當(dāng)然是肯定的。Qt 就是個(gè)最好的例子。Qt兼具GPL/LGPL協(xié)議和Qt Commercial的商業(yè)協(xié)議。你完全可以以GPL的的協(xié)議將你的產(chǎn)品公開(kāi),然后如果有人想用你的東西做商業(yè)用途,你就再簽一份商業(yè)許可就可以了。以上 的幾個(gè)開(kāi)源協(xié)議,都是經(jīng)由OSI批準(zhǔn)的,強(qiáng)烈建議大家在發(fā)布新程序的時(shí)候,另可采用多份協(xié)議,也不要輕易修改標(biāo)準(zhǔn)協(xié)議。
但是注意,如果你的產(chǎn)品里,直接或間接使用了第三方產(chǎn)品(這個(gè)太常見(jiàn)了,比方說(shuō)Image Library啦,boost啦等等),一定要看清楚它的協(xié)議。如果你不小心用了GPL協(xié)議的組件,那么對(duì)不起,你的商業(yè)授權(quán)就算是廢了,因?yàn)槟愕漠a(chǎn)品只能是GPL協(xié)議的了。
所以說(shuō),如果制作商業(yè)產(chǎn)品,stl,gdi+這樣的商業(yè)授權(quán)是首選(注意一下你有沒(méi)有發(fā)布產(chǎn)品的權(quán)利,不是所有的商業(yè)授權(quán)你都有發(fā)布的權(quán)利的)。
其次是BSD,MIT一類的自由度非常高的協(xié)議,再其次是LGPL這樣的二進(jìn)制可發(fā)布的協(xié)議。
GPL是一定不能選的。相對(duì)的,如果你僅僅制作GPL協(xié)議的產(chǎn)品,也要看清楚,你是否具有發(fā)布第三方源代碼的權(quán)利。當(dāng)然如果僅僅發(fā)布你撰寫(xiě)的程序,是不會(huì)有問(wèn)題的。
posted @ 2009-10-28 15:23 空明流轉(zhuǎn) 閱讀(2333) | 評(píng)論 (5)編輯 收藏


沒(méi)啥好說(shuō)的,沒(méi)什么技術(shù)含量,就是有點(diǎn)用,功能類似于VA X的#ifndef guard.
生成的格式按照 PROJECTNAME_FILENAME_FILEEXTNAME_GUID 來(lái)的。
比方說(shuō)我的就是

SPIRIT_SASL_AST_NODE_STATEMENT_H_B530FB44_F5C8_431F_A250_E426F791B7CF

如果有需要可以自己改一下代碼就好了。

語(yǔ)言是VB.NET.

工程+源代碼文件下載地址
posted @ 2009-03-09 00:06 空明流轉(zhuǎn) 閱讀(1389) | 評(píng)論 (1)編輯 收藏

     摘要: 詳細(xì)討論了在設(shè)計(jì)靜態(tài)強(qiáng)類型語(yǔ)言語(yǔ)法時(shí)如何處理類型別名(typedef)和變量定義的類型聲明的問(wèn)題。  閱讀全文
posted @ 2009-02-25 01:33 空明流轉(zhuǎn) 閱讀(1986) | 評(píng)論 (2)編輯 收藏

最近用了一段時(shí)間的wxWidgets。
基本上主流的界面庫(kù)也就算用的差不多了。
這里拿一個(gè)表格對(duì)這些界面庫(kù)做一個(gè)比較直觀的比較。

界面庫(kù)名稱
接口設(shè)計(jì)
界面編輯器
高級(jí)布局功能
平面繪制
平臺(tái)兼容性
語(yǔ)言支持
IDE兼容性
視圖-模型分離機(jī)制
運(yùn)行時(shí)
其它
Windows Forms
接口優(yōu)秀。C++下使用CLI擴(kuò)展,其它語(yǔ)言為原生支持。
界面編輯器完整,包括布局、屬性、消息關(guān)聯(lián)的完整設(shè)置。不可預(yù)覽。
Table Layout,Splitter Layout,F(xiàn)low Layout等,Anchor和Dock機(jī)制。多分辨率界面下表現(xiàn)良好。
GDI+,面向?qū)ο蟮?D繪制接口,使用簡(jiǎn)便。
需要.Net平臺(tái)支持。WIndows或Linux(Mono,非官方支持),支持Windows CE
C++/CLI, 支持.net的語(yǔ)言。
僅VS。
布局和視圖方案建立在代碼中。部分組件支持Model-View架構(gòu)。
需要部署對(duì)應(yīng)的.net
商業(yè)協(xié)議
MFC
基于宏和虛函數(shù),使用特殊格式注釋,使用自定義的RTTI系統(tǒng)。類接口設(shè)計(jì)優(yōu)良。通過(guò)回調(diào)函數(shù)和虛繼承重載調(diào)用客戶代碼。
基于資源編輯器,僅能對(duì)空間基本布局和少量屬性進(jìn)行調(diào)整。不可預(yù)覽。
缺乏高級(jí)布局功能,多分辨率需要是手工或程序中調(diào)整。
GDI及GDI封裝,可選GDI+
Windows,Windows CE
C++ Only,
支持COM時(shí)可以實(shí)現(xiàn)Binary級(jí)別復(fù)用。
僅Visual Studio
使用資源保存控件的基本控件布局,提供Doc-View機(jī)制和控件數(shù)據(jù)交換支持視圖分離。
需要部署MFC運(yùn)行時(shí)庫(kù)。
商業(yè)協(xié)議
WTL
基于模板和虛函數(shù)。類接口類似于MFC。需要使用多重繼承。通過(guò)模板特化和回調(diào)函數(shù)與客戶代碼交互。
同MFC
同MFC
同MFC
同MFC
同MFC,對(duì)COM的支持比MFC完善很多。
Visual Studio,Windows下支持標(biāo)準(zhǔn)的C++編譯器。
使用資源文件保存空間布局。
無(wú)
自由協(xié)議
wxWidget
宏,自定義RTTI。使用回調(diào)函數(shù)與用戶代碼交互。
無(wú)官方界面編輯器。可使用第三方界面編輯器。部分編輯器具有完整的所見(jiàn)即所得功能,且具有預(yù)覽能力。
使用Sizer實(shí)現(xiàn)多分辨率的布局。功能偏弱。
wxDC等。
Windows,Linux,Unix,MacOS等
C++, .NET, Python,
Lua,
Ruby等
良好的編譯器兼容性,缺乏IDE繼承。
可以將界面屬性生成到代碼中,也可以使用XML格式保存。
wx的動(dòng)態(tài)鏈接庫(kù)或靜態(tài)鏈接。
自由協(xié)議
Qt
使用宏和自定義的RTTI。使用Singal-Slot機(jī)制實(shí)現(xiàn)用戶代碼交互。可通過(guò)繼承實(shí)現(xiàn)擴(kuò)展。
Qt Designer,具備完整的所見(jiàn)即所得編輯功能。可預(yù)覽界面。
具備完整的布局功能。多分辨率/多平臺(tái)下表現(xiàn)良好。
QCanvas等。
Windows,Linux,Unix,MacOS等。
C++,Python等
可集成到Eclipse和VS
使用資源文件保存界面信息。部分組件具備Model-View-Delegate架構(gòu)
qt的動(dòng)態(tài)鏈接庫(kù)。
開(kāi)源協(xié)議+商業(yè)協(xié)議
GTK+
使用signal-slot機(jī)制完成用戶代碼交互。
GLADE,具備所見(jiàn)即所得的界面編輯功能
Layout Containers,具備較完整的布局能力。
GTK Graphics Context
Windows,Linux,Unix,MacOS等。 C,C++,Python,.NET等。
(暫時(shí)未知)
使用代碼完成界面設(shè)置。部分組件具備Model-View架構(gòu)。
GTK Runtime
開(kāi)源協(xié)議

此外,除了WTL外,其余各界面庫(kù)均有完整及時(shí)的文檔和手冊(cè),因此比較項(xiàng)中不再指明。
回帖中有人指出國(guó)際化問(wèn)題的比較,事實(shí)上MS的產(chǎn)品和開(kāi)源對(duì)于國(guó)際化的解決方法是不同的。但是都可以比較方便的解決國(guó)際化問(wèn)題。
posted @ 2009-01-06 18:09 空明流轉(zhuǎn) 閱讀(11023) | 評(píng)論 (12)編輯 收藏

如果為了一個(gè)Flex和Bison就下整個(gè)MSYS和Cygwin我覺(jué)得有點(diǎn)太夸張了。
不過(guò)為了提個(gè)可用的新版本花了我兩個(gè)晚上。麻煩死了。
我估計(jì)還有人也會(huì)覺(jué)得很麻煩。
所以就把這個(gè)下載放上來(lái),在win下面可以獨(dú)立運(yùn)行的,不過(guò)最好把bin目錄設(shè)置到Path中。

在我的工程里面是用批處理做的,這樣可以放到編譯前腳本里面,就可以在編譯前自動(dòng)生成新的分析文件。

其實(shí)我還改了下FlexLexer.h,不知道為什么我的那個(gè)會(huì)有redefine的編譯錯(cuò)誤,mingw gcc432(tdm版)。
VS下面沒(méi)有運(yùn)行過(guò),不過(guò)應(yīng)該沒(méi)問(wèn)題。
也不知道我修的是對(duì)是錯(cuò),還請(qǐng)高人指點(diǎn)。

@echo off
set path=%path%;../util/bin/
bison -d gram.y
flex -o lex.yy.cc lex.l

下載地址, 帶RR10%, .

posted @ 2008-12-19 22:16 空明流轉(zhuǎn) 閱讀(3237) | 評(píng)論 (0)編輯 收藏

     摘要: 設(shè)計(jì)模式小結(jié)的最后一篇,這樣 GOF 2X 個(gè)模式就都齊全了。。。
歡迎大家噴。。。。  閱讀全文
posted @ 2008-11-21 18:29 空明流轉(zhuǎn) 閱讀(2332) | 評(píng)論 (2)編輯 收藏

這個(gè)工具源自于我的一個(gè)需求,
我將文檔都保存在了硬盤(pán)上,只不過(guò)由于分布不夠大而只能分開(kāi)放置于多個(gè)文件夾中。
有時(shí)候我需要將這些數(shù)據(jù)進(jìn)行備份,一張盤(pán)也放不下,也就需要備份到多張盤(pán)中。

此時(shí)問(wèn)題出現(xiàn)了,如果我往硬盤(pán)上新添了一些文檔,在我下一次備份的時(shí),我如何準(zhǔn)確的篩選出新增的文檔。

一般來(lái)講如果只是一個(gè)源盤(pán)和一個(gè)目標(biāo)盤(pán),用Beyond Compare或者類似的工具就能解決問(wèn)題。
不過(guò)現(xiàn)在是多對(duì)多的,問(wèn)題就變得比較復(fù)雜。

因此我就做了這么個(gè)東西,可以將多個(gè)目錄組成虛擬的文件樹(shù)再進(jìn)行比較。
文件夾的對(duì)應(yīng)關(guān)系直接利用同級(jí)文件夾的名稱來(lái)判斷
我也提供了手工設(shè)置文件夾對(duì)應(yīng)關(guān)系的功能,不過(guò)因?yàn)閁I方面還沒(méi)考慮好所以沒(méi)有加上。

文件之間的比較利用兩種方案,一種方案在文件被計(jì)算過(guò)MD5效驗(yàn)的時(shí)候直接使用MD5比較
如果沒(méi)有MD5的話使用文件大小和最后修改時(shí)間比較
由于文件比較不使用文件名,也就獲得不了對(duì)應(yīng)關(guān)系,因此目錄樹(shù)下面的所有文件的所有組合都要一一遍歷。
同時(shí)由于計(jì)算MD5效驗(yàn)碼需要讀取整個(gè)文件,時(shí)間較長(zhǎng),因此Checksum是需要手動(dòng)計(jì)算和刷新的。

最后就是樹(shù)可以整棵的被保存到快照文件中,格式是XML的格式,人也可以讀。
比較過(guò)后,可以某個(gè)子樹(shù)或者單棵整樹(shù)的相同文件或這新增文件拷貝到一個(gè)目錄下。
本來(lái)希望能直接生成Nero的刻錄清單的文件格式,后來(lái)找不到相關(guān)的資料就只好放棄了。

Download Source Code Project,VS2005 / VS2005 SP1, XP SP2/SP3下通過(guò)。



屏幕快照。紅色表示新增文件,藍(lán)色表示相同文件,黃色表示不完全對(duì)應(yīng)。

posted @ 2008-11-06 23:48 空明流轉(zhuǎn) 閱讀(2898) | 評(píng)論 (8)編輯 收藏

呃,怎么說(shuō)呢,這個(gè)和vczh的同名文章是互為補(bǔ)充的。這是最近老板的要求,所以就寫(xiě)了這么個(gè)東西。

vczh的方法生成的樹(shù)是sparse的,而我這里樹(shù)則要緊湊一些,所使用的坐標(biāo)系也與之不同。

效果(看起來(lái)挺菜,哇咔咔)


布局分為水平布局和豎直布局兩個(gè)部分,我這里先進(jìn)行了水平布局再進(jìn)行了豎直布局。

一般來(lái)講緊湊的樹(shù)主要指同級(jí)節(jié)點(diǎn)方向上的緊湊性。由于這里樹(shù)是父節(jié)點(diǎn)在上,子結(jié)點(diǎn)在下,因此水平方向上的節(jié)點(diǎn)要盡量緊湊。那么便需要我將節(jié)點(diǎn)盡量往左布局。
如果自左往右布置節(jié)點(diǎn),那么很顯然,左邊的節(jié)點(diǎn)的位置一旦固定下來(lái)就不需要再行調(diào)整。
同時(shí),為了保持樹(shù)的美觀,父節(jié)點(diǎn)的水平中心應(yīng)當(dāng)是子結(jié)點(diǎn)的水平中心,這樣子結(jié)點(diǎn)就會(huì)對(duì)稱分布在父節(jié)點(diǎn)的下方,有利于美觀。
然而父節(jié)點(diǎn)能正常布局的位置,子結(jié)點(diǎn)可能無(wú)法正常布局(子結(jié)點(diǎn)的寬度比父節(jié)點(diǎn)寬得多)。因此我們還需要調(diào)整子結(jié)點(diǎn)的布局。
由于是自左向右布局的,此時(shí)子結(jié)點(diǎn)的左邊的節(jié)點(diǎn)都已經(jīng)確定了,正確的布局很容易便可以通過(guò)右移得到。
為了保證正確性,還需要把父節(jié)點(diǎn)也右移。因?yàn)楦腹?jié)點(diǎn)的右邊沒(méi)有布局限制,因而可以放心的右移。這樣一直傳遞到根節(jié)點(diǎn)就可以了。
那么很明顯,整體來(lái)說(shuō),布局順序就是,自下而上,自左而右。

為了讓節(jié)點(diǎn)在布局的時(shí)候知道自己能被安排的最左位置,需要為每一層保存最左可布局位置的坐標(biāo)。
一旦有節(jié)點(diǎn)被安排妥當(dāng),便更新節(jié)點(diǎn)所在層次的最左可布局位置。后來(lái)的節(jié)點(diǎn)只要在這個(gè)位置的右方布局,就不會(huì)與已布置的節(jié)點(diǎn)沖突。

豎直布局并不復(fù)雜,算出每一層的Top就可以了。

代碼如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

//布局算法:
//采用平行節(jié)點(diǎn)最左布局,父子節(jié)點(diǎn)對(duì)中布局的原則。

/****
 *  void Layout(int lyr)
 *  {
 *     
 *  }
 * 
****
*/
namespace CrowdTree
{
    
class LayoutTreeLayerInfo
    {
        
//可安排布局的最左坐標(biāo)
        private Dictionary<intfloat> lyrLefts = new Dictionary<int,float>();
        
private Dictionary<intfloat> heights = new Dictionary<int,float>();

        
public void Reset()
        {
            lyrLefts 
= new Dictionary<intfloat>();
            heights 
= new Dictionary<intfloat>();
        }

        
public float GetLayoutableLeft(int level)
        {
            
if (lyrLefts.ContainsKey(level))
            {
                
return lyrLefts[level];
            }
            
return 0;
        }

        
public void SetLayoutableLeft(int level, float left)
        {
            
if (lyrLefts.ContainsKey(level))
            {
                lyrLefts[level] 
= Math.Max(left, lyrLefts[level]);
            }
            
else
            {
                lyrLefts[level] 
= Math.Max(0, left);
            }
        }

        
public void SetLayoutLevelMinHeight(int level, float height)
        {
            
if (heights.ContainsKey(level))
            {
                heights[level] 
= Math.Max(heights[level], height);
            }
            
else
            {
                heights[level] 
= height;
            }
        }

        
public float GetLayoutLevelMinHeight(int level)
        {
            
if (heights.ContainsKey(level))
            {
                
return heights[level];
            }
            
return 0;
        }
    }

    
class LayoutTreeNode
    {
        
protected LayoutTree owner_;
        
protected LayoutTreeLayerInfo lyrInfo_;
        
protected int lyrLevel_;
        
protected RectangleF rect_;
        
protected List<LayoutTreeNode> children_ = new List<LayoutTreeNode>();

        
public int Level
        {
            
get { return lyrLevel_; }
            
set { lyrLevel_ = value; }
        }

        
public LayoutTree Owner
        {
            
get { return owner_; }
            
set { owner_ = value; }
        }

        
public LayoutTreeLayerInfo LayerInfo
        {
            
set { lyrInfo_ = value; }
        }

        
public List<LayoutTreeNode> Children
        {
            
get { return children_; }
        }

        
public RectangleF Extent
        {
            
get { return rect_; }
        }

        
protected void LayoutHorizontal()
        {
            
//獲取當(dāng)前節(jié)點(diǎn)能夠排布的最左位置,并預(yù)先安排當(dāng)前節(jié)點(diǎn)。
            float originLeft = lyrInfo_.GetLayoutableLeft(lyrLevel_);
            rect_.X 
= originLeft;

            
//根據(jù)當(dāng)前結(jié)點(diǎn)的坐標(biāo),安排子結(jié)點(diǎn),并需要根據(jù)子結(jié)點(diǎn)的安置情況重新調(diào)整父節(jié)點(diǎn)的安置
            if (children_.Count > 0)
            {
                
//計(jì)算子結(jié)點(diǎn)最左可以安放的位置
                float childrenTotalWidth = 0.0F;
                
foreach (LayoutTreeNode child in children_)
                {
                    childrenTotalWidth 
+= child.Extent.Width;
                }
                childrenTotalWidth 
+= ((children_.Count - 1* owner_.HorizontalSpacer);
                
float childLeftest = originLeft + (rect_.Width / 2.0f- (childrenTotalWidth / 2.0F);

                
//設(shè)置子結(jié)點(diǎn)安放的最左位
                lyrInfo_.SetLayoutableLeft(lyrLevel_ + 1, childLeftest);

                
//安放子結(jié)點(diǎn)
                for (int idxChild = 0; idxChild < children_.Count; ++idxChild)
                {
                    children_[idxChild].LayoutHorizontal();
                }

                 
//利用子結(jié)點(diǎn)重新對(duì)中安置當(dāng)前節(jié)點(diǎn)
                float center = (children_[0].Extent.Left + children_[children_.Count - 1].Extent.Right) / 2.0F;
                rect_.X 
= center - rect_.Width / 2.0F;
            }

            
//利用節(jié)點(diǎn)坐標(biāo)設(shè)置該層其他子結(jié)點(diǎn)所能安放的最左位置,并設(shè)置一下當(dāng)前層元素的最大高度
            lyrInfo_.SetLayoutableLeft(lyrLevel_, this.rect_.Right + owner_.HorizontalSpacer);
            lyrInfo_.SetLayoutLevelMinHeight(lyrLevel_, 
this.rect_.Height);
        }

        
protected void LayoutVertical(float top)
        {
            rect_.Y 
= top;
            
foreach (LayoutTreeNode child in children_)
            {
                child.LayoutVertical(top 
+ lyrInfo_.GetLayoutLevelMinHeight(lyrLevel_) + owner_.VerticalSpacer);
            }
        }

        
public void Layout()
        {
            LayoutHorizontal();
            LayoutVertical(
0.0f);
        }

        
public virtual void CalculateSize(float maxWidth, Font font, Graphics g)
        {
        }

        
public virtual void CalculateSizeRecursive(float maxWidth, Font font, Graphics g)
        {
        }

        
public virtual void Draw(Graphics g) { }
    }

    
class TextLayoutTreeNode: LayoutTreeNode
    {
        
private string text;
        
private StringFormat strFmt = new StringFormat();
        
private Font font;

        
public String Text
        {
            
get { return text; }
            
set { text = value; }
        }

        
public override void CalculateSize(float maxWidth, Font font, Graphics g)
        {
            strFmt.Alignment 
= StringAlignment.Center;
            strFmt.LineAlignment 
= StringAlignment.Center;

            rect_.Size 
= g.MeasureString(text, font, (int)maxWidth, strFmt);
            
this.font = font;
        }

        
public override void CalculateSizeRecursive(float maxWidth, Font font, Graphics g)
        {
            CalculateSize(maxWidth, font, g);
            
foreach (LayoutTreeNode node in children_)
            {
                node.CalculateSizeRecursive(maxWidth, font, g);
            }
        }

        
public override void Draw(Graphics g)
        {
            
//外輪廓,內(nèi)容,連線
            g.DrawRectangle(Pens.Black, Rectangle.Round(Extent));
            g.DrawString(text, font, Brushes.Red, Extent);

            
foreach (LayoutTreeNode childNode in children_)
            {
                
//繪制斜線
                
                
float childX = (childNode.Extent.Left + childNode.Extent.Right) / 2.0F;
                
float childY = childNode.Extent.Top;
                
                
float curX = (Extent.Left + Extent.Right) / 2.0f;
                
float curY = Extent.Bottom;

                g.DrawLine(Pens.Black, 
new PointF(childX, childY), new PointF(curX, curY));
            }
        }
    }

    
class LayoutTree
    {
        
private float vertical_spacer;
        
private float horizontal_spacer;

        
private LayoutTreeNode root;
        
private LayoutTreeLayerInfo lyrInfo = new LayoutTreeLayerInfo();

        
public float VerticalSpacer
        {
            
get { return vertical_spacer; }
            
set { vertical_spacer = value; }
        }

        
public float HorizontalSpacer
        {
            
get { return horizontal_spacer; }
            
set { horizontal_spacer = value; }
        }

        
public LayoutTreeNode Root
        {
            
get { return root; }
            
set { root = value; }
        }

        
public void ResetLayout()
        {
            lyrInfo.Reset();
        }

        
public T CreateNode<T> (LayoutTreeNode parent) where T:LayoutTreeNode, new()
        {
            T retNode 
= new T();
            
            retNode.Owner 
= this;
            retNode.LayerInfo 
= this.lyrInfo;

            
if (parent == null)
            {
                
this.root = retNode;
                retNode.Level 
= 0;
            }
            
else
            {
                parent.Children.Add(retNode);
                retNode.Level 
= parent.Level + 1;
            }
            
return retNode;
        }
    }
}

posted @ 2008-09-13 12:42 空明流轉(zhuǎn) 閱讀(1600) | 評(píng)論 (2)編輯 收藏

經(jīng)過(guò)一晚上的整理,把 SoftArt Shader Language 的 EBNF 弄出來(lái)了。
主要參照的是 ISO C++的EBNF
由于ISO C++并不是一個(gè)LALR(1)能夠解決的問(wèn)題,因此不知道這個(gè)C++ EBNF的簡(jiǎn)化版能否在YACC上比較方便的實(shí)現(xiàn)。
如果不能實(shí)現(xiàn),我會(huì)先考慮修正語(yǔ)法滿足需要,而不是手寫(xiě)編譯器,我還沒(méi)那個(gè)能耐。

Flex 與 Bison 的 下載地址

//SASL: SoftArt Shader Language

Syntax

Program             ::
= DeclSeq

//////////////////////////////////
//Declaration
//////////////////////////////////
DeclSeq             ::
= Decl | 
                        DeclSeq Decl
                        
Decl                ::
= BlockDecl |
                        FunctioDef

Declarator          ::
= DirectDecl [SemanticSpec] [RegisterSpec]

DirectDecl          ::
= DeclId |
                        DirectDecl '(' ParamDeclClause ')'|
                        DirectDecl '
[' [ConstExp] ']'|
                        '(' Declarator ')'

CvQualifierSeq      ::
= CvQualifier [CvQualifierSeq]

CvQualifier         ::
= 'const' | 'uniform'

SemanticSpec        ::
= ':' Semantic

RegisterSpec        ::
= ':' 'register' '(' Register ')'
                        
BlockDecl           ::
= SimpleDecl

SimpleDecl          ::
= [DeclSpecSeq] [InitDeclList] ';'

AbsDecl             ::
= DirectAbsDecl

DirectAbsDecl       ::
= [DirectAbsDecl] '(' ParamDeclClause ')' |
                        
[DirectAbsDecl] '[' [ConstExp] ']' |
                        '(' AbsDecl ')'
                        

DeclSpecSeq         ::
= [DeclSpecSeq] DeclSpec

InitDeclList        ::
= InitDecl |
                        InitDeclList '
,' InitDecl

InitDecl            ::
=    Declarator [Init]

Init                ::
= '=' InitClause                         |
                        ( ExpList)
                        
InitClause          ::
= AssignmentExp |
                        '{' InitList 
[','] '}' |
                        '{' '}'
InitList            ::
= InitClause |
                        InitList '
,' InitClause
                        
DeclSpec            ::
= TypeSpec
                        
TypeSpec            ::
= SimpleTypeSpec |
                        ClassSpec

SimpleTypeSpec      ::
=    'int' | 'half' | 'float' |
                        'int2' | 'half2' | 'float2' |
                        'int3' | 'half3' | 'float3' |
                        'int4' | 'half4' | 'float4' |
                        'float4x4'

/////////////////////////////
//Function
/////////////////////////////
FunctionDef         ::
= [DeclSpecSeq] Declarator FunctionBody

FunctionBody        ::
= CompoundStatement

/////////////////////////////
//Statements
/////////////////////////////
CompoundStatement   ::
= '{' [StatementSeq] '}'

StatementSeq        ::
= Statement |
                        StatementSeq Statement

Statement           ::
= ExpStatement |
                        CompountStatement |
                        SelectionStatement |
                        IterationStatement |
                        DeclStatement
                        
ExpStatement        ::
= [ Expression ] ';'

SelectionStatement  ::
= 'if' '(' Condition ')' Statement |
                        'if' '(' Condition ')' Statement 'else' Statement

IterationStatement  ::
= 'while' '(' Condition ')' Statement |
                        'do' Statement 'while' '(' Expression ')' '
;'
                        'for' '(' ForInitStatement [Condition] ';' [ Expression ] ')' Statement
        
Condition           ::
= Expression |
                        TypeSpecSeq Declarator '
=' AssignmentExp

ForInitStatement    ::
= ExpStatement |
                        SimpleDecl

DeclStatement       ::
= BlockDecl

/////////////////////////////                        
//Parameter
/////////////////////////////
ParamDeclClause     ::
= [ ParamDeclList ]

ParamDeclList       ::
= ParamDecl |
                        ParamDeclList '
,' ParamDecl

ParamDecl           ::
= DeclSpecSeq Delarator |
                        DeclSpecSeq 
[AbsDecl]


/////////////////////////////
//Class And Struct
/////////////////////////////
ClassSpec           ::
= ClassHead '{' [ MemberSpec ] '}'

ClassHead           ::
= 'struct' [ Identifier ]

MemberSpec    `     ::
= MemberDecl [MemberSpec]

MemberDeclaration   ::
= [DeclSpecSeq] [MemberDeclList]

MemberDeclList      ::
= MemberDecl |
                        MemberDeclList '
,' MemberDeclarator
                        
MemberDeclarator    ::
=    Declarator [ PureSpec ] |
                        Declarator 
[ ConstInit ] |
                        
[ Identifier ] ':' ConstExp



//////////////////////////////////////
//Expressions
//////////////////////////////////////
Expression          ::
= AssignmentExp

ConstExp            ::
= CondExp

AssignmentExp       ::
= CondExp |
                        LogicalOrExp AssignmentOp AssignmentExp
                        
CondExp             ::
= LogicalOrExp |
                        LogicalOrExp '?' Expression ':' AssignmentExp

LogicalOrExp        ::
= LogicalAndExp |
                        LogicalOrExp '||' LogicalAndExp
                        
LogicalAndExp       ::
= InclusiveOrExp |
                        LogicalAndExp '&&' InclusiveOrExp
                        
InclusiveOrExp      ::
= ExclusiveOrExp |
                        InclusiveOrExp '|' ExclusiveOrExp
                        
ExclusiveOrExp      ::
= AndExp |
                        ExclusiveOrExp '^' AndExp

AndExp              ::
= EqualExp |
                        AndExp '&' EqualExp

EqualExp            ::
= RelExp |
                        EqualExp '
==' RelExp |
                        EqualExp '!
=' RelExp

RelExp              ::
= ShiftExp |
                        RelExp '<' ShiftExp |
                        RelExp '>' ShiftExp |
                        RelExp '<
=' ShiftExp |
                        RelExp '>
=' ShiftExp

ShiftExp            ::
= AddExp |
                        ShiftExp '<<' AddExp |
                        ShiftExp '>>' AddExp

AddExp              ::
= MulExp |
                        AddExp '+' MulExp |
                        AddExp '-' MulExp

MulExp              ::
= PmExp |
                        MulExp '*' PmExp |
                        MulExp '/' PmExp |
                        MulExp '%' PmExp
    
PmExp               ::
= CastExp |
                        PmExp '.*' CastExp

CastExp             ::
= UnaryExp |
                        '(' TypeId ')' CastExp

UnaryExp            ::
= PostfixExp |
                        '++' CastExp |
                        '--' CastExp |
                        UnaryOp CastExp
                        
PostfixExp          ::
= PrimaryExp |
                        PostfixExp '
[' Expression ']' |
                        PostfixExp '(' Expression ')' |
                        PostfixExp '(' 
[ ExpList ] ')' |
                        SimpleTypeSpec '(' 
[ ExpList ] ')' |
                        PostfixExp '++' |
                        PostfixExp '--'

PrimaryExp          ::
= Literal |
                        '(' Expression ')' |
                        IdExp

IdExp               ::
= UnqualifiedId

ExpList             ::
= AssigmentExp |
                        ExpList '
,' AssignmentExp
                        
//////////////////////////////
//Identifier
//////////////////////////////
DeclId              ::
= IdExp |
                        TypeName

UnqualifiedId       ::
= Identifier

Identifier          ::
= NonDigit |
                        Identifier NonDigit |
                        Identifier Digit

//////////////////////////////
//Literals
//////////////////////////////
Literal             ::
= IntLiteral |
                        FloatLiteral |
                        BoolLitreral

IntLiteral          ::
= DemicalLiteral

DemicalLiteral      ::
= NonZeroDigit |
                        DemicalLiteral | Digit
    
FloatLiteral        ::
= FracConstant [ExponentPart] |
                        DigitSeq ExponentPart
                        
BoolLiteral         ::
= 'false' |
                        'true'

FracConstant        ::
= [DigitSeq] '.' DigitSeq |
                        DigitSeq '.'
                        
ExponentPart        ::
= 'e' [Sign] DigitSeq |
                        'E' 
[Sign] DigitSeq
                        
DigitSeq            ::
= Digit |
                        DigitSeq Digit
                        
//////////////////////////
//Terminals
//////////////////////////

NonDigit            ::
= AlphaChar |
                        '_'

NonZeroDigit        ::
= '1' |  | '9'

AssignmentOp        ::
= '=' | 
                        '*
='  | '/='  | '%=' |
                        '+
='  | '-='  |
                        '>>
=' | '<<=' |
                        '&
='  | '^='  | '|='
Register
Semantic
Digit
AlphaChar
Keyword


有點(diǎn)兒參差不齊,哈哈。一些Terminator我就沒(méi)有寫(xiě)了。預(yù)處理的部分由于使用Boost.Wave,因此也沒(méi)有加入到EBNF中。這些都很大程度上簡(jiǎn)化了EBNF的內(nèi)容。
然后大概的根據(jù)層次歸了一下類,看起來(lái)要方便一點(diǎn)。
但愿語(yǔ)法樹(shù)里面沒(méi)有漏掉的。
等回到自己機(jī)器上就開(kāi)始自下向上的實(shí)現(xiàn)這個(gè)東西了,爭(zhēng)取10月份之前能把整個(gè)Shader編譯器集成到SoftArt里面去。
目前就讓它在SVN的SandBox里面待著好了。
posted @ 2008-07-25 02:25 空明流轉(zhuǎn) 閱讀(1989) | 評(píng)論 (7)編輯 收藏

最近在做Shader的編譯器。

想好了我的編譯器就叫SASL,SoftArt Shader Language。
因?yàn)橹皼](méi)寫(xiě)過(guò)EBNF,沒(méi)什么經(jīng)驗(yàn),因此找了C和C++的EBNF在參考。
特別是C的EBNF。
因?yàn)榭梢杂肔ALR(1)實(shí)現(xiàn),因此對(duì)我這樣用LEX + YACC的人而言就更加有用一點(diǎn)。
整體而言準(zhǔn)備盡可能和SM4.0一致,用Boost.Wave支持Preprocessing。
這樣的話差不多就全了。這兩天先把Shader的EBNF弄出來(lái),完了開(kāi)始從小往大寫(xiě)慢慢寫(xiě)語(yǔ)法分析器和編譯器。

http://www.externsoft.ch/download/cpp-iso.html

這里是C++的EBNF。有點(diǎn)太復(fù)雜了覺(jué)得。。。



posted @ 2008-07-25 00:11 空明流轉(zhuǎn) 閱讀(894) | 評(píng)論 (3)編輯 收藏

僅列出標(biāo)題
共12頁(yè): 1 2 3 4 5 6 7 8 9 Last 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            韩国成人精品a∨在线观看| 夜夜嗨一区二区三区| 国产精品日韩电影| 日韩一级精品| 性一交一乱一区二区洋洋av| 亚洲黄色一区| 亚洲免费伊人电影在线观看av| 欧美一区二区视频在线观看| 亚洲高清电影| 欧美日韩国产三区| 亚洲欧美日韩专区| 久久国产精品一区二区三区四区| 亚洲国产日韩精品| 亚洲国产精品电影| 欧美国产一区二区| 好吊色欧美一区二区三区四区| 亚洲高清中文字幕| 国产精品青草综合久久久久99 | 亚洲一区二区三区视频| 欧美日韩在线大尺度| 久久精品视频va| 国产欧美精品| 亚洲欧洲在线观看| 香蕉久久国产| 亚洲人www| 久久久久国产一区二区三区| 免费一区视频| 欧美一区二区在线观看| 亚洲六月丁香色婷婷综合久久| 日韩一区二区免费高清| 国产日韩欧美综合精品| 欧美黄色小视频| 国产欧美一区二区三区视频| 国产拍揄自揄精品视频麻豆| 亚洲国产欧美一区二区三区丁香婷| 欧美色123| 欧美国产专区| 一区精品在线| 亚洲资源在线观看| 在线亚洲欧美视频| 美女国产精品| 老司机免费视频久久| 国产日韩欧美制服另类| aa成人免费视频| 亚洲日本aⅴ片在线观看香蕉| 午夜精品偷拍| 亚洲制服丝袜在线| 欧美日韩一区精品| 亚洲高清在线| 亚洲国产精品成人综合| 久久精品91久久久久久再现| 羞羞答答国产精品www一本| 欧美视频一区二区三区四区| 亚洲日本中文字幕免费在线不卡| 欧美国产三级| 国产欧美日韩亚洲| 亚洲国产欧美日韩另类综合| 在线观看精品| 久久久久成人网| 久久综合成人精品亚洲另类欧美| 国产日韩欧美二区| 午夜在线视频一区二区区别| 香蕉免费一区二区三区在线观看| 国产精品电影在线观看| 在线亚洲国产精品网站| 亚洲欧美日韩精品综合在线观看| 欧美三级午夜理伦三级中视频| 日韩视频中文字幕| 亚洲欧美日韩区| 国产精品区二区三区日本 | 欧美激情一区二区三区在线视频观看 | 卡一卡二国产精品| 久久视频精品在线| 狠狠久久亚洲欧美专区| 欧美一区二区三区视频免费| 91久久久久久久久久久久久| 另类酷文…触手系列精品集v1小说| 男男成人高潮片免费网站| 亚洲成人在线免费| 欧美国产精品日韩| 一本大道久久a久久精品综合| 亚洲午夜伦理| 国产欧美日韩在线| 久久久久久69| 亚洲精品美女在线观看| 亚洲免费一级电影| 国产一二精品视频| 免费日韩成人| 在线观看不卡av| 欧美精品色网| 欧美一二三区在线观看| 免费试看一区| 亚洲尤物精选| 在线看视频不卡| 欧美午夜在线观看| 久久精品视频免费播放| 亚洲精品在线免费| 欧美伊久线香蕉线新在线| 亚洲黄色在线| 国产欧美精品| 欧美片在线播放| 午夜精品久久99蜜桃的功能介绍| 久久九九99| 一区二区三区精品在线 | 久久综合伊人77777尤物| 99精品视频免费观看视频| 久久蜜桃香蕉精品一区二区三区| 亚洲精品乱码久久久久久黑人 | 夜夜嗨av色一区二区不卡| 国产女主播一区二区| 欧美激情一区二区三区在线视频| 亚洲欧美一区二区在线观看| 亚洲高清不卡在线观看| 久久久久久一区二区三区| 中文欧美在线视频| 最新69国产成人精品视频免费| 国产精品亚洲综合| 欧美伦理在线观看| 久久性天堂网| 久久av一区二区三区漫画| 亚洲视频一起| 日韩亚洲欧美一区二区三区| 欧美成人亚洲| 美女精品国产| 久久综合99re88久久爱| 久久精品91| 久久精品人人做人人爽| 亚洲尤物在线视频观看| 一区二区三区四区蜜桃| 亚洲乱码国产乱码精品精 | 国产精品久久久久久模特 | 欧美电影免费网站| 久久久久久网址| 午夜欧美大尺度福利影院在线看| 在线亚洲欧美专区二区| 99精品免费视频| 日韩视频免费| 日韩小视频在线观看专区| 亚洲国产成人在线视频| 亚洲电影免费观看高清完整版在线 | 美女黄网久久| 久久久精品网| 久久久久国产成人精品亚洲午夜| 99这里只有精品| 日韩一级黄色片| 日韩午夜在线电影| 日韩午夜三级在线| 亚洲最新视频在线| 亚洲一区视频| 亚洲欧美在线高清| 久久成人国产| 久久久人成影片一区二区三区 | 亚洲深夜激情| 亚洲女ⅴideoshd黑人| 欧美一级视频免费在线观看| 欧美一区二区三区免费视| 久久国产精品久久w女人spa| 久久精品国产久精国产一老狼 | 亚洲午夜国产成人av电影男同| 亚洲一区二区精品| 欧美中文字幕在线观看| 麻豆精品91| 亚洲精品视频二区| 亚洲永久免费精品| 久久精品网址| 欧美日韩一区二区免费在线观看| 国产精品久久久一区二区三区| 国产精品亚洲综合久久| 亚洲成色www8888| 一区二区三区国产在线| 久久精品一区二区三区不卡| 欧美a级片网| 一区二区三区|亚洲午夜| 亚洲欧美久久久久一区二区三区| 久久久久久香蕉网| 欧美视频福利| 在线观看日韩av电影| 一本大道久久a久久精品综合| 欧美一区成人| 欧美福利视频网站| 亚洲欧美国产制服动漫| 蜜臀久久久99精品久久久久久| 欧美午夜视频一区二区| 亚洲国产高清在线| 久久成人人人人精品欧| 亚洲激情亚洲| 久久精品一区蜜桃臀影院| 欧美日韩一区在线播放| 亚洲国产精品123| 欧美在线观看一区| 99亚洲视频| 欧美不卡在线| 国产综合视频在线观看| 亚洲综合日韩在线| 亚洲国产日日夜夜| 久久不见久久见免费视频1| 国产精品av免费在线观看| 亚洲精品一区二| 免费观看日韩av| 欧美中文在线视频|