經(jīng)過一晚上的整理,把 SoftArt Shader Language 的 EBNF 弄出來了。
主要參照的是 ISO C++的EBNF 。
由于ISO C++并不是一個LALR(1)能夠解決的問題,因此不知道這個C++ EBNF的簡化版能否在YACC上比較方便的實現(xiàn)。
如果不能實現(xiàn),我會先考慮修正語法滿足需要,而不是手寫編譯器,我還沒那個能耐。
Flex 與 Bison 的 下載地址
有點(diǎn)兒參差不齊,哈哈。一些Terminator我就沒有寫了。預(yù)處理的部分由于使用Boost.Wave,因此也沒有加入到EBNF中。這些都很大程度上簡化了EBNF的內(nèi)容。
然后大概的根據(jù)層次歸了一下類,看起來要方便一點(diǎn)。
但愿語法樹里面沒有漏掉的。
等回到自己機(jī)器上就開始自下向上的實現(xiàn)這個東西了,爭取10月份之前能把整個Shader編譯器集成到SoftArt里面去。
目前就讓它在SVN的SandBox里面待著好了。
主要參照的是 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
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' |

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里面待著好了。