Mercurial > ~dholland > hg > ag > index.cgi
diff examples/fc/fc4a.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/fc4a.syn Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,81 @@ +/* + AnaGram Programming Examples + FC4A: Multiple Fahrenheit-Celsius conversion with signed numbers, + floating point arithmetic, optional white space, and Kelvin + temperature input. + + This grammar resolves the conflicts found in FC4. + + + 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 = "*.fc4" // 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); + } + -> unsigned number:k, 'k' + 'K' ={ /* P3a */ + double c = k - 273.16; + double f = 9*c/5 + 32; + printf("%.6g\370F = %.6g\370C = %.6g\370K\n", f, c, k); + } + -> error // P4 + +number + -> '-', unsigned number:n =-n; // P5 + -> '+', unsigned number:n =n; // P6x + -> unsigned number:n =n; // P6y + +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