Mercurial > ~dholland > hg > ag > index.cgi
diff anagram/agcore/cf.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/anagram/agcore/cf.syn Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,328 @@ +{ +/* + * AnaGram, A System for Syntax Directed Programming + * Copyright 1993-2002 Parsifal Software. All Rights Reserved. + * + * cf.syn - Configuration file module + */ + +#include "port.h" + +#include "agstring.h" +#include "assert.h" +#include "cf-defs.h" +#include "cint.h" +#include "config.h" +#include "configparam.h" +#include "error.h" +#include "file.h" +#include "operations.h" +#include "stacks.h" +#include "textfile.h" + +//#define INCLUDE_LOGGING +#include "log.h" +} + +[ + auto resynch + context type = cint + grammar token = config file + ~declare pcb + diagnose errors + lines and columns + line numbers + ~allow macros + line numbers + error frame + nest comments + ~test range + token names + pointer input + default token type = int + parser file name = "#.cpp" + line numbers path = "cf.syn" + escape backslashes +] + +any digit = digit + hex letter +backslash = '\\' +blank char = ' ' + '\t' +carriage return = '\r' +digit = '0-9' +double quote = '"' +eof = 0 + 26 +eol chars = newline + carriage return +hex letter = 'a-f' + 'A-F' +letter = 'a-z' + 'A-Z' + '_' +newline = '\n' +nonoctal digit = any digit - octal digit +octal digit = '0-7' +simple string char = ~eof - (any digit + double quote + backslash + eol chars) +tab = '\t' +vertical space = '\f' + '\v' + +equals + -> '=', space? + +minus + -> '-', space? + +plus + -> '+', space? + +tilde + -> '~', space? + +left parenthesis + -> '(', space? + +right parenthesis + -> ')', blank?... + + +config file + -> blank?..., [global parameter | end of line]/..., eof + +(void) global parameter + -> name =ConfigParam::set(1, cfErrorHandler); //cf_gp4(1); + -> tilde, name =ConfigParam::set(0, cfErrorHandler); //cf_gp4(0); + -> name, equals, data type =ConfigParam::set(cfErrorHandler); //cf_gp2(); + -> name, equals, keyword string =ConfigParam::set(cfErrorHandler); //cf_gp3(); + -> name, equals, number:n =ConfigParam::set(n, cfErrorHandler); //cf_gp5(n); + +(void) data type + -> name + -> name, abstract declarator =concat_string(); + +(void) abstract declarator + -> indirect data type + -> direct abstract declarator + -> indirect data type, direct abstract declarator =concat_string(); + + +(void) direct abstract declarator + -> {left parenthesis =scs('('),0;}, abstract declarator, + right parenthesis =concat_string(), acs(')'); + +(void) pointer + -> star + -> star, name =concat_string(); + +(void) star + -> '*', blank?... =sss(" *"); + +(void) indirect data type + -> pointer + -> indirect data type, pointer =concat_string(); + +(void) name string + -> letter:a =scs(a); + -> name string, letter + digit :a =acs(a); + -> name string, blank..., letter + digit :a =acs(' '), acs(a); + +name + -> name string, blank?... + +blank + -> blank char + -> c comment + +space + -> blank... + -> blank..., continuation + -> continuation + +continuation + -> comment, next line + -> next line + +next line + -> carriage return?, newline + -> carriage return?, newline, blank... + +white + -> blank + -> carriage return?, newline + -> comment, carriage return?, newline + +end of line + -> comment, carriage return?, newline + -> carriage return?, newline + -> end of line, white + -> end of line, vertical space //form feed + +comment + -> "//", ~eol chars & ~eof?... + +decimal number + -> '1-9':d =d - '0'; + -> decimal number:n, '0-9':d =10*n + d - '0'; + +octal number + -> '0' =0; + -> octal number:n, '0-7':d =8*n + d - '0'; + +hex number + -> "0x" =0; + -> "0X" =0; + -> hex number:n, '0-9':d =16*n + d - '0'; + -> hex number:n, 'A-F' + 'a-f':d =16*n + (d&7) + 9; + +simple number + -> decimal number + -> octal number + -> hex number + +number + -> sign:s, simple number:n, blank?... =s*n; + +sign + -> plus? =1; + -> minus =-1; + +keyword string + -> keyword string head, string, double quote, blank?... + +string + -> string A | string B | string C + +(void) keyword string head + -> double quote =ics(); + +string char + -> simple string char + -> escape sequence + +escape sequence + -> "\\a" ='\a'; + -> "\\b" ='\b'; + -> "\\f" ='\f'; + -> "\\n" ='\n'; + -> "\\r" ='\r'; + -> "\\t" ='\t'; + -> "\\v" ='\v'; + -> "\\\\" ='\\'; + -> "\\?" = '\?'; + -> "\\'" ='\''; + -> "\\\"" ='"'; + -> three octal:n =n==0?cf_error("Null character in string"),0 : n; + +one octal + -> backslash, '0-7':n =n&7; + +two octal + -> one octal:n, '0-7':d = n*8 + (d&7); + +three octal + -> two octal:n, '0-7':d = n*8 + (d&7); + +octal escape + -> {one octal | two octal}:n = + n==0?cf_error("Null character in string"),0 : n; + +hex escape + -> "\\x", hex number:n =n; + +(void) string A + -> string char:c =acs(c); + -> any digit:c =acs(c); + -> string, string char:c =acs(c); + -> string A, any digit:c =acs(c); + -> string B, nonoctal digit:c =acs(c); + +(void) string B + -> octal escape:n =acs(n); + -> string, octal escape:n =acs(n); + +(void) string C + -> hex escape:n =acs(n); + -> string, hex escape:n =acs(n); + +(void) c comment + -> c comment text, "*/" + +(void) c comment text + -> "/*" + -> c comment text, ~eof + +c comment, c comment text + -> c comment text, c comment = +{ if (nest_comments) PCB.reduction_token = cf_c_comment_text_token; } + +[ + hidden { + left parenthesis, right parenthesis, + pointer, indirect data type, name string, + space, next line, sign, one octal, two octal, three octal, + string A, string B, string C, c comment text, escape sequence, + octal escape, hex escape, name string + } +] + +{ + +#define PARSER_STACK_OVERFLOW assert(0) +#define REDUCTION_TOKEN_ERROR assert(0) +#define SYNTAX_ERROR cf_syn_error() +#define GET_CONTEXT CONTEXT.x = PCB.column, CONTEXT.y = PCB.line + +static void cf_error(const char *, int = 1); + +class CfErrorHandler : public ConfigParam::ErrorHandler { +public: + virtual ~CfErrorHandler() {} + virtual void badParam(const char *s){cf_error(s);} +} cfErrorHandler; + + + +static cf_pcb_type cfcb; +#define PCB cfcb + +static AgString config_file; + +static void read_one_config(const AgString &dir) { + LOGSECTION("read_one_config"); + LOGV(dir); + + char delim[2]; + delim[0] = PATH_DELIMITER; + delim[1] = 0; + + config_file = dir.concat(delim).concat("AnaGram.cfg"); + LOGV(config_file); + + text_file tf(config_file); + cfcb.pointer = input_base = (unsigned char *) tf; + if (input_base) cf(); +} + +void read_config(const AgString mydir) { + LOGSECTION("read_config"); + LOGV(mydir); + LOGV(work_dir_name); + + read_one_config(mydir); + read_one_config(work_dir_name); +} + +static void cf_error(const char *msg, int contextFlag) { + int line, column; + if (contextFlag) { + line = CONTEXT.y; + column = CONTEXT.x; + } + else { + line = PCB.line; + column = PCB.column; + } + errorList.push(Error(line, column, config_file, msg)); +} + +static void cf_syn_error(void) { + reset_stk(); + cf_error(PCB.error_message, 0); +} + +}