瀏覽代碼

Added String to Byte Ptr generation.
Improved iParser parsing of .i files, with initial values.
Fixed generation of functions with optional args.

woollybah 11 年之前
父節點
當前提交
ce46857334
共有 4 個文件被更改,包括 69 次插入23 次删除
  1. 26 3
      ctranslator.bmx
  2. 7 6
      expr.bmx
  3. 28 13
      iparser.bmx
  4. 8 1
      translator.bmx

+ 26 - 3
ctranslator.bmx

@@ -126,10 +126,19 @@ Type TCTranslator Extends TTranslator
 		If objParam Then
 		If objParam Then
 			t:+ objParam
 			t:+ objParam
 		End If
 		End If
-		For Local i:Int=0 Until args.Length
+		For Local i:Int=0 Until decl.argDecls.Length
 			If t t:+","
 			If t t:+","
-			t:+TransTemplateCast( TArgDecl(decl.argDecls[i].actual).ty,args[i].exprType,args[i].Trans() )
+			If i < args.length
+				t:+TransTemplateCast( TArgDecl(decl.argDecls[i].actual).ty,args[i].exprType,args[i].Trans() )
+			Else
+				decl.argDecls[i].Semant()
+				' default values
+				If decl.argDecls[i].init Then
+					t:+ decl.argDecls[i].init.Trans()
+				End If
+			End If
 		Next
 		Next
+		
 		Return Bra(t)
 		Return Bra(t)
 	End Method
 	End Method
 
 
@@ -196,6 +205,14 @@ Type TCTranslator Extends TTranslator
 	Method TransLocalDecl$( munged$,init:TExpr )
 	Method TransLocalDecl$( munged$,init:TExpr )
 		Return TransType( init.exprType, munged )+" "+munged+"="+init.Trans()
 		Return TransType( init.exprType, munged )+" "+munged+"="+init.Trans()
 	End Method
 	End Method
+
+	Method CreateLocal2$( ty:TType, t$ )
+		Local tmp:TLocalDecl=New TLocalDecl.Create( "", ty,Null )
+		MungDecl tmp
+		Emit TransType(ty, "") + " " + tmp.munged + " = bbStringToCString" + Bra(t)+ ";"
+		customVarStack.Push(tmp.munged)
+		Return tmp.munged
+	End Method
 	
 	
 	Method EmitPushErr()
 	Method EmitPushErr()
 		Emit "pushErr();"
 		Emit "pushErr();"
@@ -301,7 +318,7 @@ Type TCTranslator Extends TTranslator
 			Case "min", "max", "len", "asc", "chr"
 			Case "min", "max", "len", "asc", "chr"
 				Return TransBuiltin(decl, args)
 				Return TransBuiltin(decl, args)
 		End Select
 		End Select
-'If decl.ident = "stat_" DebugStop
+'If decl.ident = "Encode" DebugStop
 		Return TransStatic( decl )+TransArgs( args,decl )
 		Return TransStatic( decl )+TransArgs( args,decl )
 	End Method
 	End Method
 	
 	
@@ -467,6 +484,12 @@ Type TCTranslator Extends TTranslator
 				Return Bra(Bra(TransType(dst, "")) + "BBARRAYDATA(" + t + "," + t + "->dims)")
 				Return Bra(Bra(TransType(dst, "")) + "BBARRAYDATA(" + t + "," + t + "->dims)")
 			End If
 			End If
 			If TByteType( src) Return Bra("&"+t)
 			If TByteType( src) Return Bra("&"+t)
+			
+			If TStringType(src) Then
+				Local tmp:String = CreateLocal2(TType.bytePointerType, t)
+				
+				Return tmp
+			End If
 		EndIf
 		EndIf
 		
 		
 		Return TransPtrCast( dst,src,t,"dynamic" )
 		Return TransPtrCast( dst,src,t,"dynamic" )

+ 7 - 6
expr.bmx

@@ -737,13 +737,14 @@ Type TCastExpr Extends TExpr
 					exprType = ty
 					exprType = ty
 				End If
 				End If
 				Return Self
 				Return Self
-			Else
-				If TArrayType(src) Then
-					If TNumericType(TArrayType(src).elemType) Then
-						exprType = TNumericType(TArrayType(src).elemType).ToPointer()
-						Return Self
-					End If
+			Else If TArrayType(src) Then
+				If TNumericType(TArrayType(src).elemType) Then
+					exprType = TNumericType(TArrayType(src).elemType).ToPointer()
+					Return Self
 				End If
 				End If
+			Else If TStringType(src) Then
+				exprType = ty
+				Return Self
 			End If
 			End If
 		End If
 		End If
 		
 		

+ 28 - 13
iparser.bmx

@@ -719,9 +719,15 @@ Method ParseFuncDecl:TFuncDecl( toke$,attrs:Int )
 	'		init=ParseExpr()
 	'		init=ParseExpr()
 		Else
 		Else
 			ty=ParseDeclType(attrs)
 			ty=ParseDeclType(attrs)
+Rem
 			If CParse( "=" )
 			If CParse( "=" )
 				' TODO init=ParseExpr()
 				' TODO init=ParseExpr()
