1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
# This is @generated code; do not edit!
from token import NAME, NUMBER, STRING, NEWLINE, ENDMARKER
from story5.memo import memoize, memoize_left_rec
from story5.node import Node
from story5.parser import Parser
class CalcParser(Parser):
@memoize
def start(self):
self.show_rule('start', [['expr', 'NEWLINE']])
pos = self.mark()
if (True
and self.show_index(0, 0)
and (expr := self.expr())
and self.show_index(0, 1)
and (newline := self.expect(NEWLINE))
):
self.show_index(0, 0, 2)
return expr
self.reset(pos)
self.show_index(0, 0, 0)
return None
@memoize_left_rec
def expr(self):
self.show_rule('*' + 'expr', [['expr', "'+'", 'term'], ['expr', "'-'", 'term'], ['term']])
pos = self.mark()
if (True
and self.show_index(0, 0)
and (expr := self.expr())
and self.show_index(0, 1)
and self.expect('+')
and self.show_index(0, 2)
and (term := self.term())
):
self.show_index(0, 0, 3)
return expr + term
self.reset(pos)
if (True
and self.show_index(1, 0)
and (expr := self.expr())
and self.show_index(1, 1)
and self.expect('-')
and self.show_index(1, 2)
and (term := self.term())
):
self.show_index(1, 0, 3)
return expr - term
self.reset(pos)
if (True
and self.show_index(2, 0)
and (term := self.term())
):
self.show_index(2, 0, 1)
return term
self.reset(pos)
self.show_index(0, 0, 0)
return None
@memoize
def term(self):
self.show_rule('term', [['NUMBER']])
pos = self.mark()
if (True
and self.show_index(0, 0)
and (number := self.expect(NUMBER))
):
self.show_index(0, 0, 1)
return float ( number . string )
self.reset(pos)
self.show_index(0, 0, 0)
return None
|