spreadsheet

terminal spreadsheet application
git clone https://git.ce9e.org/spreadsheet.git

commit
89750318d03c797ab6a46a92327505108f92601f
parent
29f448dfa4db0427f0cc4d02f1022fb6eb3abee5
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2024-07-06 16:35
fix operators left-associative

Diffstat

M sheet/expression.py 40 ++++++++++++++++++----------------------

1 files changed, 18 insertions, 22 deletions


diff --git a/sheet/expression.py b/sheet/expression.py

@@ -77,20 +77,6 @@ def parse_brace(text):
   77    77     return exp, tail
   78    78 
   79    79 
   80    -1 def parse_add(text):
   81    -1     lhs, tail = parse_expression2(text)
   82    -1     m, tail = parse_re(tail, r'\s*[-+]\s*')
   83    -1     rhs, tail = parse_expression(tail)
   84    -1     return (m[0].strip(), lhs, rhs), tail
   85    -1 
   86    -1 
   87    -1 def parse_mul(text):
   88    -1     lhs, tail = parse_expression3(text)
   89    -1     m, tail = parse_re(tail, r'\s*[*/]\s*')
   90    -1     rhs, tail = parse_expression2(tail)
   91    -1     return (m[0].strip(), lhs, rhs), tail
   92    -1 
   93    -1 
   94    80 def parse_call(text):
   95    81     m, tail = parse_re(text, r'[a-zA-Z][a-zA-Z0-9]*')
   96    82     _, tail = parse_re(tail, r'\(')
@@ -119,17 +105,27 @@ def parse_expression3(text):
  119   105 
  120   106 
  121   107 def parse_expression2(text):
  122    -1     return parse_any(text, [
  123    -1         parse_mul,
  124    -1         parse_expression3,
  125    -1     ])
   -1   108     lhs, tail = parse_expression3(text)
   -1   109     while True:
   -1   110         try:
   -1   111             m, tail = parse_re(tail, r'\s*[*/]\s*')
   -1   112         except ParseError:
   -1   113             break
   -1   114         rhs, tail = parse_expression3(tail)
   -1   115         lhs = m[0].strip(), lhs, rhs
   -1   116     return lhs, tail
  126   117 
  127   118 
  128   119 def parse_expression(text):
  129    -1     return parse_any(text, [
  130    -1         parse_add,
  131    -1         parse_expression2,
  132    -1     ])
   -1   120     lhs, tail = parse_expression2(text)
   -1   121     while True:
   -1   122         try:
   -1   123             m, tail = parse_re(tail, r'\s*[-+]\s*')
   -1   124         except ParseError:
   -1   125             break
   -1   126         rhs, tail = parse_expression2(tail)
   -1   127         lhs = m[0].strip(), lhs, rhs
   -1   128     return lhs, tail
  133   129 
  134   130 
  135   131 def parse(text):