@@ -65,6 +65,7 @@ type Command struct {
6565	Type     CommandType 
6666	Options  string 
6767	Args     string 
68+ 	Source   string 
6869}
6970
7071// String returns the string representation of the command. 
@@ -123,15 +124,15 @@ func (p *Parser) Parse() []Command {
123124			p .nextToken ()
124125			continue 
125126		}
126- 		cmds  =  append (cmds , p .parseCommand ())
127+ 		cmds  =  append (cmds , p .parseCommand ()... )
127128		p .nextToken ()
128129	}
129130
130131	return  cmds 
131132}
132133
133134// parseCommand parses a command. 
134- func  (p  * Parser ) parseCommand () Command  {
135+ func  (p  * Parser ) parseCommand () [] Command  {
135136	switch  p .cur .Type  {
136137	case  token .SPACE ,
137138		token .BACKSPACE ,
@@ -146,42 +147,42 @@ func (p *Parser) parseCommand() Command {
146147		token .UP ,
147148		token .PAGE_UP ,
148149		token .PAGE_DOWN :
149- 		return  p .parseKeypress (p .cur .Type )
150+ 		return  [] Command { p .parseKeypress (p .cur .Type )} 
150151	case  token .SET :
151- 		return  p .parseSet ()
152+ 		return  [] Command { p .parseSet ()} 
152153	case  token .OUTPUT :
153- 		return  p .parseOutput ()
154+ 		return  [] Command { p .parseOutput ()} 
154155	case  token .SLEEP :
155- 		return  p .parseSleep ()
156+ 		return  [] Command { p .parseSleep ()} 
156157	case  token .TYPE :
157- 		return  p .parseType ()
158+ 		return  [] Command { p .parseType ()} 
158159	case  token .CTRL :
159- 		return  p .parseCtrl ()
160+ 		return  [] Command { p .parseCtrl ()} 
160161	case  token .ALT :
161- 		return  p .parseAlt ()
162+ 		return  [] Command { p .parseAlt ()} 
162163	case  token .SHIFT :
163- 		return  p .parseShift ()
164+ 		return  [] Command { p .parseShift ()} 
164165	case  token .HIDE :
165- 		return  p .parseHide ()
166+ 		return  [] Command { p .parseHide ()} 
166167	case  token .REQUIRE :
167- 		return  p .parseRequire ()
168+ 		return  [] Command { p .parseRequire ()} 
168169	case  token .SHOW :
169- 		return  p .parseShow ()
170+ 		return  [] Command { p .parseShow ()} 
170171	case  token .WAIT :
171- 		return  p .parseWait ()
172+ 		return  [] Command { p .parseWait ()} 
172173	case  token .SOURCE :
173174		return  p .parseSource ()
174175	case  token .SCREENSHOT :
175- 		return  p .parseScreenshot ()
176+ 		return  [] Command { p .parseScreenshot ()} 
176177	case  token .COPY :
177- 		return  p .parseCopy ()
178+ 		return  [] Command { p .parseCopy ()} 
178179	case  token .PASTE :
179- 		return  p .parsePaste ()
180+ 		return  [] Command { p .parsePaste ()} 
180181	case  token .ENV :
181- 		return  p .parseEnv ()
182+ 		return  [] Command { p .parseEnv ()} 
182183	default :
183184		p .errors  =  append (p .errors , NewError (p .cur , "Invalid command: " + p .cur .Literal ))
184- 		return  Command {Type : token .ILLEGAL }
185+ 		return  [] Command {{ Type : token .ILLEGAL } }
185186	}
186187}
187188
@@ -659,13 +660,13 @@ func (p *Parser) parseEnv() Command {
659660// Source command takes a tape path to include in current tape. 
660661// 
661662//	Source <path> 
662- func  (p  * Parser ) parseSource () Command  {
663+ func  (p  * Parser ) parseSource () [] Command  {
663664	cmd  :=  Command {Type : token .SOURCE }
664665
665666	if  p .peek .Type  !=  token .STRING  {
666667		p .errors  =  append (p .errors , NewError (p .cur , "Expected path after Source" ))
667668		p .nextToken ()
668- 		return  cmd 
669+ 		return  [] Command { cmd } 
669670	}
670671
671672	srcPath  :=  p .peek .Literal 
@@ -675,15 +676,15 @@ func (p *Parser) parseSource() Command {
675676	if  ext  !=  ".tape"  {
676677		p .errors  =  append (p .errors , NewError (p .peek , "Expected file with .tape extension" ))
677678		p .nextToken ()
678- 		return  cmd 
679+ 		return  [] Command { cmd } 
679680	}
680681
681682	// Check if tape exist 
682683	if  _ , err  :=  os .Stat (srcPath ); os .IsNotExist (err ) {
683684		notFoundErr  :=  fmt .Sprintf ("File %s not found" , srcPath )
684685		p .errors  =  append (p .errors , NewError (p .peek , notFoundErr ))
685686		p .nextToken ()
686- 		return  cmd 
687+ 		return  [] Command { cmd } 
687688	}
688689
689690	// Check if source tape contains nested Source command 
@@ -692,7 +693,7 @@ func (p *Parser) parseSource() Command {
692693		readErr  :=  fmt .Sprintf ("Unable to read file: %s" , srcPath )
693694		p .errors  =  append (p .errors , NewError (p .peek , readErr ))
694695		p .nextToken ()
695- 		return  cmd 
696+ 		return  [] Command { cmd } 
696697	}
697698
698699	srcTape  :=  string (d )
@@ -701,7 +702,7 @@ func (p *Parser) parseSource() Command {
701702		readErr  :=  fmt .Sprintf ("Source tape: %s is empty" , srcPath )
702703		p .errors  =  append (p .errors , NewError (p .peek , readErr ))
703704		p .nextToken ()
704- 		return  cmd 
705+ 		return  [] Command { cmd } 
705706	}
706707
707708	srcLexer  :=  lexer .New (srcTape )
@@ -713,7 +714,7 @@ func (p *Parser) parseSource() Command {
713714		if  cmd .Type  ==  token .SOURCE  {
714715			p .errors  =  append (p .errors , NewError (p .peek , "Nested Source detected" ))
715716			p .nextToken ()
716- 			return  cmd 
717+ 			return  [] Command { cmd } 
717718		}
718719	}
719720
@@ -722,12 +723,23 @@ func (p *Parser) parseSource() Command {
722723	if  len (srcErrors ) >  0  {
723724		p .errors  =  append (p .errors , NewError (p .peek , fmt .Sprintf ("%s has %d errors" , srcPath , len (srcErrors ))))
724725		p .nextToken ()
725- 		return  cmd 
726+ 		return  [] Command { cmd } 
726727	}
727728
728729	cmd .Args  =  p .peek .Literal 
730+ 	filtered  :=  make ([]Command , 0 )
731+ 	for  _ , srcCmd  :=  range  srcCmds  {
732+ 		// Output have to be avoid in order to not overwrite output of the original tape. 
733+ 		if  srcCmd .Type  ==  token .SOURCE  || 
734+ 			srcCmd .Type  ==  token .OUTPUT  {
735+ 			continue 
736+ 		}
737+ 		srcCmd .Source  =  cmd .Args 
738+ 		filtered  =  append (filtered , srcCmd )
739+ 	}
740+ 
729741	p .nextToken ()
730- 	return  cmd 
742+ 	return  filtered 
731743}
732744
733745// parseScreenshot parses screenshot command. 
0 commit comments