diff examples/fc/fc3.syn @ 0:13d2b8934445

Import AnaGram (near-)release tree into Mercurial.
author David A. Holland
date Sat, 22 Dec 2007 17:52:45 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/fc/fc3.syn	Sat Dec 22 17:52:45 2007 -0500
@@ -0,0 +1,72 @@
+/*
+ AnaGram Programming Examples
+ FC3: Multiple Fahrenheit-Celsius conversion with signed numbers,
+ floating point arithmetic, and optional white space.
+
+
+ Copyright 1993 Parsifal Software. All Rights Reserved.
+
+ This software is provided 'as-is', without any express or implied
+ warranty.  In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+    claim that you wrote the original software. If you use this software
+    in a product, an acknowledgment in the product documentation would be
+    appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+    misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+*/
+
+[
+  test file mask = "*.fc3"                                        // C1
+  traditional engine  /* turn this off for production use */      // C2
+  default token type = double                                     // C3
+  disregard white space                                           // C4
+  lexeme {unsigned number, end of line}                           // C5
+]
+
+eof = -1
+
+(void) grammar
+ -> [temperature?, end of line]..., eof                           // P1
+
+(void) temperature
+ -> number:c, 'c' + 'C' ={                                        /* P2 */
+                   double f = 9*c/5 + 32;
+                   printf("%.6g\370F = %.6g\370C = %.6g\370K\n",f,c,c+273.16);
+                 }
+ -> number:f, 'f' + 'F' ={                                        /* P3 */
+                   double c = 5*(f-32)/9;
+                   printf("%.6g\370F = %.6g\370C = %.6g\370K\n",f,c,c+273.16);
+                 }
+ -> error                                                         // P4
+
+number
+ -> '-', unsigned number:n        =-n;                            // P5
+ -> '+'?, unsigned number:n       =n;                             // P6
+
+unsigned number
+ -> integer, '.'?                                                 // P6a
+ -> integer:i, '.', fraction:f    =i+f;                           // P6b
+ -> '.', fraction:f               =f;                             // P6c
+
+integer
+ -> '0-9':d                       =d-'0';                         // P7
+ -> integer:n, '0-9':d            =10*n+d-'0';                    // P8
+
+fraction
+ -> '0-9':d                       =(d-'0')/10.;                   // P9
+ -> '0-9':d, fraction:f           =(d-'0' + f)/10.;               // P10
+
+white space
+ -> ' ' + '\t'                                                    // P11
+ -> "/*", ~eof?..., "*/"                                          // P12
+
+end of line
+ -> ["//", ~(eof + '\n')?...], '\n'                               // P13