Completing the Language
interp-and-or

Add and and or to the interpreter. These are new precedence levels -- or binds loosest, and binds tighter, both looser than comparisons. Rename expression() to comparison(). Write and_expr() and or_expr(). The new expression() calls or_expr():

expression -> or_expr -> and_expr -> comparison -> add_sub -> term -> factor

and: both sides nonzero -> 1, else 0. or: either side nonzero -> 1, else 0. Not short-circuiting -- both sides always evaluate.