%{ #include #include "lexical.h" #include "newtonBinding.h" %} %token _INT %token _CHAR %token _VOID %token _CONST %token _SHORT %token _UNSIGNED %token _FLOAT %token _DFLOAT %token _DOUBLE %token _DFLOAT64 %token _STRUCT %token _UNION %token _EXTERN %token _TYPEDEF %token _IFDEF %token _IFNDEF %token _ELSE %token _ENDIF %token _DEFINE %token _INCLUDE %token _NUMERIC_CONSTANT %token _LITERAL_IDENTIFIER %token _QUOTED_CONSTANT %left '=' %left '+' '-' %left '*' '/' %left _NEG %start NewtonHeader %% NewtonHeader : _IFNDEF _LITERAL_IDENTIFIER newtonWorldInterface _ENDIF ; newtonWorldInterface : engineDefine engineVersion condiotinalDeclarationList ; engineDefine : _DEFINE _LITERAL_IDENTIFIER ; engineVersion : engineMayorVersion engineMinorVersion { ((NewtonBinding*)this)->EngineVersion ($1.GetString(), $2.GetString()); ((NewtonBinding*)this)->BlockEnd(); ((NewtonBinding*)this)->DeclareDataType ("float", "double"); ((NewtonBinding*)this)->BlockEnd(); } ; engineMayorVersion : _DEFINE _LITERAL_IDENTIFIER _NUMERIC_CONSTANT {$$ = $3;} ; engineMinorVersion : _DEFINE _LITERAL_IDENTIFIER _NUMERIC_CONSTANT {$$ = $3;} ; condiotinalDeclarationList : condiotinalDeclaration | condiotinalDeclarationList condiotinalDeclaration ; condiotinalIF : _IFDEF | _IFNDEF ; condiotinalDeclaration : condiotinalIF _DFLOAT condiotinalBlock _ENDIF | condiotinalIF _DFLOAT64 condiotinalBlock _ENDIF | condiotinalIF _LITERAL_IDENTIFIER condiotinalBlock _ENDIF | condiotinalIF _LITERAL_IDENTIFIER condiotinalBlock _ELSE condiotinalBlock _ENDIF ; condiotinalBlock : _DEFINE _LITERAL_IDENTIFIER | _DEFINE _DFLOAT _FLOAT | _DEFINE _DFLOAT _DOUBLE | _DEFINE _DFLOAT64 _DOUBLE | _DEFINE _LITERAL_IDENTIFIER _LITERAL_IDENTIFIER | _EXTERN _QUOTED_CONSTANT '{' _ENDIF statementBlock _IFDEF _LITERAL_IDENTIFIER '}' | _DEFINE _LITERAL_IDENTIFIER _LITERAL_IDENTIFIER '(' _LITERAL_IDENTIFIER ')' | _DEFINE _LITERAL_IDENTIFIER _LITERAL_IDENTIFIER '(' '(' _LITERAL_IDENTIFIER '('_QUOTED_CONSTANT ')' ')' ')' | condiotinalDeclaration ; statementBlock : constantDefinitionList internalEngineStructList engineStructList engineCallbackList enginefunctionsList ; constantDefinition : _DEFINE _LITERAL_IDENTIFIER _NUMERIC_CONSTANT { ((NewtonBinding*)this)->ConstantDefinition ($2.GetString(), $3.GetString()); } ; internalEngineStruct : _TYPEDEF _STRUCT _LITERAL_IDENTIFIER '{' '}' _LITERAL_IDENTIFIER ';' {((NewtonBinding*)this)->InternalEngineStruct ($3.GetString());} ; engineStructList : engineStruct | engineStructList engineStruct ; engineStruct : engineStructBegin structDataDeclarationList '}' ';' {((NewtonBinding*)this)->StructDeclareEnd(); ((NewtonBinding*)this)->BlockEnd();} ; engineStructBegin : _STRUCT _LITERAL_IDENTIFIER '{' {((NewtonBinding*)this)->StructDeclareStart ($2.GetString());} ; intrinsicType : _INT {$$ = $1;} | _CHAR {$$ = $1;} | _VOID {$$ = $1;} | _SHORT {$$ = $1;} | _DFLOAT {$$ = $1;} | _DFLOAT64 {$$ = $1;} | _UNSIGNED {$$ = $1;} | _UNSIGNED _INT {$$ = $1; $$.m_data = $1.m_data + $2.m_data;} | _UNSIGNED _CHAR {$$ = $1; $$.m_data = $1.m_data + $2.m_data;} | _UNSIGNED _SHORT {$$ = $1; $$.m_data = $1.m_data + $2.m_data;} | _SHORT _INT {$$ = $1; $$.m_data = $1.m_data + $2.m_data;} ; genericDataType: : intrinsicType {$$ = $1;} | intrinsicType '*' {$$ = $1; $$.m_data = $1.m_data + $2.m_data;} | _LITERAL_IDENTIFIER {$$ = $1;} | _LITERAL_IDENTIFIER '*' {$$ = $1; $$.m_data = $1.m_data + $2.m_data;} | _CONST _LITERAL_IDENTIFIER '*' {$$ = $1; $$.m_data = $1.m_data + ' ' + $2.m_data + $3.m_data;} ; arrayType : '[' _NUMERIC_CONSTANT ']' { $$ = $1; $$.m_data = $1.m_data + $2.m_data + $3.m_data;} ; arrayTypeList : arrayType {$$ = $1;} | arrayTypeList arrayType {$$ = $1; $$.m_data = $1.m_data + $2.m_data;} ; structDataName : _LITERAL_IDENTIFIER {$$ = $1;} | _LITERAL_IDENTIFIER arrayTypeList {$$ = $1; $$.m_data = $1.m_data + $2.m_data;} ; unionBegin : _UNION '{' {((NewtonBinding*)this)->StructNameLessUnion ();} ; unionType : unionBegin structDataDeclarationList '}' ';' {((NewtonBinding*)this)->StructDeclareEnd();} ; structDataDeclaration : genericDataType structDataName ';' {((NewtonBinding*)this)->StructAddDataType ($1.GetString(), $2.GetString());} | unionType ; structDataDeclarationList : structDataDeclaration | structDataDeclarationList structDataDeclaration ; argumentTypeName : intrinsicType {$$ = $1;} | _LITERAL_IDENTIFIER {$$ = $1;} ; dereference : '*' {$$ = $1;} | '*' '*' {$$ = $1; $$.m_data = $1.m_data + $2.m_data;} ; functionArgumentType : argumentTypeName {$$ = $1;} | argumentTypeName dereference {$$ = $1; $$.m_data = $1.m_data + $2.m_data;} | argumentTypeName dereference _CONST {$$ = $1; $$.m_data = $1.m_data + $2.m_data + " " + $3.m_data;} | _CONST argumentTypeName dereference {$$ = $1; $$.m_data = $1.m_data + " " + $2.m_data + $3.m_data;} | _CONST argumentTypeName dereference _CONST {$$ = $1; $$.m_data = $1.m_data + " " + $2.m_data + $3.m_data + " " + $4.m_data;} ; callbackArgument : functionArgumentType _LITERAL_IDENTIFIER {((NewtonBinding*)this)->FunctionArgument ($1.m_data, $2.m_data);} ; callbackArgumentSeparator : ',' {((NewtonBinding*)this)->FunctionArgumentSeparator();} ; functionsArgumentList : callbackArgument | functionsArgumentList callbackArgumentSeparator callbackArgument ; engineCallbackBegin : _TYPEDEF genericDataType '(' '*' _LITERAL_IDENTIFIER ')' {((NewtonBinding*)this)->FunctionCallbackDeclaration ($2.m_data, $5.m_data);} ; engineCallback : engineCallbackBegin '(' functionsArgumentList ')' ';' {((NewtonBinding*)this)->FunctionDeclarationEnd ();} | engineCallbackBegin '(' ')' ';' {((NewtonBinding*)this)->FunctionDeclarationEnd ();} ; enginefunctionBegin : _LITERAL_IDENTIFIER genericDataType _LITERAL_IDENTIFIER {((NewtonBinding*)this)->FunctionDeclaration ($2.m_data, $3.m_data);} ; enginefunction : enginefunctionBegin '(' functionsArgumentList ')' ';' {((NewtonBinding*)this)->FunctionDeclarationEnd ();} | enginefunctionBegin '(' ')' ';' {((NewtonBinding*)this)->FunctionDeclarationEnd ();} ; recursiveEngineCallbackList : engineCallback | recursiveEngineCallbackList engineCallback ; recursiveEnginefunctionsList : enginefunction | recursiveEnginefunctionsList enginefunction ; recursiveConstantDefinitionList : constantDefinition | recursiveConstantDefinitionList constantDefinition ; recursiveInternalEngineStructList : internalEngineStruct | recursiveInternalEngineStructList internalEngineStruct ; engineCallbackList : recursiveEngineCallbackList {((NewtonBinding*)this)->BlockEnd();} ; enginefunctionsList : recursiveEnginefunctionsList {((NewtonBinding*)this)->BlockEnd();} ; constantDefinitionList : recursiveConstantDefinitionList {((NewtonBinding*)this)->BlockEnd();} ; internalEngineStructList : recursiveInternalEngineStructList {((NewtonBinding*)this)->BlockEnd();} ; %%