浏览代码

Added WIP -geninfo support.

Mark Sibly 9 年之前
父节点
当前提交
6de741df0a
共有 2 个文件被更改,包括 303 次插入7 次删除
  1. 272 0
      src/mx2cc/geninfo/geninfo.monkey2
  2. 31 7
      src/mx2cc/mx2cc.monkey2

+ 272 - 0
src/mx2cc/geninfo/geninfo.monkey2

@@ -0,0 +1,272 @@
+
+Namespace mx2.geninfo
+
+Class ParseInfoGenerator
+
+	Method GenParseInfo:JsonValue( fdecl:FileDecl )
+	
+		Local node:=GenNode( fdecl )
+		
+		Return node
+	End
+	
+	Private
+	
+	'Generic...
+	'
+	Method GenNode<T>:JsonArray( args:T[] )
+	
+		Local arr:=New JsonArray
+		For Local arg:=Eachin args
+			arr.Push( GenNode( arg ) )
+		Next
+		Return arr
+	End
+	
+	Method GenNode:JsonArray( args:String[] )
+
+		Local arr:=New JsonArray
+		For Local arg:=Eachin args
+			arr.Push( New JsonString( arg ) )
+		Next
+		Return arr
+	End
+	
+	'Decls...
+	'
+	Method MakeNode:JsonObject( decl:Decl )
+	
+		Local node:=New JsonObject
+
+		node.SetString( "srcpos",(decl.srcpos Shr 12)+":"+(decl.srcpos & $fff) )
+		node.SetString( "endpos",(decl.endpos Shr 12)+":"+(decl.endpos & $fff) )
+		node.SetString( "kind",decl.kind )
+		node.SetString( "ident",decl.ident )
+		node.SetNumber( "flags",decl.flags )
+		
+		If decl.members node.SetValue( "members",GenNode( decl.members ) )
+		
+		Return node
+	End
+	
+	Method GenNode:JsonObject( decl:Decl )
+	
+		Local classDecl:=Cast<ClassDecl>( decl )
+		If classDecl Return GenNode( classDecl )
+		
+		Local funcDecl:=Cast<FuncDecl>( decl )
+		If funcDecl Return GenNode( funcDecl )
+		
+		Local aliasDecl:=Cast<AliasDecl>( decl )
+		If aliasDecl Return GenNode( aliasDecl )
+		
+		Local varDecl:=Cast<VarDecl>( decl )
+		If varDecl Return GenNode( varDecl )
+		
+		Local propertyDecl:=Cast<PropertyDecl>( decl )
+		If propertyDecl Return GenNode( propertyDecl )
+		
+		Return MakeNode( decl )
+	End
+	
+	Method GenNode:JsonObject( decl:ClassDecl )
+	
+		Local node:=MakeNode( decl )
+		
+		If decl.genArgs node.SetValue( "genArgs",GenNode( decl.genArgs ) )
+		
+		If decl.superType node.SetValue( "superType",GenNode( decl.superType ) )
+		
+		If decl.ifaceTypes node.SetValue( "ifaceTypes",GenNode( decl.ifaceTypes ) )
+		
+		Return node
+	End
+
+	Method GenNode:JsonObject( decl:FuncDecl )
+
+		Local node:=MakeNode( decl )
+		
+		If decl.genArgs node.SetValue( "genArgs",GenNode( decl.genArgs ) )
+		
+		If decl.type node.SetValue( "type",GenNode( decl.type ) )
+		
+		If decl.whereExpr node.SetValue( "where",GenNode( decl.whereExpr ) )
+		
+		Return node
+	End
+	
+	Method GenNode:JsonObject( decl:AliasDecl )
+
+		Local node:=MakeNode( decl )
+		
+		If decl.genArgs node.SetValue( "genArgs",GenNode( decl.genArgs ) )
+		
+		If decl.type node.SetValue( "type",GenNode( decl.type ) )
+		
+		Return node
+	End
+	
+	Method GenNode:JsonObject( decl:VarDecl )
+	
+		Local node:=MakeNode( decl )
+		
+		If decl.type node.SetValue( "type",GenNode( decl.type ) )
+		
+		If decl.init node.SetValue( "init",GenNode( decl.init ) )
+		
+		Return node
+	End
+	
+	Method GenNode:JsonObject( decl:PropertyDecl )
+	
+		Local node:=MakeNode( decl )
+		
+		If decl.getFunc node.SetValue( "getFunc",GenNode( decl.getFunc ) )
+		
+		If decl.setFunc node.SetValue( "setFunc",GenNode( decl.setFunc ) )
+		
+		Return node
+	
+	End
+	
+	'Expressions...
+	'
+	Method MakeNode:JsonObject( expr:Expr,kind:String )
+	
+		Local node:=New JsonObject
+
+		node.SetString( "srcpos",(expr.srcpos Shr 12)+":"+(expr.srcpos & $fff) )
+		node.SetString( "endpos",(expr.endpos Shr 12)+":"+(expr.endpos & $fff) )
+		node.SetString( "kind",kind )
+		
+		Return node
+	End
+	
+	Method GenNode:JsonObject( expr:Expr )
+	
+		Local identExpr:=Cast<IdentExpr>( expr )
+		If identExpr Return GenNode( identExpr )
+		
+		Local memberExpr:=Cast<MemberExpr>( expr )
+		If memberExpr Return GenNode( memberExpr )
+		
+		Local genericExpr:=Cast<GenericExpr>( expr )
+		If genericExpr Return GenNode( genericExpr )
+		
+		Local literalExpr:=Cast<LiteralExpr>( expr )
+		If literalExpr Return GenNode( literalExpr )
+
+		Local newObjectExpr:=Cast<NewObjectExpr>( expr )
+		If newObjectExpr Return GenNode( newObjectExpr )
+
+		Local newArrayExpr:=Cast<NewArrayExpr>( expr )
+		If newArrayExpr Return GenNode( newArrayExpr )
+				
+		Local funcTypeExpr:=Cast<FuncTypeExpr>( expr )
+		If funcTypeExpr Return GenNode( funcTypeExpr )
+		
+		Local arrayTypeExpr:=Cast<ArrayTypeExpr>( expr )
+		If arrayTypeExpr Return GenNode( arrayTypeExpr )
+		
+		Local pointerTypeExpr:=Cast<PointerTypeExpr>( expr )
+		If pointerTypeExpr Return GenNode( pointerTypeExpr )
+		
+		Return MakeNode( expr,"????Expr?????" )
+	End
+	
+	Method GenNode:JsonObject( expr:IdentExpr )
+	
+		Local node:=MakeNode( expr,"ident" )
+		
+		node.SetString( "ident",expr.ident )
+		
+		Return node
+	End
+	
+	Method GenNode:JsonObject( expr:MemberExpr )
+	
+		Local node:=MakeNode( expr,"member" )
+		
+		node.SetValue( "expr",GenNode( expr.expr ) )
+		
+		node.SetString( "ident",expr.ident )
+	
+		Return node
+	End
+	
+	Method GenNode:JsonObject( expr:GenericExpr )
+
+		Local node:=MakeNode( expr,"generic" )
+		
+		node.SetValue( "expr",GenNode( expr.expr ) )
+		
+		node.SetValue( "args",GenNode( expr.args ) )
+		
+		Return node
+	End
+	
+	Method GenNode:JsonObject( expr:LiteralExpr )
+	
+		Local node:=MakeNode( expr,"literal" )
+		
+		node.SetString( "toke",expr.toke )
+		
+		Return node
+	End
+	
+	Method GenNode:JsonObject( expr:NewObjectExpr )
+	
+		Local node:=MakeNode( expr,"newobject" )
+		
+		node.SetValue( "type",GenNode( expr.type ) )
+		
+		node.SetValue( "args",GenNode( expr.args ) )
+		
+		Return node
+	End
+		
+	Method GenNode:JsonObject( expr:NewArrayExpr )
+	
+		Local node:=MakeNode( expr,"newarray" )
+		
+		node.SetValue( "type",GenNode( expr.type ) )
+		
+		If expr.sizes node.SetValue( "sizes",GenNode( expr.sizes ) )
+
+		If expr.inits node.SetValue( "inits",GenNode( expr.inits ) )
+		
+		Return node
+	End
+		
+	Method GenNode:JsonObject( expr:FuncTypeExpr )
+
+		Local node:=MakeNode( expr,"functype" )
+		
+		node.SetValue( "retType",GenNode( expr.retType ) )
+		
+		node.SetValue( "params",GenNode( expr.params ) )
+		
+		Return node
+	End
+
+	Method GenNode:JsonObject( expr:ArrayTypeExpr )
+	
+		Local node:=MakeNode( expr,"arraytype" )
+		
+		node.SetValue( "type",GenNode( expr.type ) )
+		
+		node.SetNumber( "rank",expr.rank )
+		
+		Return node
+	End
+	
+	Method GenNode:JsonObject( expr:PointerTypeExpr )
+	
+		Local node:=MakeNode( expr,"pointertype" )
+		
+		node.SetValue( "type",GenNode( expr.type ) )
+		
+		Return node
+	End
+
+End

