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

            歲月流轉,往昔空明

            C++博客 首頁 新隨筆 聯系 聚合 管理
              118 Posts :: 3 Stories :: 413 Comments :: 0 Trackbacks
            經過一晚上的整理,把 SoftArt Shader Language 的 EBNF 弄出來了。
            主要參照的是 ISO C++的EBNF
            由于ISO C++并不是一個LALR(1)能夠解決的問題,因此不知道這個C++ EBNF的簡化版能否在YACC上比較方便的實現。
            如果不能實現,我會先考慮修正語法滿足需要,而不是手寫編譯器,我還沒那個能耐。

            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的內容。
            然后大概的根據層次歸了一下類,看起來要方便一點。
            但愿語法樹里面沒有漏掉的。
            等回到自己機器上就開始自下向上的實現這個東西了,爭取10月份之前能把整個Shader編譯器集成到SoftArt里面去。
            目前就讓它在SVN的SandBox里面待著好了。
            posted on 2008-07-25 02:25 空明流轉 閱讀(1968) 評論(7)  編輯 收藏 引用

            評論

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

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

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

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

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

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

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

            久久久久久免费一区二区三区| 色婷婷久久综合中文久久蜜桃av | 少妇久久久久久被弄到高潮 | 手机看片久久高清国产日韩| 香蕉aa三级久久毛片| 无码伊人66久久大杳蕉网站谷歌| 久久精品中文无码资源站 | 奇米综合四色77777久久| 精品久久一区二区三区| 久久久免费观成人影院 | 青青久久精品国产免费看| 久久久精品人妻一区二区三区四| 99久久国产综合精品成人影院| 亚洲欧美日韩精品久久亚洲区| 精品无码久久久久国产| 久久精品国产99久久久香蕉| 亚洲精品无码久久久久久| 国产精品午夜久久| 精品久久久久久久无码| 久久久久久午夜精品| 精品久久国产一区二区三区香蕉 | 久久精品国产99久久久香蕉| 996久久国产精品线观看| 久久婷婷是五月综合色狠狠| 亚洲国产精品久久久久| 久久精品国产亚洲AV嫖农村妇女| 久久精品综合网| 亚洲国产精品无码久久九九| 久久精品成人一区二区三区| 久久精品国产秦先生| 99久久国产热无码精品免费| 少妇精品久久久一区二区三区| 性做久久久久久免费观看| 狠狠色丁香婷婷综合久久来来去| 精品国产91久久久久久久| 99re久久精品国产首页2020| 久久国产精品77777| 久久福利青草精品资源站| 99久久精品国产高清一区二区| 久久精品国产亚洲77777| 人妻精品久久久久中文字幕69|