@ -33,40 +33,40 @@ func (s ScriptoidTreeVisitor) printf(format string, arguments ...interface{}) {
}
}
func ( s ScriptoidTreeVisitor ) VisitScript ( ctx * parser . ScriptContext ) AST . Scope Node {
func ( s ScriptoidTreeVisitor ) VisitScript ( ctx * parser . ScriptContext ) * AST . Transform Node {
s . printf ( "Visiting Script: %v" , indent ( ctx . GetText ( ) , 1 , "\t" ) )
scope := s . VisitScope ( ctx . Scope ( ) . ( * parser . ScopeContext ) )
//TODO: replace Script name by module or file name
scope . Name = "Script"
return scope
trans := AST . NewIdentNode ( "Script" , scope )
return trans
}
func ( s ScriptoidTreeVisitor ) VisitScope ( ctx * parser . ScopeContext ) AST . ScopeNode {
dec larat io nStat ement s := ctx . GetDeclaration s ( )
func ( s ScriptoidTreeVisitor ) VisitScope ( ctx * parser . ScopeContext ) * AST . ScopeNode {
lines := ctx . GetLine s ( )
s . printf ( "Visiting Scope: %v" , indent ( ctx . GetText ( ) , 1 , "\t" ) )
s . printf ( "Scope has %v dec larat io n stat ement s" , len ( dec larat io nStat ement s) )
s . printf ( "Scope has %v lines" , len ( lines ) )
s . enter ( )
defer s . exit ( )
scope := AST . NewScopeNode ( "anonymous" )
for _ , child := range declarationStatements {
declarationStatement := s . VisitDeclarationStatement ( child . ( * parser . DeclarationStatementContext ) )
scope . AddChild ( declarationStatement )
for _ , line := range lines {
lineCtx := line . ( * parser . LineContext )
//TODO: validate indents
declaration := lineCtx . Declaration ( )
if declaration != nil {
node := s . VisitDeclaration ( declaration . ( * parser . DeclarationContext ) )
scope . AddChild ( node )
}
}
return scope
}
func ( s ScriptoidTreeVisitor ) VisitDeclarationStatement ( ctx * parser . DeclarationStatementContext ) AST . Unique {
s . printf ( "Visiting Declaration Statement with %v indents: %v" , len ( ctx . GetIndents ( ) ) , ctx . GetText ( ) )
s . enter ( )
defer s . exit ( )
//TODO: validate indents
return s . VisitDeclaration ( ctx . Declaration ( ) . ( * parser . DeclarationContext ) )
}
func ( s ScriptoidTreeVisitor ) VisitDeclaration ( ctx * parser . DeclarationContext ) AST . Unique {
s . printf ( "Visiting Declaration: %v" , ctx . GetText ( ) )
s . enter ( )
@ -94,12 +94,10 @@ func (s ScriptoidTreeVisitor) VisitVariable(ctx *parser.VariableContext) AST.Uni
defer s . exit ( )
var_name := ctx . IDENTIFIER ( ) . GetText ( )
variable := AST . NewScopeNode ( var_name )
literal := s . VisitLiteral ( ctx . Literal ( ) . ( * parser . LiteralContext ) )
literal . SetName ( var_name )
variable . AddChild ( literal )
return variable
return literal
}
func ( s ScriptoidTreeVisitor ) VisitLiteral ( ctx * parser . LiteralContext ) AST . Unique {
@ -115,6 +113,7 @@ func (s ScriptoidTreeVisitor) VisitLiteral(ctx *parser.LiteralContext) AST.Uniqu
str := ctx . STRING_LIT ( )
fun := ctx . Function_literal ( )
call := ctx . Call ( )
block := ctx . Block ( )
if integer != nil {
node . Type = AST . INT
@ -133,20 +132,15 @@ func (s ScriptoidTreeVisitor) VisitLiteral(ctx *parser.LiteralContext) AST.Uniqu
return AST . NewTransformNode ( "literal" , parameters , scope )
} else if call != nil {
return AST . NewErrorNode ( "calls are not implemented yet" )
} else if block != nil {
return s . VisitBlock ( block . ( * parser . BlockContext ) )
} else {
panic ( fmt . Sprintf ( "Literal is not of a known type. Rule: %+v" , ctx . GetParser ( ) . ( * parser . ScriptoidParser ) . RuleNames [ ctx . GetRuleContext ( ) . GetRuleIndex ( ) ] ) )
panic ( fmt . Sprintf ( "Literal is not of a known type. Token: % v" , ctx . GetT ext ( ) ) )
}
_ = integer
_ = float
_ = str
_ = fun
_ = call
return node
}
func ( s ScriptoidTreeVisitor ) VisitFunction ( ctx * parser . FunctionContext ) AST . TransformNode {
func ( s ScriptoidTreeVisitor ) VisitFunction ( ctx * parser . FunctionContext ) * AST . TransformNode {
s . printf ( "Visiting Function \"%v\"" , ctx . IDENTIFIER ( ) . GetSymbol ( ) . GetText ( ) )
s . enter ( )
defer s . exit ( )
@ -158,11 +152,11 @@ func (s ScriptoidTreeVisitor) VisitFunction(ctx *parser.FunctionContext) AST.Tra
return AST . NewTransformNode ( func_name , parameters , scope )
}
func ( s * ScriptoidTreeVisitor ) VisitBlock ( ctx * parser . BlockContext ) AST . ScopeNode {
func ( s * ScriptoidTreeVisitor ) VisitBlock ( ctx * parser . BlockContext ) * AST . ScopeNode {
return s . VisitScope ( ctx . Scope ( ) . ( * parser . ScopeContext ) )
}
func ( s * ScriptoidTreeVisitor ) VisitParameters ( ctx * parser . ParametersContext ) AST . ScopeNode {
func ( s * ScriptoidTreeVisitor ) VisitParameters ( ctx * parser . ParametersContext ) * AST . ScopeNode {
s . enter ( )
defer s . exit ( )
s . printf ( "Found %v Parameters" , len ( ctx . AllIDENTIFIER ( ) ) )