• <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++博客 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
              118 Posts :: 3 Stories :: 413 Comments :: 0 Trackbacks
            經(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),看起來(lái)要方便一點(diǎn)。
            但愿語(yǔ)法樹(shù)里面沒(méi)有漏掉的。
            等回到自己機(jī)器上就開(kāi)始自下向上的實(shí)現(xiàn)這個(gè)東西了,爭(zhēng)取10月份之前能把整個(gè)Shader編譯器集成到SoftArt里面去。
            目前就讓它在SVN的SandBox里面待著好了。
            posted on 2008-07-25 02:25 空明流轉(zhuǎn) 閱讀(1968) 評(píng)論(7)  編輯 收藏 引用

            評(píng)論

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

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

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

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

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

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

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


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


            国产精品九九久久免费视频| a高清免费毛片久久| 97久久精品人人澡人人爽| 漂亮人妻被黑人久久精品| 久久久无码精品亚洲日韩蜜臀浪潮 | 久久国产视屏| 国产伊人久久| 国产农村妇女毛片精品久久| 国产叼嘿久久精品久久| 91亚洲国产成人久久精品| 久久综合久久综合久久| 久久婷婷久久一区二区三区| 一本一道久久精品综合| 国产精品亚洲综合专区片高清久久久 | 国产精品久久久久jk制服| 日韩人妻无码精品久久久不卡 | 97超级碰碰碰久久久久| 久久精品国产网红主播| 精品久久香蕉国产线看观看亚洲| 久久se精品一区精品二区| 亚洲国产精品婷婷久久| 国产农村妇女毛片精品久久| 久久精品无码av| 国内精品久久久久影院亚洲| 天堂久久天堂AV色综合| 久久免费国产精品一区二区| 久久久精品人妻无码专区不卡| 亚洲性久久久影院| 久久婷婷国产综合精品| 久久99国产精品久久久| 亚洲国产成人精品女人久久久 | 四虎国产精品成人免费久久| 久久综合九色综合网站| 久久婷婷五月综合国产尤物app| 国产精品久久久久久一区二区三区 | 久久精品无码一区二区app| 久久天天躁夜夜躁狠狠躁2022 | 国产精品久久久香蕉| 精品久久香蕉国产线看观看亚洲 | 99久久精品午夜一区二区| 精品免费久久久久国产一区|