• <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ǔ)法滿(mǎn)足需要,而不是手寫(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) 閱讀(1970) 評(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è)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久久久亚洲Av无码专| 国产精品99久久久久久猫咪 | 国产精品中文久久久久久久| 久久精品国产99国产精品澳门 | 久久人人爽人人爽人人片AV高清 | 久久久久人妻一区二区三区vr| 亚洲欧洲久久久精品| 狠狠色综合久久久久尤物| 久久国产亚洲精品麻豆| 狠狠色婷婷综合天天久久丁香 | 久久天天躁狠狠躁夜夜2020老熟妇| 日产精品久久久一区二区| 久久久久免费精品国产| 久久99精品久久久大学生| 久久国产免费直播| 久久精品无码一区二区WWW| 狠狠色丁香久久婷婷综合_中| 亚洲国产成人乱码精品女人久久久不卡 | 国产人久久人人人人爽 | 久久成人国产精品二三区| 国产韩国精品一区二区三区久久| 久久91精品国产91久久户| 久久最近最新中文字幕大全| 99久久国产综合精品网成人影院| 国产福利电影一区二区三区久久久久成人精品综合 | 国内精品伊人久久久久影院对白| 超级碰久久免费公开视频| 久久久久国产亚洲AV麻豆| 天天影视色香欲综合久久| 久久精品国产男包| 精品久久8x国产免费观看| 中文精品久久久久国产网址| 狠狠人妻久久久久久综合| 色综合久久中文字幕综合网| 国产69精品久久久久APP下载| 午夜不卡久久精品无码免费| 久久国产乱子伦免费精品| 久久精品二区| 精品无码久久久久国产动漫3d| 人妻少妇久久中文字幕| 国产巨作麻豆欧美亚洲综合久久 |