bashlex icon indicating copy to clipboard operation
bashlex copied to clipboard

Command substitution

Open sereysethy opened this issue 5 years ago • 1 comments

Hi, I was about to make a pull request for a command substitution that returned a wrong position when there are spaces in the commands in the command substitution $(foo ). But then I discovered another problem and I couldnt find how to fix it. It is when there is a semi column in the list of commands, parsing failed.

Ex: parsing this command failed $(foo;). I got this error. Can you tell me where the problem lies? It is a list, but I couldnt find where to fix it. It does not happen with another form of command subsitution `command;`. I know they are treated differently in parser.

File "python3.6/site-packages/bashlex/parser.py", line 605, in parse
	    parts = [p.parse()]
	  File "python3.6/site-packages/bashlex/parser.py", line 686, in parse
	    tree = theparser.parse(lexer=self.tok, context=self)
	  File "python3.6/site-packages/bashlex/yacc.py", line 277, in parse
	    return self.parseopt_notrack(input,lexer,debug,tracking,tokenfunc,context)
	  File "python3.6/site-packages/bashlex/yacc.py", line 998, in parseopt_notrack
	    p.callable(pslice)
	  File "python3.6/site-packages/bashlex/parser.py", line 157, in p_simple_command_element
	    p[0] = [_expandword(parserobj, p.slice[1])]
	  File "python3.6/site-packages/bashlex/parser.py", line 137, in _expandword
	    doublequoted, 0, 0)
	  File "python3.6/site-packages/bashlex/subst.py", line 271, in _expandwordinternal
	    node, sindex[0] = _paramexpand(parserobj, string, sindex[0])
	  File "python3.6/site-packages/bashlex/subst.py", line 165, in _paramexpand
	    return _extractcommandsubst(parserobj, string, zindex + 1)
	  File "python3.6/site-packages/bashlex/subst.py", line 55, in _extractcommandsubst
	    node, si = _parsedolparen(parserobj, string, sindex)
	  File "python3.6/site-packages/bashlex/subst.py", line 42, in _parsedolparen
	    node, endp = _recursiveparse(parserobj, base, sindex, tokenizerargs)
	  File "python3.6/site-packages/bashlex/subst.py", line 23, in _recursiveparse
	    node = p.parse()
	  File "python3.6/site-packages/bashlex/parser.py", line 686, in parse
	    tree = theparser.parse(lexer=self.tok, context=self)
	  File "python3.6/site-packages/bashlex/yacc.py", line 277, in parse
	    return self.parseopt_notrack(input,lexer,debug,tracking,tokenfunc,context)
	  File "python3.6/site-packages/bashlex/yacc.py", line 1079, in parseopt_notrack
	    tok = self.errorfunc(errtoken)
	  File "python3.6/site-packages/bashlex/parser.py", line 543, in p_error
	    p.lexer.source, p.lexpos)
	bashlex.errors.ParsingError: unexpected token ')' (position 4)

sereysethy avatar Aug 21 '19 13:08 sereysethy

Command substitutions are parsed recursively. The code that handles this is in bashlex/subst.py, see _recursiveparse. I'd try debugging it and putting a breakpoint in that function.

idank avatar Aug 24 '19 19:08 idank