view examples/mpp/ct.syn @ 16:f9e4689b837d

Some minor updates for 15 years later.
author David A. Holland
date Tue, 31 May 2022 01:45:26 -0400
parents 13d2b8934445
children
line wrap: on
line source

{
/*
 * AnaGram, a System for Syntax Directed Programming
 * C Macro preprocessor
 * Token Classifier Module
 *
 * Copyright 1993-2000 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.
 */

#include "mpp.h"

}

// Configuration section

[
  // far tables                       // uncomment for 16 bit environment
 ~allow macros                        // to simplify debugging
  line numbers                        // put #line directives in parser
  //escape backslashes                // uncomment if using MSVC++
 ~diagnose errors                     // no diagnostics
  pointer input                       // input is an array in memory
 ~lines and columns                   // not needed
 ~test range                          // not needed
  default token type = token_id       // saves a lot of explicit defs
  parser file name = "#.cpp"
]

// Character set definitions

any text char = ~eof - '\\'
ascii         = 1..126 - eof
digit         = '0-9'
eof           = 0
hex digit     = '0-9' + 'A-F' + 'a-f'
letter        = 'a-z' + 'A-Z' + '_'
punctuation   = 1..126 -(letter + digit + '\'' + '"')
simple char   = ~eof - ('\'' + '\\' + '\n')
string char   = ~eof - ('"' + '\\' + '\n')


// C token grammar

grammar
 -> token, eof

token
 -> name string               =id_name();
 -> qualified real
 -> integer constant
 -> string literal            =STRINGliteral;
 -> character constant        =CHARACTERconstant;
 -> operator
 -> punctuation:p             =(token_id) p;

operator
 -> '&', '&'                  =ANDAND;
 -> '&', '='                  =ANDassign;
 -> '-', '>'                  =ARROW;
 -> '#', '#'                  =CONCAT;
 -> '-', '-'                  =DECR;
 -> '/', '='                  =DIVassign;
 -> '.', '.', '.'             =ELLIPSIS;
 -> '=', '='                  =EQ;
 -> '^', '='                  =ERassign;
 -> '>', '='                  =GE;
 -> '+', '+'                  =ICR;
 -> '<', '='                  =LE;
 -> '<', '<'                  =LS;
 -> '<', '<', '='             =LSassign;
 -> '%', '='                  =MODassign;
 -> '-', '='                  =MINUSassign;
 -> '*', '='                  =MULTassign;
 -> '!', '='                  =NE;
 -> '|', '='                  =ORassign;
 -> '|', '|'                  =OROR;
 -> '+', '='                  =PLUSassign;
 -> '>', '>'                  =RS;
 -> '>', '>', '='             =RSassign;


// Floating point number syntax

qualified real
 -> real constant, floating qualifier  =FLOATconstant;

real constant
 -> real

floating qualifier
 ->
 -> 'f' + 'F'
 -> 'l' + 'L'

real
 -> simple real
 -> simple real, exponent
 -> confusion, exponent
 -> decimal integer, exponent

simple real
 -> confusion, '.'
 -> octal integer, '.'
 -> decimal integer, '.'
 -> '.', '0-9'
 -> simple real, '0-9'

confusion
  -> octal integer, '8-9'
  -> confusion, '0-9'

exponent
  -> 'e' + 'E', '-', '0-9'
  -> 'e' + 'E', '+'?, '0-9'
  -> exponent, '0-9'


// Integer Constant Syntax

integer constant
 -> octal constant                          =OCTconstant;
 -> decimal constant                        =DECconstant;
 -> hex constant                            =HEXconstant;

octal constant
 -> octal integer
 -> octal constant, integer qualifier

octal integer
  -> '0'
  -> octal integer, '0-7'

hex constant
 -> hex integer
 -> hex constant, integer qualifier

hex integer
  -> '0', 'x' + 'X', hex digit
  -> hex integer, hex digit

decimal constant
 -> decimal integer
 -> decimal constant, integer qualifier

decimal integer
  -> '1-9'
  -> decimal integer, '0-9'

integer qualifier
  -> 'u' + 'U'
  -> 'l' + 'L'


// String Literals

string literal
  -> string chars, '"'

string chars
 -> '"'
 -> string chars, string char
 -> string chars, '\\', ~eof&~'\n'
 -> string chars, '\\', '\n'


// Character constants

character constant
 -> simple chars, '\''

simple chars
 -> '\''
 -> simple chars, simple char
 -> simple chars, '\\', ~eof&~'\n'
 -> simple chars, '\\', '\n'

(void) name string
  -> letter
  -> name string, letter+digit



{                                      // Embedded C

#define SYNTAX_ERROR                   // no diagnostic needed

static char *input_string;

/*

id_name() adds the string on the local string_accumulator to the token
dictionary and checks to see if the handle corresponds to a reserved
word. Otherwise the string is classified simply as a NAME

*/

static token_id id_name(void) {
  unsigned handle = td << input_string;
  token_id id;
  if (handle <= n_reserved_words) id = reserved_words[handle].id;
  else id = NAME;
  return id;
}

/*

classify_token() is an interface function for the grammar. It sets up
the pointer in the parser control block to point to the input string,
calls the parser, and returns the token_id determined by the parser if
there was no error, and returns "UNRECOGNIZED" if there was an error.

*/

token_id classify_token(char *string) {
  input_string = string;
  PCB.pointer = (unsigned char *) string;
  ct();
  return PCB.exit_flag == AG_SUCCESS_CODE ? ct_value() : UNRECOGNIZED;
}

}                                      // End of Embedded C