+ 31 - 7
src/mx2cc/mx2cc.monkey2

@@ -13,15 +13,22 @@ Using mx2.docs
 #Import "docs/markdownbuffer"
 #Import "docs/markdownbuffer"
 #Import "docs/manpage"
 #Import "docs/manpage"
 
 
+#Import "geninfo/geninfo"
+
 Using libc..
 Using libc..
 Using std..
 Using std..
 Using mx2..
 Using mx2..
 
 
 Global StartDir:String
 Global StartDir:String
 
 
-Const TestArgs:="mx2cc makedocs mojo"
+'Const TestArgs:="mcx2cc makedocs"
+
+'Const TestArgs:="mx2cc makemods -clean -config=release monkey libc miniz stb-image stb-image-write stb-vorbis std"
 
 
-'Const TestArgs:="mx2cc makeapp -clean -config=debug -target=desktop src/mx2cc/test.monkey2"
+'Const TestArgs:="mx2cc makeapp -clean -config=release src/ted2/ted2.monkey2"
+
+'Const TestArgs:="mx2cc makeapp -apptype=console -clean -config=debug -target=desktop -semant -geninfo src/mx2cc/test.monkey2"
+Const TestArgs:="mx2cc makeapp -apptype=console -clean -config=debug -target=desktop -parse -geninfo src/mx2cc/translator_cpp.monkey2"
 
 
 'Const TestArgs:="mx2cc makeapp -clean -config=debug -target=desktop -product=D:/test_app/test.exe -assets=D:/test_app/assets -dlls=D:/test_app/ src/mx2cc/test.monkey2"
 'Const TestArgs:="mx2cc makeapp -clean -config=debug -target=desktop -product=D:/test_app/test.exe -assets=D:/test_app/assets -dlls=D:/test_app/ src/mx2cc/test.monkey2"
 
 
