@@ -208,18 +208,28 @@ func (p *Parser) parsePipe(first *ast.CommandNode) (ast.Node, error) {
208208 if n .IsMulti () {
209209 it = p .peek ()
210210 if it .Type () != token .RParen {
211- return nil , errors .NewUnfinishedCmdError (p .name , it )
211+ if it .Type () == token .EOF {
212+ return nil , errors .NewUnfinishedCmdError (p .name , it )
213+ }
214+
215+ return nil , newParserError (it , p .name , "Unexpected symbol '%s'" , it )
212216 }
213217
214218 p .ignore ()
215219 }
216220
217221 it = p .peek ()
218222
219- if it .Type () == token .Semicolon {
220- p . ignore ()
223+ if it .Type () == token .RBrace {
224+ return n , nil
221225 }
222226
227+ if it .Type () != token .Semicolon {
228+ return nil , newParserError (it , p .name , "Unexpected symbol %s" , it )
229+ }
230+
231+ p .ignore ()
232+
223233 return n , nil
224234}
225235
@@ -234,7 +244,7 @@ func (p *Parser) parseCommand(it scanner.Token) (ast.Node, error) {
234244 }
235245
236246 if it .Type () != token .Ident && it .Type () != token .Arg {
237- if isMulti {
247+ if isMulti && it . Type () == token . EOF {
238248 return nil , errors .NewUnfinishedCmdError (p .name , it )
239249 }
240250
@@ -249,6 +259,14 @@ cmdLoop:
249259
250260 switch typ := it .Type (); {
251261 case typ == token .RBrace :
262+ if p .openblocks > 0 {
263+ if p .insidePipe {
264+ p .insidePipe = false
265+ }
266+
267+ return n , nil
268+ }
269+
252270 break cmdLoop
253271 case isValidArgument (it ):
254272 arg , err := p .getArgument (true , true )
@@ -288,26 +306,33 @@ cmdLoop:
288306 }
289307 }
290308
291- if p .insidePipe {
292- p .insidePipe = false
293- }
294-
295309 it = p .peek ()
296310
297311 if isMulti {
298312 if it .Type () != token .RParen {
299- return nil , errors .NewUnfinishedCmdError (p .name , it )
313+ if it .Type () == token .EOF {
314+ return nil , errors .NewUnfinishedCmdError (p .name , it )
315+ }
316+
317+ return nil , newParserError (it , p .name , "Unexpected symbol '%s'" , it )
300318 }
301319
302320 p .ignore ()
303321
304322 it = p .peek ()
305323 }
306324
307- if it .Type () == token .Semicolon {
308- p .ignore ()
325+ if p .insidePipe {
326+ p .insidePipe = false
327+ return n , nil
328+ }
329+
330+ if it .Type () != token .Semicolon {
331+ return nil , newParserError (it , p .name , "Unexpected symbol '%s'" , it )
309332 }
310333
334+ p .ignore ()
335+
311336 return n , nil
312337}
313338
0 commit comments