• <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>

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

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

            #

            今天群里面正好有朋友問起這個問題,就簡單的解答下,如果有問題的話,歡迎大家留言批評指正。

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

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

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

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


            沒啥好說的,沒什么技術含量,就是有點用,功能類似于VA X的#ifndef guard.
            生成的格式按照 PROJECTNAME_FILENAME_FILEEXTNAME_GUID 來的。
            比方說我的就是

            SPIRIT_SASL_AST_NODE_STATEMENT_H_B530FB44_F5C8_431F_A250_E426F791B7CF

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

            語言是VB.NET.

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

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

            最近用了一段時間的wxWidgets。
            基本上主流的界面庫也就算用的差不多了。
            這里拿一個表格對這些界面庫做一個比較直觀的比較。

            界面庫名稱
            接口設計
            界面編輯器
            高級布局功能
            平面繪制
            平臺兼容性
            語言支持
            IDE兼容性
            視圖-模型分離機制
            運行時
            其它
            Windows Forms
            接口優(yōu)秀。C++下使用CLI擴展,其它語言為原生支持。
            界面編輯器完整,包括布局、屬性、消息關聯(lián)的完整設置。不可預覽。
            Table Layout,Splitter Layout,F(xiàn)low Layout等,Anchor和Dock機制。多分辨率界面下表現(xiàn)良好。
            GDI+,面向?qū)ο蟮?D繪制接口,使用簡便。
            需要.Net平臺支持。WIndows或Linux(Mono,非官方支持),支持Windows CE
            C++/CLI, 支持.net的語言。
            僅VS。
            布局和視圖方案建立在代碼中。部分組件支持Model-View架構。
            需要部署對應的.net
            商業(yè)協(xié)議
            MFC
            基于宏和虛函數(shù),使用特殊格式注釋,使用自定義的RTTI系統(tǒng)。類接口設計優(yōu)良。通過回調(diào)函數(shù)和虛繼承重載調(diào)用客戶代碼。
            基于資源編輯器,僅能對空間基本布局和少量屬性進行調(diào)整。不可預覽。
            缺乏高級布局功能,多分辨率需要是手工或程序中調(diào)整。
            GDI及GDI封裝,可選GDI+
            Windows,Windows CE
            C++ Only,
            支持COM時可以實現(xiàn)Binary級別復用。
            僅Visual Studio
            使用資源保存控件的基本控件布局,提供Doc-View機制和控件數(shù)據(jù)交換支持視圖分離。
            需要部署MFC運行時庫。
            商業(yè)協(xié)議
            WTL
            基于模板和虛函數(shù)。類接口類似于MFC。需要使用多重繼承。通過模板特化和回調(diào)函數(shù)與客戶代碼交互。
            同MFC
            同MFC
            同MFC
            同MFC
            同MFC,對COM的支持比MFC完善很多。
            Visual Studio,Windows下支持標準的C++編譯器。
            使用資源文件保存空間布局。

            自由協(xié)議
            wxWidget
            宏,自定義RTTI。使用回調(diào)函數(shù)與用戶代碼交互。
            無官方界面編輯器。可使用第三方界面編輯器。部分編輯器具有完整的所見即所得功能,且具有預覽能力。
            使用Sizer實現(xiàn)多分辨率的布局。功能偏弱。
            wxDC等。
            Windows,Linux,Unix,MacOS等
            C++, .NET, Python,
            Lua,
            Ruby等
            良好的編譯器兼容性,缺乏IDE繼承。
            可以將界面屬性生成到代碼中,也可以使用XML格式保存。
            wx的動態(tài)鏈接庫或靜態(tài)鏈接。
            自由協(xié)議
            Qt
            使用宏和自定義的RTTI。使用Singal-Slot機制實現(xiàn)用戶代碼交互。可通過繼承實現(xiàn)擴展。
            Qt Designer,具備完整的所見即所得編輯功能。可預覽界面。
            具備完整的布局功能。多分辨率/多平臺下表現(xiàn)良好。
            QCanvas等。
            Windows,Linux,Unix,MacOS等。
            C++,Python等
            可集成到Eclipse和VS
            使用資源文件保存界面信息。部分組件具備Model-View-Delegate架構
            qt的動態(tài)鏈接庫。
            開源協(xié)議+商業(yè)協(xié)議
            GTK+
            使用signal-slot機制完成用戶代碼交互。
            GLADE,具備所見即所得的界面編輯功能
            Layout Containers,具備較完整的布局能力。
            GTK Graphics Context
            Windows,Linux,Unix,MacOS等。 C,C++,Python,.NET等。
            (暫時未知)
            使用代碼完成界面設置。部分組件具備Model-View架構。
            GTK Runtime
            開源協(xié)議

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

            如果為了一個Flex和Bison就下整個MSYS和Cygwin我覺得有點太夸張了。
            不過為了提個可用的新版本花了我兩個晚上。麻煩死了。
            我估計還有人也會覺得很麻煩。
            所以就把這個下載放上來,在win下面可以獨立運行的,不過最好把bin目錄設置到Path中。

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

            其實我還改了下FlexLexer.h,不知道為什么我的那個會有redefine的編譯錯誤,mingw gcc432(tdm版)。
            VS下面沒有運行過,不過應該沒問題。
            也不知道我修的是對是錯,還請高人指點。

            @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) 閱讀(3226) | 評論 (0)編輯 收藏

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

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

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

            一般來講如果只是一個源盤和一個目標盤,用Beyond Compare或者類似的工具就能解決問題。
            不過現(xiàn)在是多對多的,問題就變得比較復雜。

            因此我就做了這么個東西,可以將多個目錄組成虛擬的文件樹再進行比較。
            文件夾的對應關系直接利用同級文件夾的名稱來判斷
            我也提供了手工設置文件夾對應關系的功能,不過因為UI方面還沒考慮好所以沒有加上。

            文件之間的比較利用兩種方案,一種方案在文件被計算過MD5效驗的時候直接使用MD5比較
            如果沒有MD5的話使用文件大小和最后修改時間比較
            由于文件比較不使用文件名,也就獲得不了對應關系,因此目錄樹下面的所有文件的所有組合都要一一遍歷。
            同時由于計算MD5效驗碼需要讀取整個文件,時間較長,因此Checksum是需要手動計算和刷新的。

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

            Download Source Code Project,VS2005 / VS2005 SP1, XP SP2/SP3下通過。



            屏幕快照。紅色表示新增文件,藍色表示相同文件,黃色表示不完全對應。

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

            呃,怎么說呢,這個和vczh的同名文章是互為補充的。這是最近老板的要求,所以就寫了這么個東西。

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

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


            布局分為水平布局和豎直布局兩個部分,我這里先進行了水平布局再進行了豎直布局。

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

            為了讓節(jié)點在布局的時候知道自己能被安排的最左位置,需要為每一層保存最左可布局位置的坐標。
            一旦有節(jié)點被安排妥當,便更新節(jié)點所在層次的最左可布局位置。后來的節(jié)點只要在這個位置的右方布局,就不會與已布置的節(jié)點沖突。

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

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

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

            /****
             *  void Layout(int lyr)
             *  {
             *     
             *  }
             * 
            ****
            */
            namespace CrowdTree
            {
                
            class LayoutTreeLayerInfo
                {
                    
            //可安排布局的最左坐標
                    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()
                    {
                        
            //獲取當前節(jié)點能夠排布的最左位置,并預先安排當前節(jié)點。
                        float originLeft = lyrInfo_.GetLayoutableLeft(lyrLevel_);
                        rect_.X 
            = originLeft;

                        
            //根據(jù)當前結(jié)點的坐標,安排子結(jié)點,并需要根據(jù)子結(jié)點的安置情況重新調(diào)整父節(jié)點的安置
                        if (children_.Count > 0)
                        {
                            
            //計算子結(jié)點最左可以安放的位置
                            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);

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

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

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

                        
            //利用節(jié)點坐標設置該層其他子結(jié)點所能安放的最左位置,并設置一下當前層元素的最大高度
                        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) 閱讀(1593) | 評論 (2)編輯 收藏

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

            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


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

            最近在做Shader的編譯器。

            想好了我的編譯器就叫SASL,SoftArt Shader Language。
            因為之前沒寫過EBNF,沒什么經(jīng)驗,因此找了C和C++的EBNF在參考。
            特別是C的EBNF。
            因為可以用LALR(1)實現(xiàn),因此對我這樣用LEX + YACC的人而言就更加有用一點。
            整體而言準備盡可能和SM4.0一致,用Boost.Wave支持Preprocessing。
            這樣的話差不多就全了。這兩天先把Shader的EBNF弄出來,完了開始從小往大寫慢慢寫語法分析器和編譯器。

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

            這里是C++的EBNF。有點太復雜了覺得。。。



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

            僅列出標題
            共12頁: 1 2 3 4 5 6 7 8 9 Last 
            国内精品久久国产大陆| 精品人妻伦九区久久AAA片69| 久久久青草青青亚洲国产免观| 久久妇女高潮几次MBA| 久久久久香蕉视频| 亚洲嫩草影院久久精品| 91久久精品91久久性色| 久久天天躁狠狠躁夜夜avapp| 久久久久亚洲精品日久生情| 中文字幕无码av激情不卡久久| 日韩电影久久久被窝网| 久久久久久久综合狠狠综合| 伊人色综合久久天天人守人婷| 中文精品99久久国产| 国内精品伊人久久久影院| 伊人情人综合成人久久网小说| 青青久久精品国产免费看| 精品久久久久久久国产潘金莲| 久久人与动人物a级毛片| 亚洲欧美一级久久精品| 波多野结衣久久一区二区| 亚洲国产精品久久久天堂| 久久国产精品成人片免费| 国产Av激情久久无码天堂| 久久99精品久久久久久| 精品国产91久久久久久久a| 老司机午夜网站国内精品久久久久久久久 | 99精品久久久久久久婷婷| 国产成人久久精品麻豆一区| 久久久精品国产亚洲成人满18免费网站| 狠狠久久综合伊人不卡| 久久久久久久综合狠狠综合| 亚洲精品午夜国产VA久久成人| 国产人久久人人人人爽| 精品久久久久久久久久久久久久久| 一级做a爰片久久毛片看看 | 久久综合亚洲欧美成人| 青青草原1769久久免费播放| 欧美成a人片免费看久久| 色欲久久久天天天综合网精品| 久久精品国产免费|