@@ -31,6 +38,10 @@ Const TestArgs:="mx2cc makedocs mojo"
 
 
 'Const TestArgs:="mx2cc makeapp -verbose -target=desktop -config=release src/mx2cc/mx2cc"
 'Const TestArgs:="mx2cc makeapp -verbose -target=desktop -config=release src/mx2cc/mx2cc"
 
 
+'To build mx2cc...
+'
+'Const TestArgs:="mx2cc makeapp -build -clean -apptype=console -config=release src/mx2cc/mx2cc.monkey2"
+
 'To build rasbian mx2cc...
 'To build rasbian mx2cc...
 '
 '
 'Const TestArgs:="mx2cc makemods -clean -config=release -target=raspbian monkey libc miniz stb-image stb-image-write stb-vorbis std"
 'Const TestArgs:="mx2cc makemods -clean -config=release -target=raspbian monkey libc miniz stb-image stb-image-write stb-vorbis std"
@@ -39,7 +50,7 @@ Const TestArgs:="mx2cc makedocs mojo"
 Function Main()
 Function Main()
 
 
 	Print "mx2cc version "+MX2CC_VERSION
 	Print "mx2cc version "+MX2CC_VERSION
-
+	
 	StartDir=CurrentDir()
 	StartDir=CurrentDir()
 	
 	
 	ChangeDir( AppDir() )
 	ChangeDir( AppDir() )
@@ -56,7 +67,7 @@ Function Main()
 	LoadEnv( env )
 	LoadEnv( env )
 	
 	
 	Local args:=AppArgs()
 	Local args:=AppArgs()
-	
+
 	If args.Length<2
 	If args.Length<2
 
 
 		Print "Usage: mx2cc makeapp|makemods|makedocs [-build|-run] [-clean] [-verbose[=1|2|3]] [-target=desktop|emscripten] [-config=debug|release] [-apptype=gui|console] source|modules..."
 		Print "Usage: mx2cc makeapp|makemods|makedocs [-build|-run] [-clean] [-verbose[=1|2|3]] [-target=desktop|emscripten] [-config=debug|release] [-apptype=gui|console] source|modules..."
@@ -127,15 +138,26 @@ Function MakeApp:Bool( args:String[] )
 	
 	
 	Builder.Parse()
 	Builder.Parse()
 	If Builder.errors.Length Return False
 	If Builder.errors.Length Return False
-	If opts.passes=1 Return True
+	If opts.passes=1 
+		If opts.geninfo
+			Local gen:=New ParseInfoGenerator
+			Local jobj:=gen.GenParseInfo( Builder.mainModule.fileDecls[0] )
+			Print jobj.ToJson()
+		Endif
+		Return True
+	Endif
 	
 	
 	Builder.Semant()
 	Builder.Semant()
 	If Builder.errors.Length Return False
 	If Builder.errors.Length Return False
-	If opts.passes=2 Return True
+	If opts.passes=2
+		Return True
+	Endif
 	
 	
 	Builder.Translate()
 	Builder.Translate()
 	If Builder.errors.Length Return False
 	If Builder.errors.Length Return False
-	If opts.passes=3 Return True
+	If opts.passes=3 
+		Return True
+	Endif
 	
 	
 	Builder.product.Build()
 	Builder.product.Build()
 	If Builder.errors.Length Return False
 	If Builder.errors.Length Return False
@@ -293,6 +315,8 @@ Function ParseOpts:String[]( opts:BuildOpts,args:String[] )
 				opts.clean=True
 				opts.clean=True
 			Case "-verbose"
 			Case "-verbose"
 				opts.verbose=1
 				opts.verbose=1
+			Case "-geninfo"
+				opts.geninfo=True
 			Default
 			Default
 				Return args.Slice( i )
 				Return args.Slice( i )
 			End
 			End