-				init = ParseUnaryExpr()
+				If CParse("$") Then
+					' string value
+					init = ParseUnaryExpr()
+				Else
+					init = ParseUnaryExpr()
+				End If
 				'DebugLog "TODO : ParseExpression"
 				'DebugLog "TODO : ParseExpression"
 			Else If CParse( "[" )
 			Else If CParse( "[" )
 				'Local ln:TExpr=ParseExpr()
 				'Local ln:TExpr=ParseExpr()
@@ -736,6 +742,7 @@ Method ParseFuncDecl:TFuncDecl( toke$,attrs:Int )
 			Else
 			Else
 				Err "Constants must be initialized."
 				Err "Constants must be initialized."
 			EndIf
 			EndIf
+End Rem
 		EndIf
 		EndIf
 		
 		
 		Local decl:TValDecl
 		Local decl:TValDecl
@@ -749,8 +756,8 @@ Method ParseFuncDecl:TFuncDecl( toke$,attrs:Int )
 		Else If attrs & DECL_LOCAL
 		Else If attrs & DECL_LOCAL
 			decl=New TLocalDecl.Create( id,ty,init,attrs )
 			decl=New TLocalDecl.Create( id,ty,init,attrs )
 		EndIf
 		EndIf
-		
-		If decl.IsExtern() 
+'DebugStop
+'		If decl.IsExtern() 
 			If CParse( "=" )
 			If CParse( "=" )
 				'decl.munged=ParseStringLit()
 				'decl.munged=ParseStringLit()
 				
 				
@@ -792,21 +799,29 @@ Method ParseFuncDecl:TFuncDecl( toke$,attrs:Int )
 						EndIf
 						EndIf
 					End If
 					End If
 				Else
 				Else
+'					init = ParseUnaryExpr()
+					
 					If ty = TType.stringType
 					If ty = TType.stringType
-						decl.munged=ParseStringLit()
+						If CParse("$") Then
+					init = ParseUnaryExpr()
+'							decl.init=New TConstExpr.Create(ty, ParseStringLit())
+						End If
 					Else
 					Else
 						' a default value ?
 						' a default value ?
 'DebugStop
 'DebugStop
-						Local value:String
-						'_toker.NextToke()
+					decl.init = ParseUnaryExpr()
+'					Local value:String
 						
 						
-						If CParse("-") Then
-							value = "-"
-							_toker.NextToke()
-						End If
+						'_toker.NextToke()
 						
 						
-						decl.init = New TConstExpr.Create(ty, value + _toker._toke)
+'						If CParse("-") Then
+'DebugStop
+'							value = "-"
+'							_toker.NextToke()
+'						End If
 						
 						
+'						decl.init = New TConstExpr.Create(ty, value + _toker._toke)
+'						_toker.NextToke()
 					End If
 					End If
 				End If
 				End If
 				
 				
@@ -815,8 +830,8 @@ Method ParseFuncDecl:TFuncDecl( toke$,attrs:Int )
 			Else
 			Else
 				decl.munged=decl.ident
 				decl.munged=decl.ident
 			EndIf
 			EndIf
-		EndIf
-	
+'		EndIf
+
 		Return decl
 		Return decl
 	End Method
 	End Method
 
 

+ 8 - 1
translator.bmx

@@ -15,6 +15,7 @@ Type TTranslator
 	Field mungScope:TMap=New TMap'<TDecl>
 	Field mungScope:TMap=New TMap'<TDecl>
 	Field mungStack:TStack=New TStack'< StringMap<TDecl> >
 	Field mungStack:TStack=New TStack'< StringMap<TDecl> >
 	Field funcMungs:TMap=New TMap'<FuncDeclList>
 	Field funcMungs:TMap=New TMap'<FuncDeclList>
+	Field customVarStack:TStack = New TStack
 
 
 	Field mungedScopes:TMap=New TMap'<StringSet>
 	Field mungedScopes:TMap=New TMap'<StringSet>
 '	Field funcMungs:=New StringMap<FuncDeclList>
 '	Field funcMungs:=New StringMap<FuncDeclList>
@@ -317,7 +318,7 @@ End Rem
 		Emit TransLocalDecl( tmp.munged,expr )+";"
 		Emit TransLocalDecl( tmp.munged,expr )+";"
 		Return tmp.munged
 		Return tmp.munged
 	End Method
 	End Method
-	
+
 	'***** Utility *****
 	'***** Utility *****
 
 
 	Method TransLocalDecl$( munged$,init:TExpr ) Abstract
 	Method TransLocalDecl$( munged$,init:TExpr ) Abstract
@@ -578,6 +579,12 @@ End Rem
 			Local t$=stmt.Trans()
 			Local t$=stmt.Trans()
 			If t Emit t+";"
 			If t Emit t+";"
 			
 			
+			Local v:String = String(customVarStack.Pop())
+			While v
+				Emit "bbMemFree" + Bra(v) + ";"
+				v = String(customVarStack.Pop())
+			Wend
+			
 		Next
 		Next
 		Local r:Int=unreachable
 		Local r:Int=unreachable
 		unreachable=False
 		unreachable=False