bashlex
bashlex copied to clipboard
New lines between statements are not supported
Parsing a file with new lines between statements is not supported. For the following script:
echo "Line 1"
echo "Line 3"
The sample program (the one in the README) generates the following error:
Traceback (most recent call last):
File "sp.py", line 4, in <module>
parts = bashlex.parse(open(sys.argv[1]).read())
File "/usr/local/lib/python2.7/dist-packages/bashlex/parser.py", line 595, in parse
part = _parser(s[index:], strictmode=strictmode).parse()
File "/usr/local/lib/python2.7/dist-packages/bashlex/parser.py", line 641, in parse
tree = theparser.parse(lexer=self.tok, context=self)
File "/usr/local/lib/python2.7/dist-packages/bashlex/yacc.py", line 277, in parse
return self.parseopt_notrack(input,lexer,debug,tracking,tokenfunc,context)
File "/usr/local/lib/python2.7/dist-packages/bashlex/yacc.py", line 1079, in parseopt_notrack
tok = self.errorfunc(errtoken)
File "/usr/local/lib/python2.7/dist-packages/bashlex/parser.py", line 539, in p_error
p.lexer.source, p.lexpos)
bashlex.errors.ParsingError: unexpected token 'echo' (position 1)
This error is no longer persisting.
In a Python interactive session with the following setup:
Python 3.10.6 (main, Mar 10 2023, 10:55:28) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import bashlex
>>> bashlex.parse('echo "Line 1"\
... \
... echo "Line 3"')
[CommandNode(parts=[WordNode(parts=[] pos=(0, 4) word='echo'), WordNode(parts=[] pos=(5, 17) word='Line 1echo'), WordNode(parts=[] pos=(18, 26) word='Line 3')] pos=(0, 26))]
Even with additional newlines around the content:
>>> bashlex.parse('echo "Line 1"\
... \
... echo "Line 3"\
... ')
[CommandNode(parts=[WordNode(parts=[] pos=(0, 4) word='echo'), WordNode(parts=[] pos=(5, 17) word='Line 1echo'), WordNode(parts=[] pos=(18, 26) word='Line 3')] pos=(0, 26))]
>>> bashlex.parse('\
... echo "Line 1"\
... \
... echo "Line 3"\
... ')
[CommandNode(parts=[WordNode(parts=[] pos=(0, 4) word='echo'), WordNode(parts=[] pos=(5, 17) word='Line 1echo'), WordNode(parts=[] pos=(18, 26) word='Line 3')] pos=(0, 26))]