Permalink
Browse files

word_parse.py: Simplify arithmetic parsing.

Remove an unneeded helper method and the do_next= keyword arg.
  • Loading branch information...
Andy Chu
Andy Chu committed Aug 30, 2018
1 parent 3a5bbbf commit 37d1f0268d4197b514a45e6223f146d6d752e971
Showing with 15 additions and 14 deletions.
  1. +4 −0 osh/arith_parse_test.py
  2. +11 −14 osh/word_parse.py
View
@@ -19,12 +19,16 @@
from core import util
from osh import parse_lib
from osh.meta import types
#from osh import arith_parse
lex_mode_e = types.lex_mode_e
def ParseAndEval(code_str):
arena = test_lib.MakeArena('<arith_parse_test.py>')
w_parser, _ = parse_lib.MakeParserForCompletion(code_str, arena)
w_parser._Next(lex_mode_e.ARITH) # Calling private method
anode = w_parser._ReadArithExpr() # need the right lex state?
print('node:', anode)
View
@@ -144,19 +144,14 @@ def _ReadVarOpArg(self, arg_lex_mode, eof_type=Id.Undefined_Tok,
w.parts.append(ast.EmptyPart())
return w
def _ReadSliceArg(self):
"""Read an arithmetic expression for either part of ${a : i+1 : i+2}."""
anode = self._ReadArithExpr(do_next=False)
return anode
def _ReadSliceVarOp(self):
""" VarOf ':' ArithExpr (':' ArithExpr )? """
self._Next(lex_mode_e.ARITH)
self._Peek()
if self.token_type == Id.Arith_Colon: # A pun for Id.VOp2_Colon
begin = None # no beginning specified
else:
begin = self._ReadSliceArg()
begin = self._ReadArithExpr()
if not begin: return None
#print('BEGIN', begin)
#print('BVS2', self.cur_token)
@@ -167,7 +162,7 @@ def _ReadSliceVarOp(self):
# Id.Arith_Colon is a pun for Id.VOp2_Colon
elif self.token_type == Id.Arith_Colon:
self._Next(lex_mode_e.ARITH)
length = self._ReadSliceArg()
length = self._ReadArithExpr()
if not length: return None
#print('after colon', self.cur_token)
@@ -258,6 +253,7 @@ def _ReadSubscript(self):
self._Next(lex_mode_e.ARITH) # skip past @
self._Peek()
else:
self._Next(lex_mode_e.ARITH) # skip past [
anode = self._ReadArithExpr()
op = ast.ArrayIndex(anode)
@@ -709,7 +705,7 @@ def _ReadCommandSubPart(self, token_type):
cs_part.spids.append(right_spid)
return cs_part
def _ReadArithExpr(self, do_next=True):
def _ReadArithExpr(self):
"""Read and parse an arithmetic expression in various contexts.
$(( 1+2 ))
@@ -729,8 +725,6 @@ def _ReadArithExpr(self, do_next=True):
See the assertion in ArithParser.Parse() -- unexpected extra input.
"""
if do_next:
self._Next(lex_mode_e.ARITH)
# calls self.ReadWord(lex_mode_e.ARITH)
a_parser = tdop.TdopParser(arith_parse.SPEC, self)
anode = a_parser.Parse()
@@ -755,6 +749,7 @@ def _ReadArithSubPart(self):
# $((echo * foo)) # looks like multiplication
# $((echo / foo)) # looks like division
self._Next(lex_mode_e.ARITH)
anode = self._ReadArithExpr()
if self.token_type != Id.Arith_RParen:
p_die('Expected first ) to end arith sub, got %r', self.cur_token.val,
@@ -780,6 +775,7 @@ def _ReadArithSub2Part(self):
"""Non-standard arith sub $[a + 1]."""
left_span_id = self.cur_token.span_id
self._Next(lex_mode_e.ARITH)
anode = self._ReadArithExpr()
if self.token_type != Id.Arith_RBracket:
p_die('Expected ], got %r', self.cur_token.val, token=self.cur_token)
@@ -802,6 +798,7 @@ def ReadDParen(self):
# Then you can get rid of this.
self.lexer.PushHint(Id.Op_RParen, Id.Op_DRightParen)
self._Next(lex_mode_e.ARITH)
anode = self._ReadArithExpr()
assert anode is not None
@@ -836,21 +833,21 @@ def ReadForExpression(self):
if self.token_type == Id.Arith_Semi: # for (( ; i < 10; i++ ))
init_node = None
else:
init_node = self._ReadArithExpr(do_next=False)
init_node = self._ReadArithExpr()
self._NextNonSpace()
self._Peek()
if self.token_type == Id.Arith_Semi: # for (( ; ; i++ ))
cond_node = None
else:
cond_node = self._ReadArithExpr(do_next=False)
cond_node = self._ReadArithExpr()
self._NextNonSpace()
self._Peek()
if self.token_type == Id.Arith_RParen: # for (( ; ; ))
update_node = None
else:
update_node = self._ReadArithExpr(do_next=False)
update_node = self._ReadArithExpr()
self._NextNonSpace()
self._Peek()
@@ -1032,7 +1029,7 @@ def _ReadArithWord(self):
return w, False
else:
assert False, ("Unexpected token parsing arith sub: %s", self.cur_token)
assert False, ("Unexpected token parsing arith sub: %s" % self.cur_token)
raise AssertionError("Shouldn't get here")

0 comments on commit 37d1f02

Please sign in to comment.