view tests/agcl/ffcalc/ffcm-b.syn @ 6:607e3be6bad8

Adjust to the moving target called the C++ standard. Apparently nowadays it's not allowed to define an explicit copy constructor but not an assignment operator. Consequently, defining the explicit copy constructor in terms of the implicit/automatic assignment operator for general convenience no longer works. Add assignment operators. Caution: not tested with the IBM compiler, but there's no particular reason it shouldn't work.
author David A. Holland
date Mon, 30 May 2022 23:46:22 -0400
parents 13d2b8934445
children
line wrap: on
line source

{/*   FOUR FUNCTION CALCULATOR: FFCALC.SYN           */}

// -- CONFIGURATION SECTION ----------------------------
[
  default token type = double
  disregard white space
	distinguish lexemes
  lexeme { real, name}
	case sensitive = off
]

// -- FOUR FUNCTION CALCULATOR -------------------------
(void) calculator $
 -> [calculation?, '\n']..., eof

(void) calculation
 -> expression:x                      =printf("%g\n",x);
 -> name:n, '=', expression:x                         ={
                  printf("%c = %g\n",n+'A',value[n]=x);}
 -> "ADD", expression, "TO", name

 -> error

expression
 -> term
 -> expression:x, '+', term:t                     = x+t;
 -> expression:x, '-', term:t                     = x-t;

term
 -> factor
 -> term:t, '*', factor:f                         = t*f;
 -> term:t, '/', factor:f                         = t/f;

factor
 -> name:n                             = value[n];
 -> real
 -> '(', expression:x, ')'                          = x;
 -> '-', factor:f                                  = -f;

// -- LEXICAL UNITS ------------------------------------
digit   = '0-9'
eof     = -1
letter = 'a-z'

(void) white space
 -> ' ' + '\t' + '\r' + '\f' + '\v'
 -> "/*", ~eof?..., "*/"

real
 -> integer part:i, '.', fraction part:f          = i+f;
 -> integer part, '.'?
 -> '.', fraction part:f                            = f;

integer part
 -> digit:d                                     = d-'0';
 -> integer part:x, digit:d              = 10*x + d-'0';

fraction part
 -> digit:d                                =(d-'0')/10.;
 -> digit:d, fraction part:f           =(d-'0' + f)/10.;

name
 -> letter: c           =n_chars = 0, name[n_chars++]=c;
 -> name, letter+digit: c            =name[n_chars++]=c;

{ /* -- EMBEDDED C ---------------------------------- */
  double value[64];                      /* registers */
  void main(void) {
    ffcalc();
  }
} // -- END OF EMBEDDED C ------------------------------