Bläddra i källkod

Implemented iface support for enums.

woollybah 6 år sedan
förälder
incheckning
007a32d816
2 ändrade filer med 104 tillägg och 2 borttagningar
  1. 30 1
      ctranslator.bmx
  2. 74 1
      iparser.bmx

+ 30 - 1
ctranslator.bmx

@@ -5379,6 +5379,26 @@ End Rem
 		Emit g
 	End Method
 
+	Method EmitIfcEnumDecl(enumdecl:TEnumDecl)
+		enumDecl.Semant
+		
+		Local e:String = enumDecl.ident + "/" + TransIfcType(enumDecl.ty)
+
+		Emit e + "{", False
+		
+		For Local val:TEnumValueDecl = EachIn enumDecl.values
+			Emit val.ident + "=" + val.Value()
+		Next
+		
+		Local flags:String
+		If enumDecl.isFlags Then
+			flags = "F"
+		End If
+		
+		Emit "}" + flags + "=" + Enquote(enumDecl.munged), False
+
+	End Method
+	
 	Method EmitModuleInclude(moduleDecl:TModuleDecl, included:TMap = Null)
 		If moduleDecl.filepath Then
 			' a module import
@@ -6298,7 +6318,16 @@ End If
 				EmitIfcGlobalDecl(gdecl)
 			End If
 		Next
-
+		
+		' enums
+		For Local decl:TDecl=EachIn app.Semanted()
+			If decl.IsPrivate() Continue
+			
+			Local edecl:TEnumDecl=TEnumDecl( decl )
+			If edecl And Not edecl.declImported
+				EmitIfcEnumDecl(edecl)
+			End If
+		Next
 	End Method
 	
 	Method TransDef(app:TAppDecl)

+ 74 - 1
iparser.bmx

@@ -446,7 +446,27 @@ Type TIParser
 
 						'state = STATE_CLASS
 						'Exit
-				'	Case "%"
+				Case "/"
+					toker.rollback(pos)
+					toker.NextToke()
+
+					Local enumDecl:TEnumDecl = ParseEnumDecl( stm )
+					enumDecl.declImported = True
+					
+					If CParse("F") Then
+						enumDecl.isFlags = True
+					End If
+					
+					Parse("=")
+				
+					If _tokeType <> TOKE_STRINGLIT Then
+						Err "Syntax error - unexpected token '" + _toke + "'"
+					End If
+					
+					enumDecl.munged = BmxUnquote(_toke)
+					
+					_mod.InsertDecl(enumDecl)
+								
 				Default
 					If toker._tokeType = TOKE_EOF
 						Exit
@@ -763,6 +783,59 @@ Type TIParser
 
 	End Method
 
+	Method ParseEnumDecl:TEnumDecl( toke$ )
+		SetErr
+
+		Local id$=ParseIdent()
+		Local ty:TType
+		Local attrs:Int
+
+		Parse( "/" )
+		ty=ParseDeclType(attrs, False)
+
+		Local enumDecl:TEnumDecl=New TEnumDecl.Create( id, ty, False, Null )
+		
+		Local index:Int
+		Repeat
+			SkipEols
+			
+			Select _toker._toke
+			Case "{"
+				NextToke
+			Case "}"
+				NextToke
+				Exit
+			Default
+				
+				Local decl:TEnumValueDecl = ParseEnumValueDecl(_toke, index, ty)
+				enumDecl.InsertDecl decl
+				
+				enumDecl.values :+ [decl]
+				
+				index :+ 1
+			End Select
+			
+		Forever
+		
+		Return enumDecl
+
+	End Method
+	
+	Method ParseEnumValueDecl:TEnumValueDecl(toke:String, index:Int, enumTy:TType)
+
+		Local id:String = ParseIdent()
+		
+		Parse("=")
+
+		Local expr:TExpr = New TConstExpr.Create( enumTy.Copy(), _toke )
+
+		Local valDecl:TEnumValueDecl = New TEnumValueDecl.Create(id, index, expr)		
+		
+		NextToke
+		
+		Return valDecl
+	End Method
+	
 	Method Parse( toke$ )
 		If Not CParse( toke )
 			Err "Syntax error - expecting '"+toke+"'."