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


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

            評論

            # re: SoftArt Shader Language Syntax EBNF 2008-07-25 14:10 亨德列克
            老吳,我很佩服你,你真牛  回復(fù)  更多評論
              

            # re: SoftArt Shader Language Syntax EBNF 2008-07-26 20:57 cexer
            沒有看明白呢。。。  回復(fù)  更多評論
              

            # re: SoftArt Shader Language Syntax EBNF 2008-11-29 04:35 肥仔
            文法好寫,也好理解,但文法之后的事情才叫難于上青天,借助YACC解析代碼生成一顆語法樹就非常頭痛了,剩下的符號提取,解釋器,語法樹運(yùn)算更不用說了。
            我找過很多yacc的文章,但還來沒有發(fā)現(xiàn)過中國誰用它真正實現(xiàn)了一個腳本引擎的。可見難度之不低。  回復(fù)  更多評論
              

            # re: SoftArt Shader Language Syntax EBNF 2008-11-30 20:25 空明流轉(zhuǎn)
            @肥仔
            難度不高,但是麻煩的不輕。  回復(fù)  更多評論
              

            # re: SoftArt Shader Language Syntax EBNF 2008-12-20 00:28 gatt
            不知道你有沒有看過現(xiàn)代編譯原理:C語言描述,我覺得他里面的項目難度太大了,書本也說得不太清楚,我只完成了語義分析,后面的無從下手  回復(fù)  更多評論
              

            # re: SoftArt Shader Language Syntax EBNF 2008-12-20 10:46 空明流轉(zhuǎn)
            @gatt
            我語法的部分還沒有做完。
            不過我看了看其他版本的編譯原理,也還好。  回復(fù)  更多評論
              

            # re: SoftArt Shader Language Syntax EBNF 2009-05-26 17:06 李錦俊
            空明你意思是又要我跟著學(xué)一門shader語言了,我快掛了~~~~~~~  回復(fù)  更多評論
              


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


            久久无码一区二区三区少妇| 69久久精品无码一区二区| 精品久久久久久无码专区不卡 | 久久久久国色AV免费观看| av无码久久久久不卡免费网站 | 亚洲中文久久精品无码| 无码人妻少妇久久中文字幕| 久久久受www免费人成| 久久影院亚洲一区| 久久久久一级精品亚洲国产成人综合AV区 | 麻豆一区二区99久久久久| 伊人久久无码中文字幕| 一本一本久久A久久综合精品| 亚洲午夜久久久| 亚洲香蕉网久久综合影视| 久久精品中文字幕无码绿巨人| 欧美黑人又粗又大久久久| 久久99精品国产99久久| 久久久综合香蕉尹人综合网| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 久久国产乱子精品免费女| 91性高湖久久久久| 久久久久免费视频| 久久精品国产亚洲AV忘忧草18| 久久亚洲中文字幕精品有坂深雪| 波多野结衣中文字幕久久| 亚洲国产精品婷婷久久| 亚洲午夜精品久久久久久app| 久久久精品国产sm调教网站| 99久久精品免费国产大片| 久久精品国产亚洲av麻豆蜜芽 | 亚洲日韩中文无码久久| 国产精品久久久久aaaa| 色综合久久中文字幕综合网| 国产精品对白刺激久久久| 久久久久一本毛久久久| 久久精品九九亚洲精品| 亚洲午夜福利精品久久| 国产精品欧美亚洲韩国日本久久| 久久久久久曰本AV免费免费| 国产精品综合久久第一页|